SQL分类

DDL(Data Definition Languages)语句:

数据定义语言

这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括create、drop、alter等。

DML(Data Manipulation Language)语句:

数据操纵语句

用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、udpate和select等。

DCL(Data ControlLanguage)语句

数据控制语句

用于控制不同数据段直接的许可和
访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。


DDL语句

概述

简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。

创建数据库命令

CREATE DATABASE dbname

查看所有的数据库命令

SHOW DATABASES

除了我们自定义的数据库外,还有另外4个安装MySQL时自动创建的数据库,对应如下:

  • infomation_schema: 主要存储了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息,分区信息等等。
  • cluster:存储了系统的集群信息。
  • mysql:存储了系统的用户权限信息。
  • test:系统自动创建的测试数据库,任何用户都可以使用

选择要操作的数据库语法

USE dbname

查看某个数据库中创建的所有数据表语法

SHOW TABLES

删除数据库语法

DROP DATABASE dbname

创建表的语法

  1. column_name_2 column_type_2 constraints,……column_name_n column_type_n
  2. constraints

其中

  • column_name: 列的名字
  • contraints:列的约束条件

(后面会详细说明建表的各种细节)

查看表定义语法

DESC tablename

查看创建表的SQL语句语法

SHOW CREATE TABLE tablename

删除表语法

DROP TABLE tablename

修改表类型类型语法

  1. ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
  2. ALTER TABLE test_copy1 MODIFY id int(10)

添加表字段语法

  1. ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
  2. ALTER TABLE test_copy1 ADD COLUMN description VARCHAR(256) AFTER id

删除表字段语法

  1. ALTER TABLE tablename DROP [COLUMN] col_name
  2. ALTER TABLE test_copy1 DROP COLUMN description

修改表字段名语法

  1. ALTER TABLE tablename CHANGE [COLUMN] old_col_name COLUMN_definition [FIRST | AFTER col_name]
  2. ALTER TABLE test_copy1 change description content VARCHAR(100)

修改字段排序顺序语法

上面提到的修改表字段名语法后面带有FIRST 和 AFTER,就是用来修改字段排序顺序的,默认情况下,新增加的字段是排在表的最后位置,CHANGE/MODIFY默认情况不会修改字段的位置。例如:将新增的字段des排在content的后面

  1. ALTER TABLE test_copy1 ADD des VARCHAR(100) AFTER content

修改content字段,将其放到最前面

  1. ALTER TABLE test_copy1 MODIFY content VARCHAR(100) FIRST

表名修改语法

  1. ALTER TABLE tablename RENAME [TO] new_tablename
  2. ALTER TABLE test_copy1 RENAME test_copy

DML语句

概述

DML操作是对数据库中表的记录的操作,包括表记录的插入(insert)、更新(update)、删除(delete)、和查询(select)

插入记录语法

  1. INSERT INTO tablename(field1,field2,......fieldn) VALUES(value1,value2,......valuesh);
  2. -- 插入一条记录
  3. INSERT INTO test_copy (content, des, create_time, update_time) VALUES ('插入记录', '第一条窝', '2021-10-12', '2021-10-12')
  4. -- 插入多条记录
  5. INSERT INTO test_copy (content, des, create_time, update_time) VALUES ('插入记录', '第二条窝', '2021-10-13', '2021-10-13'),
  6. ('插入记录', '第三条窝', '2021-10-13', '2021-10-13'),
  7. ('插入记录', '第四条窝', '2021-10-13', '2021-10-13'),
  8. ('插入记录', '第五条窝', '2021-10-13', '2021-10-13')

更新记录语法

  1. UPDATE tablename SET field1=value1, field2=value2, ......fieldn=valuen [WHERE CONDITION]
  2. -- 更新一条记录
  3. UPDATE test_copy SET content = '插入记录后更新记录'
  4. -- 同时更新两个表的记录(多表更新的语法更多地用在了根据一个表的字段,来动态的更新另外一个表的字段)
  5. UPDATE test t, test_copy tc
  6. SET t.create_time = tc.create_time,
  7. tc.update_time = t.update_time
  8. WHERE t.id = tc.id

