《MySQL 数据库 SQL 语句全知识点梳理》

📅 2026/6/29 23:51:51
《MySQL 数据库 SQL 语句全知识点梳理》
前言本学期通过《MySQL 数据库技术》课程的系统学习掌握了关系型数据库的核心操作逻辑与 SQL 语言的实战应用。本文对课程涉及的全量 SQL 语句进行体系化整理明确各语句的使用规则、应用场景、高频踩坑点并配套可直接运行的实战案例既是个人学习复盘也为 MySQL 入门学习者提供一份可落地的实操指南。一、SQL 语言基础概述1.1 SQL 四大分类SQL结构化查询语言是关系型数据库的标准操作语言按功能分为四类DDL数据定义语言定义数据库、表、约束等结构代表关键字CREATE、DROP、ALTERDML数据操作语言操作表内数据代表关键字INSERT、UPDATE、DELETEDQL数据查询语言数据查询核心核心关键字SELECTDCL数据控制语言管理用户与权限代表关键字GRANT、REVOKE1.2 通用书写规范关键字建议大写表名、字段名小写提升可读性Windows 环境下 MySQL 不区分大小写Linux 环境下表名、库名区分大小写每条语句以英文分号;结尾长语句可换行缩进保证代码可读性注释规则单行注释-- 注释内容多行注释/* 注释内容 */禁止使用 SQL 关键字作为表名 / 字段名如order、name、desc若必须使用需用反引号包裹二、DDL 数据定义语言2.1 数据库操作2.1.1 创建数据库语法sqlCREATE DATABASE [IF NOT EXISTS] 库名 [CHARSET 字符集];使用规范建议添加IF NOT EXISTS避免库已存在时报错中断字符集优先使用utf8mb4支持完整 Unicode 字符含 emoji原生utf8最多支持 3 字节存在特殊字符乱码问题易错点遗漏字符集设置默认字符集导致中文乱码库名含特殊符号 / 关键字未用反引号包裹实战示例sql-- 创建学生管理数据库指定utf8mb4字符集 CREATE DATABASE IF NOT EXISTS student_manage CHARSET utf8mb4;2.1.2 查看、切换、删除数据库sql-- 查看所有数据库 SHOW DATABASES; -- 查看数据库创建详情 SHOW CREATE DATABASE student_manage; -- 切换使用数据库 USE student_manage; -- 删除数据库 DROP DATABASE IF EXISTS student_manage;2.2 数据表操作2.2.1 创建数据表语法sqlCREATE TABLE [IF NOT EXISTS] 表名( 字段1 字段类型 [约束] [COMMENT 字段注释], 字段2 字段类型 [约束] [COMMENT 字段注释], ... [表级约束] ) [COMMENT 表注释];常用字段类型表格类型分类常用类型适用场景数值型INT、BIGINT、DECIMAL(m,d)整数、长整数、高精度小数字符串VARCHAR(n)、CHAR(n)、TEXT变长字符串、定长字符串、长文本日期时间DATE、DATETIME、TIMESTAMP日期、日期时间、时间戳易错点最后一个字段后多余逗号触发语法错误VARCHAR必须指定长度DECIMAL必须指定总精度与小数位数自增AUTO_INCREMENT只能用于数值型主键字段实战示例sql-- 创建学生信息表 CREATE TABLE IF NOT EXISTS student( stu_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 学生学号主键自增, stu_name VARCHAR(20) NOT NULL COMMENT 学生姓名非空, stu_gender CHAR(2) DEFAULT 男 COMMENT 性别默认值为男, stu_age INT COMMENT 学生年龄, dept_id INT COMMENT 所属院系编号 ) COMMENT 学生信息表;2.2.2 修改表结构语法ALTER TABLE 表名 操作;sql-- 添加字段 ALTER TABLE student ADD stu_address VARCHAR(100) COMMENT 家庭住址; -- 修改字段类型/约束 ALTER TABLE student MODIFY stu_age TINYINT; -- 修改字段名类型 ALTER TABLE student CHANGE stu_address stu_addr VARCHAR(100); -- 删除字段 ALTER TABLE student DROP stu_addr; -- 修改表名 ALTER TABLE student RENAME TO stu_info;易错点CHANGE可同时修改字段名与类型MODIFY仅能修改类型 / 约束二者不可混淆。2.2.3 删除表与清空表sql-- 删除整张表结构数据 DROP TABLE IF EXISTS student; -- 清空表数据保留表结构 TRUNCATE TABLE student;TRUNCATE与DELETE的核心区别DELETE是 DML 语句可加WHERE删除部分数据支持事务回滚不重置自增主键TRUNCATE是 DDL 语句清空全表不可回滚会重置自增主键起始值2.3 表约束约束用于限制表中数据规则保证数据完整性共 6 种核心约束主键约束PRIMARY KEY非空且唯一一张表只能有一个主键非空约束NOT NULL字段值不允许为空唯一约束UNIQUE字段值不可重复允许为空默认约束DEFAULT插入数据未赋值时使用默认值检查约束CHECKMySQL 8.0 支持限制字段值范围外键约束FOREIGN KEY关联两张表保证数据一致性实战示例sql-- 创建院系表父表 CREATE TABLE dept( dept_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 院系编号, dept_name VARCHAR(30) UNIQUE NOT NULL COMMENT 院系名称 ) COMMENT 院系表; -- 给学生表添加外键关联院系表 ALTER TABLE student ADD CONSTRAINT fk_stu_dept FOREIGN KEY (dept_id) REFERENCES dept(dept_id);易错点外键关联的两个字段数据类型必须完全一致父表被关联字段必须是主键或唯一键删除父表数据时若子表存在关联数据会报错可设置ON DELETE CASCADE级联删除三、DML 数据操作语言3.1 插入数据 INSERTsql-- 全字段插入需和表字段顺序一一对应 INSERT INTO 表名 VALUES (值1,值2,...); -- 指定字段插入推荐写法表结构变更不影响 INSERT INTO 表名(字段1,字段2) VALUES (值1,值2); -- 批量插入 INSERT INTO 表名 VALUES (值1...),(值2...),(值3...);易错点值的数量、顺序与字段不匹配字符串、日期类型值遗漏单引号违反约束主键重复、非空字段为空导致插入失败实战示例sqlINSERT INTO student(stu_name, stu_gender, stu_age, dept_id) VALUES (张三, 男, 20, 1), (李四, 女, 19, 2), (王五, 男, 21, 1);3.2 修改数据 UPDATEsqlUPDATE 表名 SET 字段1值1, 字段2值2 [WHERE 条件];高危提醒必须加WHERE条件否则会修改全表所有数据。实战示例sql-- 修改学号为1的学生年龄 UPDATE student SET stu_age 21 WHERE stu_id 1;3.3 删除数据 DELETEsqlDELETE FROM 表名 [WHERE 条件];高危提醒必须加WHERE条件否则会删除全表所有数据外键关联表需先删子表数据再删父表数据。四、DQL 数据查询语言核心重点4.1 基础查询sql-- 查询所有字段 SELECT * FROM student; -- 查询指定字段并起别名 SELECT stu_name AS 姓名, stu_age 年龄 FROM student; -- 去重查询 SELECT DISTINCT dept_id FROM student;易错点DISTINCT必须放在所有字段最前面对多字段组合去重。4.2 条件查询 WHERE常用运算符比较、、、、、!、逻辑AND、OR、NOT范围BETWEEN ... AND ...集合IN(值1,值2)模糊LIKE%匹配任意多字符_匹配单个字符空值IS NULL、IS NOT NULL实战示例sql-- 查询年龄大于20的男学生 SELECT * FROM student WHERE stu_age 20 AND stu_gender 男; -- 查询年龄在19-21之间的学生 SELECT * FROM student WHERE stu_age BETWEEN 19 AND 21; -- 查询姓张的学生 SELECT * FROM student WHERE stu_name LIKE 张%; -- 查询院系编号为空的学生 SELECT * FROM student WHERE dept_id IS NULL;易错点空值判断必须用IS NULL不能用 NULL。4.3 排序与分页排序 ORDER BYsql-- 按年龄降序年龄相同按学号升序ASC升序默认DESC降序 SELECT * FROM student ORDER BY stu_age DESC, stu_id ASC;注意ORDER BY必须写在WHERE子句之后。分页 LIMITsql-- 语法LIMIT 起始索引, 每页条数 -- 起始索引 (当前页码 - 1) * 每页条数 SELECT * FROM student LIMIT 0,2; -- 第1页每页2条易错点起始索引从 0 开始为 MySQL 专属语法。4.4 聚合函数与分组查询聚合函数常用函数COUNT()、SUM()、AVG()、MAX()、MIN()sql-- 统计学生总数 SELECT COUNT(*) FROM student; -- 查询平均年龄 SELECT AVG(stu_age) FROM student;注意聚合函数自动忽略 NULL 值且不能写在WHERE子句中。分组查询 GROUP BYsqlSELECT 分组字段, 聚合函数 FROM 表名 [WHERE 分组前过滤] GROUP BY 分组字段 [HAVING 分组后过滤];WHERE 与 HAVING 的区别WHERE分组前过滤不满足条件的行不参与分组不能用聚合函数HAVING分组后筛选对分组结果过滤支持聚合函数实战示例sql-- 统计每个院系学生人数筛选人数大于1的院系 SELECT dept_id, COUNT(*) stu_num FROM student GROUP BY dept_id HAVING stu_num 1;4.5 多表连接查询内连接 INNER JOIN只返回两张表中匹配的数据sqlSELECT s.*, d.dept_name FROM student s INNER JOIN dept d ON s.dept_id d.dept_id;外连接左外连接LEFT JOIN返回左表全部数据右表匹配不到的位置显示 NULL右外连接RIGHT JOIN返回右表全部数据左表匹配不到的位置显示 NULLsql-- 查询所有学生无院系的学生也会显示 SELECT s.*, d.dept_name FROM student s LEFT JOIN dept d ON s.dept_id d.dept_id;易错点遗漏连接条件会产生笛卡尔积数据量呈倍数爆炸。4.6 子查询嵌套在 SQL 语句内部的查询按返回结果分为四类标量子查询返回单个值可用比较运算符列子查询返回一列可用IN、ANY、ALL行子查询返回一行数据表子查询返回多行多列放在FROM后作为临时表实战示例sql-- 查询和张三同院系的学生标量子查询 SELECT * FROM student WHERE dept_id (SELECT dept_id FROM student WHERE stu_name 张三);五、DCL 数据控制语言5.1 用户管理sql-- 创建用户 CREATE USER 用户名主机名 IDENTIFIED BY 密码; -- 修改密码 ALTER USER 用户名主机名 IDENTIFIED BY 新密码; -- 删除用户 DROP USER 用户名主机名;主机名写%表示允许任意主机登录。5.2 权限管理sql-- 授予权限 GRANT 权限列表 ON 库名.表名 TO 用户名主机名; -- 撤销权限 REVOKE 权限列表 ON 库名.表名 FROM 用户名主机名; -- 查看权限 SHOW GRANTS FOR 用户名主机名; -- 刷新权限 FLUSH PRIVILEGES;六、进阶 SQL 语法6.1 常用函数字符串函数sql-- 字符串拼接 SELECT CONCAT(stu_name, -, stu_gender) FROM student; -- 截取字符串 SELECT SUBSTRING(stu_name,1,1) FROM student;日期函数sql-- 当前日期时间 SELECT NOW(); -- 提取年份 SELECT YEAR(NOW()); -- 日期天数差 SELECT DATEDIFF(NOW(), 2024-01-01);流程控制函数sql-- IF函数 SELECT IF(stu_age20,成年,未成年) FROM student; -- CASE函数 SELECT stu_name, CASE WHEN stu_age 19 THEN 低年级 WHEN stu_age 21 THEN 中年级 ELSE 高年级 END AS grade FROM student;6.2 事务事务是一组原子性 SQL 操作要么全部成功要么全部失败满足 ACID 四大特性原子性、一致性、隔离性、持久性。sql-- 开启事务 START TRANSACTION; -- 提交事务 COMMIT; -- 回滚事务 ROLLBACK;MySQL 默认自动提交事务每条 DML 语句单独成事务默认隔离级别为可重复读。6.3 索引索引相当于书本目录用于提升查询效率。sql-- 创建普通索引 CREATE INDEX idx_stu_name ON student(stu_name); -- 查看索引 SHOW INDEX FROM student; -- 删除索引 DROP INDEX idx_stu_name ON student;注意索引提升查询速度但会降低增删改效率适合在查询频繁、区分度高的字段创建。七、高频易错点汇总语法类Linux 环境下表名区分大小写字符串 / 日期遗漏单引号关键字作字段名未加反引号操作类UPDATE/DELETE遗漏WHERE误操作全表用 NULL判断空值查询类多表查询缺连接条件产生笛卡尔积WHERE中使用聚合函数LIMIT起始索引计算错误设计类字符集选utf8导致乱码字段类型选型不合理外键关联字段类型不一致八、学习总结与反思通过本学期的学习我已能独立完成库表设计、数据增删改查、多表关联等基础操作对事务、索引等进阶知识也建立了体系化认知。同时也发现了自身的不足复杂嵌套子查询的逻辑梳理能力有待提升对索引底层原理与 SQL 性能优化的理解不够深入存储过程、触发器等高级特性的实战经验较少。后续将通过刷题巩固基础查询能力深入学习 MySQL 性能优化与底层原理结合项目实战把数据库知识落地持续夯实数据库技术基础。