MySQL 数据库技术:SQL 语句全解析
前言
在本学期的《MySQL 数据库技术》课程中,我们系统学习了 SQL 的各类语句,也在实战中踩过不少 “坑”。为了巩固知识、复盘经验,我整理了这份 SQL 语句全解析笔记,包含语法规范、应用场景、易错点和实战示例,希望能帮到同样在学习 MySQL 的小伙伴,也方便自己后续复习回顾。
一、SQL 基础概念与分类
SQL(Structured Query Language,结构化查询语言)是关系型数据库的标准操作语言,MySQL 中 SQL 语句按功能可分为 5 大类:
表格
| 分类 | 全称 | 核心作用 | 典型语句 |
|---|---|---|---|
| DDL | 数据定义语言 | 定义数据库、表、视图等对象的结构 | CREATE / ALTER / DROP / TRUNCATE |
| DML | 数据操作语言 | 对表中的数据进行增删改查 | INSERT / DELETE / UPDATE / SELECT |
| DQL | 数据查询语言 | 专门用于数据查询(常被归为 DML) | SELECT(核心语句) |
| DCL | 数据控制语言 | 管理用户权限、控制数据访问 | GRANT / REVOKE |
| TCL | 事务控制语言 | 管理数据库事务,保证数据一致性 | COMMIT / ROLLBACK / SAVEPOINT |
易错点:
TRUNCATE属于 DDL 而非 DML,它会直接删除表并重建,无法回滚,且会重置自增主键,和DELETE FROM 表名有本质区别。
二、DDL(数据定义语言)详解
2.1 数据库操作语句
2.1.1 创建数据库 CREATE DATABASE
语法规范
sql
CREATE DATABASE [IF NOT EXISTS] 数据库名
[CHARSET=字符集]
[COLLATE=排序规则];
易错点
- 不加
IF NOT EXISTS时,数据库已存在会报错; - 不指定字符集易出现中文乱码,建议统一使用
utf8mb4。
实战示例
sql
-- 创建学生管理数据库,指定utf8mb4字符集
CREATE DATABASE IF NOT EXISTS student_manage
CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;
2.1.2 查看数据库 SHOW DATABASES
sql
-- 查看所有数据库
SHOW DATABASES;
-- 查看创建数据库的语句
SHOW CREATE DATABASE 数据库名;
2.1.3 切换 / 使用数据库 USE
sql
USE 数据库名;
注意:操作表前必须先切换数据库,否则会提示表不存在。
2.1.4 删除数据库 DROP DATABASE
sql
DROP DATABASE [IF EXISTS] 数据库名;
高危操作:删除数据库会清空库内所有表与数据,生产环境务必提前备份。
2.2 表结构操作语句
2.2.1 创建表 CREATE TABLE
语法规范
sql
CREATE TABLE [IF NOT EXISTS] 表名 (
列名1 数据类型 [约束条件] [COMMENT '字段说明'],
列名2 数据类型 [约束条件] [COMMENT '字段说明'],
...
PRIMARY KEY (主键列),
[FOREIGN KEY (外键列) REFERENCES 主表(主表主键)]
) [ENGINE=存储引擎] [CHARSET=字符集] [COMMENT '表说明'];
常用约束说明
表格
| 约束 | 作用 | 示例 |
|---|---|---|
NOT NULL |
字段值不能为空 | student_name VARCHAR(20) NOT NULL |
UNIQUE |
字段值唯一 | student_phone CHAR(11) UNIQUE |
PRIMARY KEY |
主键,非空且唯一,单表仅一个 | id INT PRIMARY KEY AUTO_INCREMENT |
AUTO_INCREMENT |
整数类型自增 | id INT PRIMARY KEY AUTO_INCREMENT |
DEFAULT |
字段默认值 | is_delete TINYINT DEFAULT 0 |
FOREIGN KEY |
外键,关联主表主键 | FOREIGN KEY (class_id) REFERENCES class(id) |
实战示例
sql
-- 创建学生信息表
CREATE TABLE IF NOT EXISTS student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '学生ID',
student_no CHAR(10) NOT NULL UNIQUE COMMENT '学号',
student_name VARCHAR(20) NOT NULL COMMENT '姓名',
age TINYINT UNSIGNED COMMENT '年龄',
gender ENUM('男','女') DEFAULT '男' COMMENT '性别',
class_id INT COMMENT '班级ID',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (class_id) REFERENCES class(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '学生信息表';
2.2.2 修改表结构 ALTER TABLE
sql
-- 添加列
ALTER TABLE 表名 ADD COLUMN 列名 数据类型 [约束] [COMMENT '说明'];
-- 修改列数据类型/约束
ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型 [新约束];
-- 重命名列
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 数据类型 [约束];
-- 删除列
ALTER TABLE 表名 DROP COLUMN 列名;
-- 重命名表
ALTER TABLE 旧表名 RENAME TO 新表名;
-- 添加主键
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
-- 添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键列) REFERENCES 主表(主表主键);
注意:表内已有数据时,修改字段类型可能因数据不兼容报错,删除列会永久丢失数据。
2.2.3 删除 / 清空表
- DROP TABLE:删除表结构 + 全部数据
sql
DROP TABLE [IF EXISTS] 表名;
- TRUNCATE TABLE:清空数据,保留表结构,重置自增主键
sql
TRUNCATE TABLE 表名;
三者对比
表格
| 特性 | DELETE FROM 表名 |
TRUNCATE TABLE 表名 |
DROP TABLE 表名 |
|---|---|---|---|
| 所属类型 | DML | DDL | DDL |
| 能否回滚 | 支持事务回滚 | 不支持回滚 | 不支持回滚 |
| 自增主键 | 不重置 | 重置为初始值 | 表被删除,无主键 |
| 执行效率 | 逐行删除,效率低 | 直接重建表,效率高 | 直接删除表,效率高 |
| 风险等级 | 中等 | 高 | 极高 |
三、DML(数据操作语言)详解
3.1 插入数据 INSERT
基础语法
sql
-- 单条插入
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
-- 批量插入
INSERT INTO 表名 (列1, 列2, ...) VALUES
(值1-1, 值1-2, ...),
(值2-1, 值2-2, ...);
-- 插入查询结果
INSERT INTO 目标表 (列1, 列2, ...) SELECT 列A, 列B, ... FROM 源表 [WHERE 条件];
实战示例
sql
-- 批量插入学生数据
INSERT INTO student (student_no, student_name, age, gender, class_id)
VALUES
('2024001', '张三', 18, '男', 1),
('2024002', '李四', 17, '女', 1),
('2024003', '王五', 18, '男', 2);
-- 存在则更新,不存在则插入
INSERT INTO student (student_no, student_name, age)
VALUES ('2024001', '张三', 19)
ON DUPLICATE KEY UPDATE age=19;
注意:字符串、日期类型必须用单引号包裹,主键 / 唯一键重复会触发报错。
3.2 更新数据 UPDATE
语法
sql
UPDATE 表名 SET 列1=值1, 列2=值2, ... [WHERE 条件] [LIMIT 行数];
高危提醒:不加
WHERE条件会更新全表数据,日常使用必须指定条件。
多表更新示例
sql
UPDATE student s JOIN class c ON s.class_id = c.id
SET s.class_name = c.class_name
WHERE c.id = 1;
3.3 删除数据 DELETE
语法
sql
DELETE FROM 表名 [WHERE 条件] [LIMIT 行数];
高危提醒:无
WHERE条件会删除全表数据,生产环境优先使用逻辑删除。
多表删除示例
sql
DELETE s FROM student s JOIN class c ON s.class_id = c.id WHERE c.id = 3;
四、DQL(数据查询语言)详解(核心)
4.1 完整语法结构
sql
SELECT [DISTINCT] 列名/表达式/聚合函数
FROM 表名 [JOIN 关联表 ON 关联条件]
[WHERE 行过滤条件]
[GROUP BY 分组列]
[HAVING 分组后过滤条件]
[ORDER BY 排序列 [ASC/DESC]]
[LIMIT [偏移量,] 行数];
4.2 基础查询与去重 DISTINCT
sql
-- 普通查询
SELECT student_name, age FROM student;
-- 去重查询
SELECT DISTINCT class_id FROM student;
说明:
DISTINCT对查询的所有列联合去重。
4.3 条件查询 WHERE
常用运算符 比较符:=、!=、>、<、>=、<= 范围符:BETWEEN 最小值 AND 最大值 集合符:IN (值1,值2) 模糊查询:LIKE(%匹配任意字符,_匹配单个字符) 空值判断:IS NULL、IS NOT NULL(禁止使用=NULL) 逻辑符:AND、OR、NOT
示例
sql
-- 查询1班17岁以上女生
SELECT * FROM student
WHERE class_id=1 AND age>17 AND gender='女';
-- 查询姓名以张开头的学生
SELECT * FROM student WHERE student_name LIKE '张%';
-- 年龄16-18岁学生
SELECT * FROM student WHERE age BETWEEN 16 AND 18;
-- 班级ID为1、2的学生
SELECT * FROM student WHERE class_id IN (1,2);
4.4 聚合函数与分组查询 GROUP BY
常用聚合函数 COUNT() 统计行数、SUM() 求和、AVG() 求平均、MAX() 最大值、MIN() 最小值
分组查询示例
sql
-- 统计每个班级人数、平均年龄
SELECT class_id, COUNT(*) AS student_count, AVG(age) AS avg_age
FROM student
GROUP BY class_id;
-- 筛选人数大于2的班级
SELECT class_id, COUNT(*) AS student_count
FROM student
GROUP BY class_id
HAVING COUNT(*) > 2;
区分:WHERE 分组前过滤,不能用聚合函数;HAVING 分组后过滤,可使用聚合函数。
4.5 排序 ORDER BY
sql
-- 年龄升序,同名按姓名降序
SELECT * FROM student ORDER BY age ASC, student_name DESC;
4.6 分页 LIMIT
sql
-- 查询前10条
SELECT * FROM student LIMIT 10;
-- 从第11条开始,取10条(偏移量从0开始)
SELECT * FROM student LIMIT 10, 10;
4.7 多表连接查询
表格
| 连接类型 | 说明 |
|---|---|
| 内连接 INNER JOIN | 只查询关联匹配的数据 |
| 左连接 LEFT JOIN | 以左表为准,右表无匹配数据显示 NULL |
| 右连接 RIGHT JOIN | 以右表为准,左表无匹配数据显示 NULL |
示例
sql
-- 内连接:查询有班级的学生及班级名
SELECT s.id, s.student_name, c.class_name
FROM student s
INNER JOIN class c ON s.class_id = c.id;
-- 左连接:查询所有学生,包含无班级的学生
SELECT s.id, s.student_name, c.class_name
FROM student s
LEFT JOIN class c ON s.class_id = c.id;
五、DCL(数据控制语言)详解
5.1 创建用户
sql
-- 本地登录用户
CREATE USER 'student_user'@'localhost' IDENTIFIED BY '123456';
-- 任意主机登录用户
CREATE USER 'student_user'@'%' IDENTIFIED BY '123456';
5.2 授权
sql
-- 授予查询、插入权限
GRANT SELECT, INSERT ON student_manage.student TO 'student_user'@'localhost';
-- 授予全部权限(仅测试使用)
GRANT ALL PRIVILEGES ON student_manage.* TO 'student_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
5.3 回收权限
sql
REVOKE INSERT ON student_manage.student FROM 'student_user'@'localhost';
5.4 删除用户
sql
DROP USER 'student_user'@'localhost';
原则:遵循最小权限分配,生产环境不开放
%主机与全权限。
六、TCL(事务控制语言)详解
6.1 事务四大特性 ACID
- 原子性:事务内操作要么全成功,要么全回滚;
- 一致性:事务执行前后数据库约束保持完整;
- 隔离性:多事务并发互不干扰;
- 持久性:事务提交后数据永久生效。
6.2 事务操作语句
sql
-- 开启事务
START TRANSACTION;
-- 执行数据操作
UPDATE student SET age=19 WHERE id=1;
INSERT INTO student (student_no, student_name) VALUES ('2024004', '赵六');
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 设置保存点
SAVEPOINT savepoint1;
-- 回滚至指定保存点
ROLLBACK TO SAVEPOINT savepoint1;
说明:仅 InnoDB 引擎支持事务,DDL 语句会隐式提交事务,无法回滚。
七、学习总结与反思
通过整理这份 SQL 笔记,我梳理了 MySQL 各类语句的用法与坑点,同时也发现自身不足:
- 对多表连接、大表查询的性能优化掌握不足,后续学习
EXPLAIN执行计划分析; - 窗口函数、复杂子查询运用不够熟练,需要补充实战练习;
- 数据库安全、事务死锁、SQL 注入等生产场景知识有待加强。
SQL 是数据库学习的核心基础,后续我会结合实操持续巩固,也欢迎大家一起交流学习。
八、附录:常用 SQL 速查表
表格
| 场景 | 语句 |
|---|---|
| 查看所有数据库 | SHOW DATABASES; |
| 查看表结构 | DESC 表名; / SHOW CREATE TABLE 表名; |
| 查看当前用户 | SELECT USER(); |
| 查看当前数据库 | SELECT DATABASE(); |
| 查看 MySQL 版本 | SELECT VERSION(); |
| 查看表索引 | SHOW INDEX FROM 表名; |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)