删除记录语法

  1. DELETE FROM tablename [WHERE CONDITION]
  2. DELETE FROM test_copy WHERE id = 6

查询记录语法

  1. -- 最基础的查询
  2. SELECT * FROM tablename [WHERE CONDITION]
  3. SELECT * FROM test_copy
  4. -- 查询不重复的记录
  5. SELECT DISTINCT des FROM test_copy
  6. -- 条件查询
  7. SELECT * FROM test_copy WHERE id = 8
  8. -- 排序/限制 DESC-降序 ASC-升序
  9. SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC], field2[DESC|ASC], ......fieldn [DESC|ASC]]
  10. SELECT * FROM test_copy ORDER BY id DESC
  11. -- 限制/分页
  12. SELECT ......[LIMIT offset_start, row_count]
  13. SELECT * FROM test_copy LIMIT 1
  14. SELECT * FROM test_copy LIMIt 2,2
  15. -- 聚合 fun_name-聚合函数(sum-求和、count(*)-记录数、max-最大值、min-最小值)、GROUP BY-要进行分类聚合的字段、WITH ROLLUP-可选语法,表示是否对分类聚合后的结果进行再汇总、
  16. SELECT [field1,field2,.....fieldn] fun_name FROM tablename [WHERE where_contition] [GROUP BY field1,field2,......fieldn [WITH ROLLUP]] [HAVING where_contition]
  17. -- 统计emp表中的公司总人数
  18. SELECT COUNT(1) FROM emp
  19. -- 在上面基础再统计各部门的人数
  20. SELECT deptno, count(1) FROM emp GROUP BY deptno
  21. -- 统计各部门人数和公司总人数
  22. SELECT deptno, count(1) FROM emp GROUP BY deptno WITH ROLLUP
  23. -- 统计人数大于1的部门
  24. SELECT deptno, count(1) FROM emp GROUP BY deptno HAVING count(1) > 1
  25. -- 统计公司所有员工的薪水总额、最高和最低薪水
  26. SELECT sum(sal), max(sal), min(sal) FROM emp
  27. -- 表连接
  28. SELECT * FROM test t, test_copy tc WHERE t.id = tc.id
  29. -- 左连接-包含所有的左边表中的记录,如果右边表没有匹配的记录则为空
  30. SELECT * FROM test t LEFT JOIN test_copy tc ON t.id = tc.id
  31. -- 右连接-包含所有的右边表中的记录,如果左边表没有匹配的记录则为空
  32. SELECT * FROM test t RIGHT JOIN test_copy tc ON t.id = tc.id
  33. -- 子查询
  34. SELECT *FROM test WHERE id IN (SELECT id FROM test_copy)
  35. -- 记录联合-UNIONUNION ALL的主要区别是UNION ALL把结果集直接合并,而UNIONUNION ALL后的结果集进行一次去重DISTINCT
  36. SELECT * FROM t1
  37. UNION | UNION ALL
  38. SELECT * FROM t2
  39. ......
  40. UNION | UNION ALL
  41. SELECT * FROM tn;
  42. SELECT id, create_time, update_time, 'test' tablename FROM test
  43. UNION ALL
  44. SELECT id, create_time, update_time, 'test_copy' tablename FROM test_copy
  45. SELECT id, create_time, update_time, 'test' tablename FROM test
  46. UNION
  47. SELECT id, create_time, update_time, 'test_copy' tablename FROM test_copy

注意:HAVING和WHERE的区别在于HAVING是对聚合后的结果进行条件的筛选,而WHERE是在聚合前就对记录进行过滤,如果逻辑允许,尽量先用WHERE进行过滤再使用HAVING。


DCL语句

概述

用来管理数据库系统中的对象权限,详细的语法在后面的笔记中。