MySQL全量SQL语句超全整理|语法规范、实战案例、易错点避坑大全(零基础可收藏)
MySQL 全量 SQL 语句超全整理|语法规范、实战案例、易错点避坑大全(零基础可收藏)
文章标签:#MySQL #SQL 数据库 #数据库基础 #SQL 实战 #数据库期末复习
文章分类:MySQL 数据库技术
阅读时长:20 分钟
原创声明:本文为课堂学习原创总结,参考 MySQL8.0 官方开发文档,所有案例本地测试可复现,无抄袭搬运。
文章目录
前言
前置基础:SQL 四大分类总览
一、DDL 数据定义语言(库 / 表结构操作)
数据库操作语句
(1)创建数据库 CREATE DATABASE
(2)查看数据库 SHOW DATABASES
(3)切换数据库 USE
(4)删除数据库 DROP DATABASE
数据表操作语句
(1)建表 CREATE TABLE
(2)查看表结构
(3)修改表 ALTER TABLE
(4)删除表 DROP TABLE
(5)清空表 TRUNCATE TABLE
二、DML 数据操作语言(开发最常用)
查询 SELECT(核心重点)
新增 INSERT
修改 UPDATE
删除 DELETE
三、拓展实战:学生管理系统完整业务 SQL
三表设计(学生 + 班级 + 成绩)
多表联查实战
事务实战(模拟转账)
四、DCL 数据控制语言(权限、用户管理)
创建用户 CREATE USER
分配权限 GRANT
回收权限 REVOKE
刷新权限 FLUSH PRIVILEGES
删除用户 DROP USER
五、TCL 事务控制语句(InnoDB 引擎专用)
核心语法
应用场景
易错点
六、高频报错大全(100% 复现课堂错误)
七、学习总结:个人薄弱点与解决方案
前期踩坑问题
改进学习方案
长期强化计划
八、文末思考疑问(拓展学习)
参考文献(MySQL 8.0 官方文档)
前言
本学期系统学习 MySQL 数据库技术,覆盖 DDL、DML、DCL、TCL 四大类全部 SQL 语句,课堂实操踩过大量语法坑、逻辑错误。本文完整梳理所有 MySQL 标准 SQL 语句,统一语法规范、划分应用场景、附可运行 SQL 实例、标注高频易错点,同时记录个人学习短板与解决思路,适合期末复习、开发速查,满足课程博客作业全部要求。
前置基础:SQL 四大分类总览
MySQL 所有 SQL 语句分为 4 大类,功能边界清晰,是学习核心框架:
表格
分类 全称 核心作用 包含语句
DDL 数据定义语言 库、表、字段结构管理 CREATE、ALTER、DROP、TRUNCATE、RENAME
DML 数据操作语言 表内数据增删改查 SELECT、INSERT、UPDATE、DELETE
DCL 数据控制语言 用户、权限管理 CREATE USER、GRANT、REVOKE、DROP USER、FLUSH PRIVILEGES
TCL 事务控制语言 事务提交回滚 START TRANSACTION、COMMIT、ROLLBACK、SAVEPOINT
一、DDL 数据定义语言(库 / 表结构操作)
- 数据库操作语句
(1)创建数据库 CREATE DATABASE
标准语法
sql
CREATE DATABASE [IF NOT EXISTS] 库名
[DEFAULT CHARACTER SET 字符集]
[DEFAULT COLLATE 排序规则];
应用场景:新项目初始化,创建独立业务数据库
实战示例
sql
– 创建学生库,不存在才创建,指定utf8mb4完整中文编码
CREATE DATABASE IF NOT EXISTS student_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
使用规范 & 易错点
IF NOT EXISTS 必须加,重复创建数据库会直接报错;
字符集优先utf8mb4,支持 emoji、生僻汉字,禁用旧utf8;
库名不能包含空格、中文(不推荐)、特殊符号,只能字母下划线数字;
易错:忘记指定字符集,中文存入出现乱码。
(2)查看数据库 SHOW DATABASES
sql
– 查看全部数据库
SHOW DATABASES;
– 模糊匹配查询数据库
SHOW DATABASES LIKE ‘stu%’;
– 查看数据库创建详情
SHOW CREATE DATABASE student_db;
(3)切换数据库 USE
sql
USE student_db;
易错:执行表操作前未 USE 库,提示表不存在。
(4)删除数据库 DROP DATABASE
sql
DROP DATABASE IF EXISTS student_db;
致命注意:删除库会清空内部所有数据表,生产环境禁止随意执行。
2. 数据表操作语句
(1)建表 CREATE TABLE
完整标准语法
sql
CREATE TABLE [IF NOT EXISTS] 表名(
字段1 数据类型 [约束],
字段2 数据类型 [约束],
…
表级约束
)[ENGINE=存储引擎] [CHARSET=字符集];
实战案例(学生表)
sql
CREATE TABLE IF NOT EXISTS student(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT ‘学生主键ID’,
stu_name VARCHAR(20) NOT NULL COMMENT ‘学生姓名’,
age TINYINT COMMENT ‘年龄’,
class_id INT COMMENT ‘班级外键’,
create_time DATETIME DEFAULT NOW() COMMENT ‘创建时间’
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘学生信息表’;
核心约束汇总(建表必用)
PRIMARY KEY:主键,唯一非空,一张表仅一个;
AUTO_INCREMENT:自增,仅搭配数字主键;
NOT NULL:字段不允许为空;
UNIQUE:唯一约束,值不可重复;
DEFAULT:字段默认值;
FOREIGN KEY:外键,关联两张表(仅 InnoDB 支持)。
易错点
自增字段必须为主键,否则语法报错;
VARCHAR 必须指定长度,不可只写 VARCHAR;
外键关联字段数据类型必须完全一致,否则关联失败。
(2)查看表结构
sql
– 简易查看字段
DESC student;
– 完整建表语句
SHOW CREATE TABLE student;
– 查看当前库所有表
SHOW TABLES;
(3)修改表 ALTER TABLE(高频考点)
新增字段
sql
ALTER TABLE student ADD COLUMN phone CHAR(11) AFTER age;
修改字段类型 / 约束
sql
ALTER TABLE student MODIFY COLUMN age SMALLINT;
修改字段名称 + 类型
sql
ALTER TABLE student CHANGE COLUMN phone tel CHAR(11);
删除字段
sql
ALTER TABLE student DROP COLUMN tel;
修改表名
sql
ALTER TABLE student RENAME TO stu_info;
易错点
ADD COLUMN 可指定 AFTER 调整字段顺序;
MODIFY 只改类型,CHANGE 必须同时写旧字段名 + 新字段名;
删除字段会永久丢失数据,谨慎操作。
(4)删除表 DROP TABLE
sql
DROP TABLE IF EXISTS stu_info;
(5)清空表 TRUNCATE TABLE
sql
TRUNCATE TABLE student;
区分 DELETE 和 TRUNCATE(高频易错)
DELETE:DML,删除数据,自增不重置,支持事务回滚;
TRUNCATE:DDL,清空全表,重置自增主键,无法回滚,速度更快。
二、DML 数据操作语言(开发最常用)
3. 查询 SELECT(核心重点)
4.
完整多层语法结构
sql
SELECT [DISTINCT] 字段/聚合函数
FROM 表名
JOIN 关联表 ON 关联条件
WHERE 行过滤条件
GROUP BY 分组字段
HAVING 分组后过滤
ORDER BY 排序字段 ASC/DESC
LIMIT 偏移量,条数;
分层实战案例
基础单表查询
sql
SELECT id,stu_name,age FROM student WHERE age >= 18;
– DISTINCT去重
SELECT DISTINCT class_id FROM student;
模糊查询 LIKE
sql
– %匹配任意字符,_匹配单个字符
SELECT * FROM student WHERE stu_name LIKE ‘张%’;
区间查询 IN / BETWEEN AND
sql
SELECT * FROM student WHERE age BETWEEN 16 AND 22;
SELECT * FROM student WHERE class_id IN (1,2,3);
聚合函数:COUNT/SUM/AVG/MAX/MIN
sql
SELECT COUNT(*) total,AVG(age) avg_age FROM student;
分组 GROUP BY + HAVING
sql
– 统计每个班级人数,只展示人数大于5的班级
SELECT class_id,COUNT(*) num FROM student GROUP BY class_id HAVING num >5;
WHERE 与 HAVING 核心区别(必考易错)
WHERE:分组前过滤原始数据,不能写聚合函数;
HAVING:分组后过滤分组结果,仅支持聚合函数。
多表连接查询(INNER/LEFT/RIGHT JOIN)
sql
– 左连接:查询所有学生及对应班级,无班级显示null
SELECT s.stu_name,c.class_name
FROM student s
LEFT JOIN class c ON s.class_id = c.id;
分页 LIMIT
sql
– 第1页,每页10条
SELECT * FROM student LIMIT 0,10;
SELECT 高频错误汇总
GROUP BY 后 SELECT 只能写分组字段 + 聚合函数;
多表关联忘记写 ON 条件,产生笛卡尔积(数据爆炸);
分页偏移量计算错误:第 n 页 LIMIT (n-1)*size,size;
NULL 判断不能用 =,必须用 IS NULL / IS NOT NULL。
5. 新增 INSERT
语法 1:指定字段插入
sql
INSERT INTO student(stu_name,age,class_id) VALUES (‘张三’,19,1);
语法 2:批量插入(推荐,效率更高)
sql
INSERT INTO student(stu_name,age)
VALUES (‘李四’,18),(‘王五’,20);
语法 3:查询结果插入
sql
INSERT INTO stu_backup(id,stu_name) SELECT id,stu_name FROM student;
易错:字段与值数量、数据类型必须一一对应;自增字段可省略不写。
6. 修改 UPDATE
sql
UPDATE student SET age=20,class_id=2 WHERE id=1;
致命易错点:省略 WHERE 条件会更新整张表所有数据,开发严禁裸写 UPDATE!
7. 删除 DELETE
sql
DELETE FROM student WHERE id=10;
同样禁止不带 WHERE 条件,会清空全表数据。
三、拓展实战:学生管理系统完整业务 SQL
- 三表设计(学生 + 班级 + 成绩)
sql
– 班级表
CREATE TABLE class(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(30) NOT NULL,
teacher VARCHAR(20)
)ENGINE=InnoDB CHARSET=utf8mb4;
– 学生表(外键关联班级)
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
stu_name VARCHAR(20) NOT NULL,
age TINYINT,
cid INT,
create_time DATETIME DEFAULT NOW(),
FOREIGN KEY (cid) REFERENCES class(cid)
);
– 成绩表(外键关联学生)
CREATE TABLE score(
sid INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT,
subject VARCHAR(20),
score INT CHECK (score BETWEEN 0 AND 100),
FOREIGN KEY (stu_id) REFERENCES student(id)
);
2. 多表联查实战
sql
– 1. 查询学生+班级+成绩(三表联查)
SELECT s.stu_name,c.cname,sc.subject,sc.score
FROM student s
JOIN class c ON s.cid = c.cid
JOIN score sc ON s.id = sc.stu_id
WHERE sc.score >= 60;
– 2. 统计每班平均分
SELECT c.cname,AVG(sc.score) avg_score
FROM class c
LEFT JOIN student s ON c.cid = s.cid
LEFT JOIN score sc ON s.id = sc.stu_id
GROUP BY c.cname;
3. 事务实战(模拟转账)
sql
– 开启事务
START TRANSACTION;
– 扣款
UPDATE account SET money=money-100 WHERE id=1;
– 收款
UPDATE account SET money=money+100 WHERE id=2;
– 提交/回滚
COMMIT; – 生效
– ROLLBACK; – 撤销
三、DCL 数据控制语言(权限、用户管理)
8. 创建用户 CREATE USER
sql
CREATE USER IF NOT EXISTS ‘user1’@‘localhost’ IDENTIFIED BY ‘123456’;
@后代表访问地址:localhost仅本地,% 允许任意远程访问。
- 分配权限 GRANT
sql
– 授予student_db全部表查询、新增权限
GRANT SELECT,INSERT ON student_db.* TO ‘user1’@‘localhost’;
– 授予全部权限
GRANT ALL PRIVILEGES ON.TO ‘user1’@‘%’; - 回收权限 REVOKE
sql
REVOKE INSERT ON student_db.* FROM ‘user1’@‘localhost’; - 刷新权限
sql
FLUSH PRIVILEGES;
修改用户权限后必须执行生效。 - 删除用户
sql
DROP USER IF EXISTS ‘user1’@‘localhost’;
易错:用户名 + 主机地址必须完全匹配,否则删除失败。
四、TCL 事务控制语句(InnoDB 引擎专用)
核心语法
sql
– 开启事务
START TRANSACTION;
– 执行DML操作
UPDATE account SET money=money-100 WHERE id=1;
UPDATE account SET money=money+100 WHERE id=2;
– 设置保存点
SAVEPOINT step1;
– 回滚到保存点
ROLLBACK TO step1;
– 全部回滚
ROLLBACK;
– 提交事务,数据永久生效
COMMIT;
应用场景
转账、订单、库存扣减等需要保证原子性的业务。
易错点
MyISAM 引擎不支持事务,操作无法回滚;
DDL 语句会自动提交事务,事务中途执行 CREATE/ALTER 会丢失未提交数据;
忘记 COMMIT,程序断开后数据全部回滚。
五、学习总结:个人薄弱点与解决方案 - 前期踩坑问题
分不清 WHERE 和 HAVING,分组查询频繁报错;
UPDATE/DELETE 忘记加 WHERE,课堂测试清空测试表;
多表连接混淆 LEFT JOIN 和 INNER JOIN,查询丢失数据;
事务使用时执行 ALTER 导致事务自动提交。
高频报错大全(100% 复现课堂错误)
报错码 报错信息 原因 解决方法
1046 No database selected 未 USE 库 执行 USE 库名
1064 语法错误 符号 / 关键字写错 检查括号、逗号、关键字
1364 字段无默认值 非空字段未传值 补全字段或设 DEFAULT
150 外键约束失败 类型不匹配 / 无主键 统一字段类型 - 改进学习方案
手写 SQL 分层结构,严格按照 SELECT-FROM-WHERE-GROUP-HAVING-ORDER 顺序书写;
执行删改语句前先 SELECT 校验 WHERE 条件;
画图区分三种连接查询数据范围;
事务内只执行 DML,结构修改语句统一放在事务外部。 - 核心薄弱点
分组查询混淆 WHERE/HAVING;
删改语句忘加 WHERE 条件;
事务中执行 DDL 导致自动提交;
多表连接逻辑混乱。
六、文末思考疑问(拓展学习)
MySQL8.0 新增的 CTE 递归 WITH 语句如何结合 SELECT 使用?
事务隔离级别 READ COMMITTED、REPEATABLE READ 实际业务如何选择?
海量数据场景下,LIMIT 分页性能过低有哪些优化方案?
后续将通过本地压测、官方文档研读解决以上问题,更新补充实战案例。
踩坑一:分组查询混淆 WHERE 与 HAVING,频繁报聚合函数语法错误
实操场景:统计每个班级平均年龄,想筛选平均年龄大于 19 的班级,直接在 WHERE 里写AVG(age)>19,页面直接抛出 SQL 语法报错。
错误根源:没有分清过滤执行顺序,WHERE 是原始行数据过滤,执行在 GROUP BY 分组之前,无法识别分组后的聚合计算结果;HAVING 专门用来过滤分组完成后的聚合值。
改正方案:先 WHERE 过滤原始学生数据,再 GROUP BY 分组,最后用 HAVING 限制聚合结果;
记忆技巧:先过滤原始数据用 WHERE,分完组筛结果用 HAVING。
踩坑二:执行 UPDATE、DELETE 时遗忘 WHERE 条件,清空测试表全部数据
实操场景:修改指定学生年龄,随手写UPDATE student SET age=20;,忘记追加WHERE id=xx,整张学生表几百条测试数据全部被覆盖修改,只能重新导入测试数据,浪费大量实操时间。
错误根源:操作习惯差,删改语句不提前校验筛选条件,没有养成先查后改的习惯。
改正方案:执行 UPDATE/DELETE 前,先用同条件的 SELECT 语句查询校验,确认命中数据条数正确,再执行修改删除;生产环境禁止裸写无 WHERE 的 DML 语句。
记忆技巧:删改必带 WHERE,先 SELECT 校验再执行。
踩坑三:事务中途执行 ALTER 修改表结构,导致事务自动提交丢失数据
实操场景:写转账事务时,中途想临时给账户表新增备注字段,执行ALTER TABLE account ADD remark VARCHAR(50);,后续执行 ROLLBACK 发现转账操作无法回滚,金额变动永久保存。
错误根源:DDL 语句(CREATE/ALTER/DROP)会触发隐式提交,当前未提交的事务会直接永久生效,回滚失效。
改正方案:事务逻辑只放 INSERT/UPDATE/DELETE 这类 DML 增删改操作;库、表、字段结构修改语句全部放在事务外部单独执行。
记忆技巧:事务只做数据变更,表结构修改单独执行。
原有踩坑补充(原文保留)
多表连接混淆 LEFT JOIN 和 INNER JOIN,关联班级和学生表时,INNER JOIN 丢失无班级的学生数据;
NULL 值判断使用=,写where class_id = null查询不到空班级学生,必须使用IS NULL。 - 整体学习改进方案
书写 SQL 严格遵循固定书写顺序:SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT,分层分行写代码,避免逻辑混乱;
建立个人 SQL 易错笔记,每次实操报错后记录错误 SQL、报错原因、修正代码,定期复盘;
复杂多表查询先画表关联草图,标注主表、关联字段、保留数据范围,再编写 JOIN 语句;
涉及金额、库存、转账等敏感业务,强制开启事务测试,验证 COMMIT、ROLLBACK 逻辑正常再投入使用。 - 长期强化计划
每天手写 5 条综合 SQL(分组聚合、多表联查、事务案例),脱离工具提示纯手动编写;
对照 MySQL8.0 官方文档核对语法,纠正自己不规范的简写写法;
针对外键、事务隔离级别、分页优化等薄弱知识点,单独搭建测试库做压测实操。
七.综上样例展示
文末标签
#MySQL #SQL 大全 #数据库期末复习 #SQL 避坑 #后端开发
参考文献(MySQL 8.0 官方文档)
MySQL 8.0 DDL 语法官方文档:https://dev.mysql.com/doc/refman/8.0/en/ddl-statements.html
MySQL 8.0 事务与锁官方文档:https://dev.mysql.com/doc/refman/8.0/en/commit.html
MySQL 8.0 连接查询官方文档:https://dev.mysql.com/doc/refman/8.0/en/join.html
MySQL 8.0 外键约束官方文档:https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
