【MySQL全套SQL语句完整归纳】DDL/DML/DCL/TCL语法规范、实战案例、易错点全整理】
1. 前言:SQL 四大分类整体概述
MySQL 中所有 SQL 语句按照功能划分为四大核心类别,是本学期课堂全部核心学习内容,数据库开发、运维、业务功能实现均围绕四类语句展开,下面通过表格清晰区分四类语言核心定位
本文整合课堂全部核心知识点、实战标准语法、避坑细节与完整可运行案例,适合期末复习、面试背诵、开发查阅,全文干货无废话,建议收藏。
2. DDL 数据定义语言(库、表、索引操作)
DDL 用于修改数据库、数据表、索引的结构,执行后会直接修改元数据,部分语句无法通过事务回滚,线上环境执行需要谨慎。
2.1 数据库操作语句
(1)创建数据库
标准语法:
sql
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARACTER SET 字符集] [DEFAULT COLLATE 排序规则];实战示例:
sql
-- 不存在则创建库,指定utf8mb4字符集(支持emoji表情) CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;使用规范 & 易错点
- 必须添加
IF NOT EXISTS,避免数据库已存在抛出异常; - 禁止使用 MySQL 原生
utf8,仅 3 字节编码无法存储表情符号; - 数据库名称不能以数字开头、不能使用 MySQL 保留关键字(如 user、order)。
(2)查看、切换、删除数据库
sql
-- 查询本机所有数据库 SHOW DATABASES; -- 切换至目标数据库,后续操作默认作用于该库 USE student_db; -- 查看当前正在使用的数据库 SELECT DATABASE(); -- 删除数据库,IF EXISTS防止库不存在报错 DROP DATABASE IF EXISTS student_db;⚠️ 踩坑提醒:DROP DATABASE会直接清空库内全部数据表与数据,生产环境禁止随意执行。
2.2 数据表操作语句
(1)创建数据表 CREATE TABLE
完整标准语法:
sql
CREATE TABLE [IF NOT EXISTS] 表名( 字段1 数据类型 约束条件 COMMENT '字段注释', 字段2 数据类型 约束条件 COMMENT '字段注释', 表级约束 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表注释';课堂实战学生表示例:
sql
CREATE TABLE IF NOT EXISTS student( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学生自增主键ID', stu_name VARCHAR(20) NOT NULL COMMENT '学生姓名,不能为空', age TINYINT DEFAULT 18 COMMENT '学生年龄,默认值18', class_id INT COMMENT '所属班级外键ID', create_time DATETIME DEFAULT NOW() COMMENT '数据创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';规范要求
- 存储引擎统一指定
InnoDB,唯一支持事务、外键约束;MyISAM 无事务能力; - 所有表、字段必须添加
COMMENT注释,便于后期维护阅读; AUTO_INCREMENT自增属性仅支持整数类型字段。
(2)修改表结构 ALTER TABLE
sql
-- 1.新增字段,指定插入在age字段后方 ALTER TABLE student ADD COLUMN email VARCHAR(50) AFTER age; -- 2.仅修改字段数据类型 ALTER TABLE student MODIFY COLUMN age SMALLINT; -- 3.修改字段名称+数据类型 ALTER TABLE student CHANGE COLUMN email stu_email VARCHAR(50); -- 4.删除指定字段 ALTER TABLE student DROP COLUMN stu_email; -- 5.修改数据表名称 ALTER TABLE student RENAME TO stu_info;⚠️ 易错点:百万级数据大表直接执行 ALTER 会触发全表锁表,阻塞业务读写,线上需使用在线改表工具。
(3)删除表 & 清空表数据
sql
-- 删除整张表,表结构+内部数据全部清除 DROP TABLE IF EXISTS student; -- 仅清空表内数据,重置自增主键ID TRUNCATE TABLE student;TRUNCATE 与 DELETE 核心区别
表格
| 对比项 | TRUNCATE | DELETE |
|---|---|---|
| 语句分类 | DDL 数据定义语言 | DML 数据操作语言 |
| 事务支持 | 不支持,无法回滚 | 支持事务,可 ROLLBACK 恢复 |
| 自增主键 | 清空后重置为 1 | 保留原有自增数值 |
| 执行效率 | 速度极快,不记录单行日志 | 逐条删除,大数据量效率低 |
2.3 索引操作语句
索引用于提升查询速度,但会降低插入、更新、删除性能,频繁修改的字段不建议建索引。
sql
-- 创建普通索引 CREATE INDEX idx_stu_name ON student(stu_name); -- 创建唯一索引(字段值全局不可重复) CREATE UNIQUE INDEX idx_stu_email ON student(email); -- 查看一张表全部索引 SHOW INDEX FROM student; -- 删除指定索引 DROP INDEX idx_stu_name ON student;3. DML 数据操作语言(增删改查核心实战)
DML 是业务开发使用频率最高的语句,针对表内数据进行操作,支持事务回滚,日常开发必须严格规范 WHERE 条件,避免全表操作。
3.1 INSERT 新增数据
sql
-- 指定字段单条插入 INSERT INTO student(stu_name,age) VALUES('张三',19); -- 批量插入(推荐写法,单次IO效率更高) INSERT INTO student(stu_name,age) VALUES('李四',20),('王五',18); -- 查询其他表数据,批量插入本表 INSERT INTO stu_back(stu_name,age) SELECT stu_name,age FROM student WHERE age>=18;易错点
- 字符串、日期类型数值必须包裹英文单引号;
- 批量插入单次数据不超过 1000 条,避免数据包超限报错;
- 自增主键字段无需手动赋值。
3.2 SELECT 查询语句(课堂重点,语法顺序固定不可颠倒)
完整标准语法顺序(考试高频考点)
sql
SELECT 要查询的字段列表 FROM 数据表 JOIN 关联表 ON 关联匹配条件 WHERE 行数据过滤条件 GROUP BY 分组统计字段 HAVING 分组后聚合过滤条件 ORDER BY 排序字段 [ASC/DESC] LIMIT 偏移量,展示条数;分层实战案例:
sql
-- 基础条件查询 SELECT id,stu_name,age FROM student WHERE age >= 18 AND class_id = 2; -- 分组统计,HAVING过滤分组结果 SELECT class_id,COUNT(*) stu_num FROM student GROUP BY class_id HAVING stu_num > 5; -- 分页查询:第1页,每页10条数据 SELECT * FROM student LIMIT 0,10; -- 多表内连接,查询学生对应班级名称 SELECT s.stu_name,c.class_name FROM student s INNER JOIN class c ON s.class_id = c.id;⚠️ 高频踩坑
- WHERE 子句不能使用 COUNT、SUM 等聚合函数,分组过滤必须写在 HAVING;
- 禁止日常开发使用
SELECT *,仅查询业务所需字段,减少 IO 开销; - LIMIT 偏移量过大时分页性能极差,推荐主键分页优化。
3.3 UPDATE 修改数据
语法规范:
sql
UPDATE 表名 SET 字段1=值1,字段2=值2 [WHERE 过滤条件];实战示例:
sql
UPDATE student SET age=20 WHERE id=1;💥 致命易错点:省略 WHERE 条件会更新全表所有数据,操作前必须先用 SELECT 校验过滤条件。
3.4 DELETE 删除数据
sql
DELETE FROM student WHERE id=1;注意事项
- 无 WHERE 条件会清空全表数据,事务内可回滚恢复;
- DELETE 不会重置自增主键;
- 大批量数据删除建议分批执行,避免长时间锁表。
| 分类 | 全称 | 核心作用 | 核心关键字 |
|---|---|---|---|
| DDL | 数据定义语言 | 创建 / 修改 / 删除数据库、数据表、索引,定义库表结构 | CREATE、ALTER、DROP、TRUNCATE |
| DML | 数据操作语言 | 针对表内数据完成新增、查询、修改、删除,业务开发核心 | INSERT、SELECT、UPDATE、DELETE |
| DCL | 数据控制语言 | 创建数据库登录用户、分配 / 回收访问权限,负责数据库安全 | CREATE USER、GRANT、REVOKE |
| TCL | 事务控制语言 | 保障多步数据操作一致性,管理事务提交、回滚(仅 InnoDB 支持) | BEGIN、COMMIT、ROLLBACK、SAVEPOINT |
4. DCL 数据控制语言(用户与权限管理)
DCL 用于管理数据库登录账号与访问权限,属于运维操作范畴,用于管控不同开发人员的数据访问范围。
4.1 创建、删除数据库用户
sql
-- 创建用户,%代表任意IP均可登录 CREATE USER 'school_user'@'%' IDENTIFIED BY '123456'; -- 删除指定用户 DROP USER IF EXISTS 'school_user'@'%';4.2 授权与回收权限
sql
-- 授予school_db库所有表全部操作权限 GRANT ALL ON school_db.* TO 'school_user'@'%'; -- 仅授予查询权限,限制修改、删除操作 GRANT SELECT ON school_db.* TO 'school_user'@'%'; -- 回收用户全部权限 REVOKE ALL ON school_db.* FROM 'school_user'@'%'; -- 刷新权限,使修改立即生效 FLUSH PRIVILEGES;⚠️ 易错点:权限修改后必须执行FLUSH PRIVILEGES,否则权限不生效;生产环境不建议使用%通配 IP,缩小访问范围保障数据库安全。
5. TCL 事务控制语言(仅 InnoDB 引擎支持)
事务用于保证一组 DML 操作要么全部执行成功,要么全部撤销,满足 ACID 四大特性,订单、转账、库存扣减等强一致性业务必须使用事务。
完整事务语法
sql
-- 开启事务 BEGIN; -- 执行数据修改操作 UPDATE student SET age=21 WHERE id=2; -- 创建保存点,支持局部回滚 SAVEPOINT save1; DELETE FROM student WHERE id=3; -- 回滚到保存点,仅撤销删除操作 ROLLBACK TO save1; -- 全部回滚,撤销所有未提交操作 ROLLBACK; -- 提交事务,数据永久写入数据库 COMMIT;使用规范
- MyISAM 引擎不支持事务;
- 事务内执行 CREATE、ALTER 等 DDL 语句会自动提交事务,造成数据错乱;
- 会话关闭未执行 COMMIT,事务会自动回滚,数据丢失。
6. 拓展语法:子查询、视图、聚合函数
6.1 子查询(IN/EXISTS)
sql
-- IN子查询:查询计算机1班全部学生 SELECT * FROM student WHERE class_id IN (SELECT id FROM class WHERE class_name='计算机1班');6.2 视图 VIEW(封装常用多表查询)
sql
-- 创建视图,封装学生+班级关联查询 CREATE VIEW v_stu_class AS SELECT s.*,c.class_name FROM student s LEFT JOIN class c ON s.class_id=c.id; -- 调用视图查询 SELECT * FROM v_stu_class; -- 删除视图 DROP VIEW IF EXISTS v_stu_class;6.3 常用聚合函数
COUNT()统计行数、SUM()求和、AVG()平均值、MAX()最大值、MIN()最小值
sql
-- 统计班级学生总数、平均年龄 SELECT class_id,COUNT(*) total,AVG(age) avg_age FROM student GROUP BY class_id;7. 全语句高频易错点汇总(个人学习踩坑总结)
DDL 类踩坑
- 建表忘记指定 InnoDB 引擎,后续无法使用事务、外键;
- 库名、表名使用中文、关键字,直接触发语法报错;
- 线上大表直接执行 ALTER,长时间锁表阻塞业务读写。
DML 类踩坑
- UPDATE/DELETE 遗漏 WHERE 条件,全表数据被批量修改 / 删除;
- 查询使用
SELECT *,读取大量无用字段降低查询速度; - 批量 INSERT 一次性写入上万条数据,触发数据包溢出报错。
TCL 事务踩坑
- 事务中执行建表、改表 DDL 语句,自动提交事务导致数据错乱;
- 操作完成忘记 COMMIT,关闭会话后数据全部丢失。
DCL 权限踩坑
- 用户登录地址设置为
%,存在数据库入侵安全风险; - 授权后未执行 FLUSH PRIVILEGES,新权限不生效。
8. 综合实战:学生管理系统完整可运行 SQL 脚本
整合建库、建表、插入、关联查询、事务完整代码,本地 Navicat 可直接复制执行复现:
sql
-- 1.创建数据库 CREATE DATABASE IF NOT EXISTS school_db DEFAULT CHARSET utf8mb4; USE school_db; -- 2.创建班级表 CREATE TABLE class( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '班级id', class_name VARCHAR(30) NOT NULL COMMENT '班级名称' ) ENGINE=InnoDB COMMENT='班级信息表'; -- 3.创建学生表 CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, stu_name VARCHAR(20) NOT NULL, age TINYINT DEFAULT 18, class_id INT ); -- 4.插入测试数据 INSERT INTO class(class_name) VALUES('计算机1班'),('计算机2班'); INSERT INTO student(stu_name,age,class_id) VALUES('小明',19,1),('小红',18,2); -- 5.多表关联查询 SELECT s.stu_name,c.class_name FROM student s JOIN class c ON s.class_id=c.id; -- 6.事务修改学生年龄 BEGIN; UPDATE student SET age=20 WHERE id=1; COMMIT;9. 个人学习复盘、现存疑问与提升计划
学习收获
- 完整梳理课堂全部 SQL 语句,清晰区分 DDL/DML/DCL/TCL 四大类语言核心用途;
- 彻底分清 TRUNCATE、DELETE、DROP 三者本质区别,规避线上删库删表风险;
- 掌握事务 ACID 四大特性,能够在订单、转账场景合理使用事务保证数据一致性;
- 明确自身薄弱板块:复杂多表联查、索引优化、慢 SQL 调优掌握不足,后续重点练习 Explain 执行计划。
现存学习疑问
- 百万级大数据表分页查询,如何优化 LIMIT 大偏移量带来的性能问题?
- 联合索引遵循最左匹配原则,遇到范围查询时索引失效有什么解决方案?
- 线上大表如何无锁执行 ALTER 修改表结构,避免阻塞线上业务?
后续提升计划
- 系统学习 Explain 执行计划,分析慢查询根源;
- 实操联合索引、覆盖索引优化案例;
- 学习 pt-online-schema-change 在线改表工具,解决大表 DDL 锁表问题。
10. 参考官方文档
- MySQL 8.0 官方开发文档:https://dev.mysql.com/doc/
- MySQL 中文开发手册
- CSDN 数据库实训专栏实战教程
