您的位置:首页 > 数据库 > MySQL

MySql的DDL、DQL、DML三种语言小结

2020-07-12 17:18 155 查看

本人初学小结,不足和漏洞之处欢迎指出!

MySql的DDL、DQL、DML三种语言小结

  • 2、DROP
  • 3、ALTER
  • 主外键约束
  • 外键约束
  • DML(数据库操作语言)
  • 2、UPDATE
  • 3、DELETE
  • DQL(数据库查询语言)
  • 2、字符串函数
  • 3、日期时间函数
  • 4、数学函数
  • 5、辨析 NOW() 与 SYSDATE()
  • 2、SELECT
  • 2.2、排序查询 ORDER BY
  • 2.3、限制查询 LIMIT
  • 2.4、函数查询
  • 2.5、分组查询
  • 2.6、连接查询
  • 2.7、子查询类
  • 2.8、联合查询
  • 3、全查询各语句顺序
  • DDL(数据库定义语言)

    1、CREATE

    字段列的属性

    • 数据类型(数据长度)
    • COMMENT 字段描述
    • Not null 非空
    • default 默认
    • unsigned 无符号,无符号(0以上的)
    • primary key (Key) 主键
    • auto_increment 自增长(标识列)
    • 注意无符号的被勾选了之后,zerofill也会自动勾选
    • 空值有NULL和None之分:NULL占了空间但内容是空的,None没有内容也不占空间

    创表

    CREATE TABLE `table`(
    `id` INT(4) KEY COMMENT '编号' unsinged
    );

    创库

    CREATE DATABASE `mysqldatabase`;

    2、DROP

    删表

    DROP TABLE `table`;

    删库

    DROP DATABASE `mysqldatabase`;

    3、ALTER

    修改表名

    ALTER TABLE `test_DDL`
    RENAME `tb_DDL`;

    添加列

    ALTER TABLE `tb_DDL`
    ADD `jiu` INT(4) NOT NULL;

    修改列类型

    ALTER TABLE `tb_DDL`
    CHANGE `jiu` `jiu1` VARCHAR(4) NOT NULL;

    删除列

    ALTER TABLE `tb_DDL`
    DROP  id;

    添加索引

    唯一索引

    ALTER TABLE 'table_name'
    ADD UNIQUE(name);

    全文索引

    ALTER TABLE 'table_name'
    ADD FULLTEXT(name);

    普通索引

    ALTER TABLE 'table_name'
    ADD INDEX(name);

    主外键约束

    主键约束

    创建语法:
    ALTER TABLE 表名
    ADD CONSTRAINT 主键约束名称
    PRIMARY KEY 表名(表列名);
    示例:
    ALTER TABLE `student1`
    ADD CONSTRAINT `pk_st1_key`
    PRIMARY KEY student1(id);
    联合主键
    ALTER TABLE `student1`
    ADD CONSTRAINT `pk_st1_key`
    PRIMARY KEY (`id`,`name`);
    删除主键
    ALTER TABLE 表名
    DROP PRIMARY KEY ;

    外键约束

    创建语法:
    ALTER TABLE 外表名
    ADD CONSTRAINT 外键约束名称
    FOREIGN KEY (外表列名)
    REFERENCES 主表名(主表列名);
    示例:
    ALTER TABLE student1
    ADD CONSTRAINT `fk_student1_grade`
    FOREIGN KEY (gradeId)
    REFERENCES grade(id);
    删除外键
    ALTER TABLE 外表名
    DROP FOREIGN KEY 外键约束名称;
    示例
    ALTER TABLE student1
    DROP FOREIGN KEY `fk_student1_grade`;
    注意:
    • 1、引用的两个表列都要保持一致对应 1.1 数据类型和大小
    • 1.2 主键和主键个数和列段
  • 2、外键约束命名和主键约束命名
      虽然可以随便取,但还是尽量遵照
      主键 pk_表名_主键字段
      外键 fk_外表名_主表名

    DML(数据库操作语言)

    CREATE TABLE `student1` (
    `gradeId` int(4) NOT NULL COMMENT '编号',
    `name` varchar(20) NOT NULL COMMENT '姓名',
    `age` int(3) NOT NULL DEFAULT '18',
    PRIMARY KEY (`gradeId`)
    )

    1、INSERT

    向表插入数据

    通用语法

    INSERT INTO 表名
    VALUE (表列1的值,表列2的值,表列3的值,...);

    示例

    单条
    INSERT INTO student1
    VALUE (0,'zhangsan',18);
    多条
    INSERT INTO student1
    VALUE (0,'张三',18),(1,'李四',19),(3,'王二',20),(4,'麻子',21);

    2、UPDATE

    更新数据

    通用语法

    UPDATE 表名
    SET 列名新制
    WHERE 限制条件;

    示例

    单个列段
    UPDATE student1
    SET age = 22
    WHERE NAME = '张三';
    多个列段
    UPDATE student1
    SET age = 22,name = '张三1'
    WHERE NAME = '张三';

    3、DELETE

    删除表数据

    通用语法

    • 第一种 :可加条件删除
      DELETE FROM 表名
      WHERE 删除条件;
    • 第二种:清空表中全部数据
      TRUNCATE TABLE 表名;

    示例

    • 第一种
      DELETE FROM student1
      WHERE gradeId = 0;
    • 第二种
      TRUNCATE TABLE student1;

    两者区别

    • TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快
    • 站外扩展参考

    https://www.cnblogs.com/zjoch/p/4002138.html

    DQL(数据库查询语言)

    1、函数

    1、聚合函数

    • 总体概述:除统计函数不忽略空值字段,其他均忽略, 统计函数除了可统计某一具体字段出现的次数。还可以使用 * 统计全表有多少行数据
  • 通用语法:SELECT 函数名(字段名) FROM 表名;
  • 1.1、AVG() :用于求平均值

    1.2、SUM() :用于求某列值总和值

    1.3、MAX() :用于求某列最大值

    1.4、MIN() :用于求某列 最小值

    1.5、COUNT() :用于统计某列存在次数值

    2、字符串函数

    2.1、拼接函数:CONCAT()

    • 示例:CONCAT(‘字符串1’,‘字符串2’,‘字符串3’,’…’,‘字符串n’);
    • 运行结果:字符串1字符串2字符串3…字符串n

    2.2、大小写转换函数:UPPER(),LOWER()

    • 示例:SELECT UPPER(‘MySql’) AS
      大写
      ,LOWER(‘MySql’)AS
      小写
      ;
    • 运行结果:MYSQL mysql

    - 注意:以下语句中的下标从 1 开始计数**

    2.3、替换函数:INSERT(‘被替换的字符串’,开始替换的下标,替换结束的下标,‘要替换的文字’)

    • 示例:SELECT INSERT (‘这是SQL Server数据库’,3,10,‘这是MySql数据库’) AS
      替换结果
      ;
    • 运行结果:这是这是MySql数据库数据库

    2.4、截取函数:SUBSTRING(‘要截取的字符串’,开始截取得下标,要截取几个字符)

    • 示例:SELECT SUBSTRING(‘JavaMySqlOracle’,5,5);
    • 运行结果:MySql

    3、日期时间函数

    通用语法:SELECT 时间日期函数名();

    3.1、当前日期函数:CURDATE()
    • 示例:SELECT CURDATE() AS
      当前日期
      ;
    3.2、当前时间函数:CURTIME()
    • 示例:SELECT CURTIME() AS
      当前时间
      ;
    3.3、语句开始执行的时间函数:NOW()
    • 示例:SELECT NOW() AS

      当前日期和时间
      ;

    • 通用语法:SELECT 下列函数名(‘传入日期时间’); 或者 SELECT 下列函数名(NOW()) ;

    3.4、年份函数: YEAR(NOW())
    示例:SELECT YEAR('2017-09-11 11:00:00')AS '传入时间的年份';
    3.5、月份函数:MONTH(NOW())
    示例:SELECT MONTH(NOW()) AS '传入时间的月份';
    3.6、日数函数:MONTH(NOW())
    示例:SELECT DAY('2017-09-11 11:00:00') AS '传入时间的日数';
    3.7、周期函数: WEEK(NOW())
    示例:SELECT WEEK(‘2020-05-01’) AS ‘传入日期(7天一周)是第几周’;
    3.8、小时函数:HOUR()
    示例:SELECT HOUR(NOW())  AS '传入时间的小时数';
    3.9、分钟函数:MINUTE()
    示例:SELECT MINUTE(NOW())  AS '传入时间的分钟数';
    3.10、日期差隔函数:DATEDIFF(‘startDate’,‘endDate’)
    示例:SELECT DATEDIFF(NOW(),'2008-8-8')AS '两个传入时间的天数差';
    3.11、时间差隔函数:TIMEDIFF(start,end)
    注意可传入的可以是日期也可以是时间,返回是 00:00:00的格式
    示例:SELECT TIMEDIFF('04:40','04:30');
    结果:00:10:00
    示例:SELECT TIMEDIFF('2020-05-01 12:00:00','2020-05-01 10:00:00')
    结果:02:00:00
    3.12、两日期时间差值据属性定义返回类型:TIMESTAMPDIFF(属性,end,start)
    • 年 YEAR
    • 月 MONTH
    • 日 DAY
    • 周 WEEK
    • 季度 QUARTER
    • 小时 HOUR
    • 分钟 MINUTE
    • 秒 SECOND
    • 毫秒 FRAC_SECOND
    • 示例:SELECT TIMESTAMPDIFF(HOUR,‘2020-05-01 10:00:00’,‘2020-05-01 12:00:00’);
    • 结果:2
    • 其他补充参考外站:

    https://blog.csdn.net/zmxiangde_88/article/details/8011661

    3.13、查询几天后的日期函数:ADDDATE(‘原日期’,增加几天);
    • 示例:SELECT ADDDATE(NOW(),5) AS ‘几天后的日期’;
    其他函数
    3.14、睡眠函数:SLEEP( 睡眠时间(s) )
    • 示例:SELECT SLEEP(3);
    3.15、动态实时时间函数:SYSDATE()
    • 示例:SELECT SYSDATE();

    4、数学函数

    4.1、CELL(X) 返回大于或等于数值X的最小整数函数
    • 示例:SELECT CELL(2,3);
    • 结果:返回 3
    4.2、FLOOR(X) 返回小于或等于数值X的最小整数函数
    • 示例:SELECT FLOOR(2,3);
    • 结果:返回 2
    4.3、RAND() 返回0~1间的随机小数
    • 示例:SELECT RAND();
    • 结果:返回 0.5525468583708134

    5、辨析 NOW() 与 SYSDATE()

    • 示例:SELECT NOW(),SYSDATE(); 结果:2020-05-01 11:38:09,2020-05-01 11:38:09
    • 初看结果两者好像一样,但两个是有不同的,前者是语句开始执行时的时间,后者时当前系统实时时间
      我们可以采用 随眠函数来检验下
  • 举例:
      SELECT
      NOW(),
      SYSDATE(),
      SLEEP(3),
      NOW(),
      SYSDATE();
  • 查询结果:
      2020-05-01 11:41:57
      2020-05-01 11:41:57
      0
      2020-05-01 11:41:57
      2020-05-01 11:42:00

    其他扩展参考外网:

    https://www.cnblogs.com/pcheng/p/6004679.html

    2、SELECT

    2.1、条件查询 WHERE

    单值查询

    SELECT * FROM 表名
    WHERE 查询条件;

    多值查询

    SELECT * FROM 表名
    WHERE in 查询条件;

    查询条件说明

    • 大小:>、<、>=、<=、!=等多种比较运算符,
    • 连接:AND OR NOT 等逻辑运算符
    • 大范围限制:BETWEEN…AND…闭区间(左右都取等号)

    LIKE查询:

    精准查询 ‘确认值’,’_’
    SELECT * FROM 表名
    WHERE 表列名 LIKE '表列值'

    或 _

    • 张姓(限制2个字的名字)
    SELECT * FROM student1 AS a
    WHERE a.name LIKE '张_'
    模糊查询 % [] [^]
    • 张姓(不限字符长)
    SELECT * FROM student1 AS a
    WHERE a.name LIKE '张%'
    • 以 133、137 开头或中间包含的号码
    SELECT * FROM grade AS b
    WHERE  b.phone LIKE '%13[3,7]%';
    • [^] 则不包含以 133、137 开头或中间包含的号码
    SELECT * FROM grade AS b
    WHERE  b.phone LIKE '%13[^3,7]%';

    2.2、排序查询 ORDER BY

    • 排序参数 [DESC(倒序),ASC(正序)]
    SELECT * FROM 表名
    ORDER BY 排序参数;

    2.3、限制查询 LIMIT

    • 限制参数 1、单参 前几条数据
    • 2、双参 数据开始显示下标,显示几条数据
    SELECT * FROM 表名
    LIMIT 限制参数;

    2.4、函数查询

    SELECT 函数名(字段名)
    FROM 表名;

    2.5、分组查询

    • 有几组则有几行
    • 分组条件 可填函数||可填普通值判定条件
    SELECT * FROM 表名
    GROUP BY 表列名
    HAVING 分组条件;

    2.6、连接查询

    • 参数1 in [ 不填(直接内联) | LEFT(左联,左表为主) | RIGHT(右联,右表为主) ]
    INNER 参数1 JOIN 表名2 ON 连接条件

    2.7、子查询类

    2.7.1、子查询

    • 以另一个查询结果作为查询条件
    • 示例:
    SELECT a.age FROM student1 AS a
    WHERE a.gradeId = (SELECT a.gradeId FROM student1 AS a
    WHERE a.name = '张三1' );

    2.7.2、IN子查询

    • 子查询返回不止1个值时,采用IN的子查询返回多个值的情况
    • 示例:
    SELECT `studentName` FROM `student`
    WHERE `studentNo` IN(
    SELECT `studentNo` FROM `result`
    WHERE `subjectNo` =  (
    SELECT `subjectNo` FROM `subject`
    WHERE `subjectName`='Logic Java'
    )AND `studentResult` = 60
    );

    2.7.3、NOT IN 子查询

    • 查询不在返回多个值的情况
    SELECT `studentNo`, `studentName` FROM `student` WHERE `studentNo`
    NOT IN(
    SELECT `studentNo` FROM `result`
    WHERE `subjectNo` = (
    SELECT `subjectNo` FROM `subject`
    WHERE `subjectName`='Logic Java'
    ) AND `examDate` = (
    SELECT MAX(`examDate`) FROM `result`  WHERE `subjectNo` = (
    SELECT `subjectNo` FROM `subject`
    WHERE `subjectName`='Logic Java')
    )
    )……

    2.7.4、EXISTS子查询

    2.8、联合查询

    • 把多个查询结果合并起来
    • 列名总显示第一个查询语句列名,默认清除重复项,union all不去重
    SELECT * FROM student1
    UNION SELECT * FROM grade
    • 结果:

    3、全查询各语句顺序

    语法:

    SELECT *
    FROM 表名1
    INNER 参数1 JOIN 表名2 ON 连接条件WHERE 条件
    GROUP BY 列字段
    HAVING 分组条件
    ORDER BY 列字段 序参数
    LIMIT 参数;
    

    示例:

    创表赋值

    # 创建 student 表
    CREATE TABLE `student` (
    `gradeId` int(4) NOT NULL COMMENT '编号',
    `name` varchar(20) NOT NULL COMMENT '姓名',
    `age` int(3) NOT NULL DEFAULT '18',
    PRIMARY KEY (`gradeId`)
    )
    INSERT INTO student
    VALUE (0,'张三',18),(1,'李四',21),(2,'王二',18),(3,'麻子',21)
    
    # 创建 grade 表
    CREATE TABLE `grade` (
    `id` int(4) NOT NULL COMMENT '编号',
    `address` varchar(50) NOT NULL DEFAULT '暂不方便透露' COMMENT '地址',
    `phone` varchar(100) NOT NULL DEFAULT '暂不方便透露' COMMENT '号码',
    KEY `fk_st_grade` (`id`)
    );
    INSERT INTO grade
    VALUE (1,'长沙','13312345678'),(2,'长沙2','13712345678'),(3,'长沙3','13912345678'),

    示范:

    SELECT a.gradeId,a.name,a.age,b.address,b.phone
    FROM student AS a
    INNER  JOIN grade AS b ON a.gradeId = b.id
    WHERE age > 18
    GROUP BY a.gradeId
    HAVING SUM(a.age) > 10
    ORDER BY a.age DESC
    LIMIT 0,3;

    结果:

    复习日期:2020/04/30
    完成时间:2020/05/04
    其他扩展参考外网:

    https://www.cnblogs.com/songyifan427/p/10078467.html

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: