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
创建表的语法
column_name_2 column_type_2 constraints,……column_name_n column_type_nconstraints)
其中
- column_name: 列的名字
- contraints:列的约束条件
(后面会详细说明建表的各种细节)
查看表定义语法
DESC tablename
查看创建表的SQL语句语法
SHOW CREATE TABLE tablename
删除表语法
DROP TABLE tablename
修改表类型类型语法
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]ALTER TABLE test_copy1 MODIFY id int(10)
添加表字段语法
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]ALTER TABLE test_copy1 ADD COLUMN description VARCHAR(256) AFTER id
删除表字段语法
ALTER TABLE tablename DROP [COLUMN] col_nameALTER TABLE test_copy1 DROP COLUMN description
修改表字段名语法
ALTER TABLE tablename CHANGE [COLUMN] old_col_name COLUMN_definition [FIRST | AFTER col_name]ALTER TABLE test_copy1 change description content VARCHAR(100)
修改字段排序顺序语法
上面提到的修改表字段名语法后面带有FIRST 和 AFTER,就是用来修改字段排序顺序的,默认情况下,新增加的字段是排在表的最后位置,CHANGE/MODIFY默认情况不会修改字段的位置。例如:将新增的字段des排在content的后面
ALTER TABLE test_copy1 ADD des VARCHAR(100) AFTER content
修改content字段,将其放到最前面
ALTER TABLE test_copy1 MODIFY content VARCHAR(100) FIRST
表名修改语法
ALTER TABLE tablename RENAME [TO] new_tablenameALTER TABLE test_copy1 RENAME test_copy
DML语句
概述
DML操作是对数据库中表的记录的操作,包括表记录的插入(insert)、更新(update)、删除(delete)、和查询(select)
插入记录语法
INSERT INTO tablename(field1,field2,......fieldn) VALUES(value1,value2,......valuesh);-- 插入一条记录INSERT INTO test_copy (content, des, create_time, update_time) VALUES ('插入记录', '第一条窝', '2021-10-12', '2021-10-12')-- 插入多条记录INSERT INTO test_copy (content, des, create_time, update_time) VALUES ('插入记录', '第二条窝', '2021-10-13', '2021-10-13'),('插入记录', '第三条窝', '2021-10-13', '2021-10-13'),('插入记录', '第四条窝', '2021-10-13', '2021-10-13'),('插入记录', '第五条窝', '2021-10-13', '2021-10-13')
更新记录语法
UPDATE tablename SET field1=value1, field2=value2, ......fieldn=valuen [WHERE CONDITION]-- 更新一条记录UPDATE test_copy SET content = '插入记录后更新记录'-- 同时更新两个表的记录(多表更新的语法更多地用在了根据一个表的字段,来动态的更新另外一个表的字段)UPDATE test t, test_copy tcSET t.create_time = tc.create_time,tc.update_time = t.update_timeWHERE t.id = tc.id
删除记录语法
DELETE FROM tablename [WHERE CONDITION]DELETE FROM test_copy WHERE id = 6
查询记录语法
-- 最基础的查询SELECT * FROM tablename [WHERE CONDITION]SELECT * FROM test_copy-- 查询不重复的记录SELECT DISTINCT des FROM test_copy-- 条件查询SELECT * FROM test_copy WHERE id = 8-- 排序/限制 DESC-降序 ASC-升序SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC], field2[DESC|ASC], ......fieldn [DESC|ASC]]SELECT * FROM test_copy ORDER BY id DESC-- 限制/分页SELECT ......[LIMIT offset_start, row_count]SELECT * FROM test_copy LIMIT 1SELECT * FROM test_copy LIMIt 2,2-- 聚合 fun_name-聚合函数(sum-求和、count(*)-记录数、max-最大值、min-最小值)、GROUP BY-要进行分类聚合的字段、WITH ROLLUP-可选语法,表示是否对分类聚合后的结果进行再汇总、SELECT [field1,field2,.....fieldn] fun_name FROM tablename [WHERE where_contition] [GROUP BY field1,field2,......fieldn [WITH ROLLUP]] [HAVING where_contition]-- 统计emp表中的公司总人数SELECT COUNT(1) FROM emp-- 在上面基础再统计各部门的人数SELECT deptno, count(1) FROM emp GROUP BY deptno-- 统计各部门人数和公司总人数SELECT deptno, count(1) FROM emp GROUP BY deptno WITH ROLLUP-- 统计人数大于1的部门SELECT deptno, count(1) FROM emp GROUP BY deptno HAVING count(1) > 1-- 统计公司所有员工的薪水总额、最高和最低薪水SELECT sum(sal), max(sal), min(sal) FROM emp-- 表连接SELECT * FROM test t, test_copy tc WHERE t.id = tc.id-- 左连接-包含所有的左边表中的记录,如果右边表没有匹配的记录则为空SELECT * FROM test t LEFT JOIN test_copy tc ON t.id = tc.id-- 右连接-包含所有的右边表中的记录,如果左边表没有匹配的记录则为空SELECT * FROM test t RIGHT JOIN test_copy tc ON t.id = tc.id-- 子查询SELECT *FROM test WHERE id IN (SELECT id FROM test_copy)-- 记录联合-UNION和UNION ALL的主要区别是UNION ALL把结果集直接合并,而UNION将UNION ALL后的结果集进行一次去重DISTINCTSELECT * FROM t1UNION | UNION ALLSELECT * FROM t2......UNION | UNION ALLSELECT * FROM tn;SELECT id, create_time, update_time, 'test' tablename FROM testUNION ALLSELECT id, create_time, update_time, 'test_copy' tablename FROM test_copySELECT id, create_time, update_time, 'test' tablename FROM testUNIONSELECT id, create_time, update_time, 'test_copy' tablename FROM test_copy
注意:HAVING和WHERE的区别在于HAVING是对聚合后的结果进行条件的筛选,而WHERE是在聚合前就对记录进行过滤,如果逻辑允许,尽量先用WHERE进行过滤再使用HAVING。
DCL语句
概述
用来管理数据库系统中的对象权限,详细的语法在后面的笔记中。
