MySQL 的CRUD(增删改查) 是数据库操作的核心基础,不管是日常开发、面试笔试还是刷题,都是必须牢牢掌握的内容。这篇文章把 MySQL 表的增、删、改、查,包括条件过滤、排序、分页、聚合、分组等高频用法一次性整理全,看完直接上手用!
一、先认识 CRUD
CRUD 对应数据库最核心的 4 种操作:
- C:Create(创建 / 插入数据)
- R:Retrieve(读取 / 查询数据)
- U:Update(更新数据)
- D:Delete(删除数据)
二、Create:数据插入(INSERT)
插入是往表里加数据,常用 4 种写法,覆盖绝大多数场景。
1. 单行全列插入
值的顺序、数量必须和表字段完全一致。
sql
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
2. 多行指定列插入
只插入需要的列,更安全、更常用。
sql
INSERT INTO students (id, sn, name)
VALUES
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');
3. 插入否则更新(ON DUPLICATE KEY UPDATE)
主键 / 唯一键冲突时不报错,直接更新。
sql
INSERT INTO students (id, sn, name)
VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
4. 替换插入(REPLACE)
冲突就删除旧数据 + 插入新数据,不冲突直接插。
sql
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
三、Retrieve:数据查询(SELECT)------ 重点中的重点
查询是 SQL 里最复杂、用得最多的部分,语法结构:
sql
SELECT
[DISTINCT] 列名 | 表达式 | 别名
FROM 表名
[WHERE 条件]
[ORDER BY 排序]
[LIMIT 分页];
1. 基础查询
-
全列查询(不推荐用
*,数据量大、影响索引)sql
SELECT * FROM exam_result; -
指定列查询 sql
SELECT id, name, english FROM exam_result;
2. 表达式查询 & 别名
可以直接在查询里做计算,并用AS(可省略) 起别名。
sql
-- 计算总分并起别名
SELECT name, chinese + math + english AS 总分 FROM exam_result;
3. 结果去重(DISTINCT)
sql
-- 去掉重复的数学分数
SELECT DISTINCT math FROM exam_result;
四、WHERE:条件过滤(精准查数据)
用条件筛选想要的数据,支持比较、逻辑、模糊、范围判断。
常用运算符
- 比较:
> >= < <= = != <=> BETWEEN AND IN - 逻辑:
AND OR NOT - 模糊:
LIKE(%任意多字符,_单个字符) - NULL 判断:
IS NULL / IS NOT NULL(=不能判断 NULL)
高频示例
sql
-- 英语不及格
SELECT name, english FROM exam_result WHERE english < 60;
-- 语文80~90分
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
-- 姓孙的同学
SELECT name FROM exam_result WHERE name LIKE '孙%';
-- qq号不为空
SELECT name FROM students WHERE qq IS NOT NULL;
五、ORDER BY:结果排序
- ASC:升序(默认,从小到大)
- DESC:降序(从大到小)
- 支持多字段排序、表达式排序、别名排序
sql
-- 按总分从高到低
SELECT name, chinese+math+english 总分
FROM exam_result
ORDER BY 总分 DESC;
-- 先按数学降序,再按英语升序
SELECT * FROM exam_result ORDER BY math DESC, english ASC;
六、LIMIT:分页查询
分页必备,防止一次性查全表卡死数据库。
注意:LIMIT 的两种常用写法
LIMIT 在 MySQL 里有两种等价写法,只是参数顺序不同,很多同学上课会遇到老师教的和教程不一样,这里帮你彻底分清:
写法 1:LIMIT 偏移量,条数(很多老师课堂上的常用写法)
语法:LIMIT offset, row_count含义:从第 offset 条(从 0 开始计数)开始,取 row_count 条数据。
sql
-- 从第0条开始,取3条(第1页,和LIMIT 3 OFFSET 0 效果完全一样)
SELECT * FROM exam_result LIMIT 0, 3;
写法 2:LIMIT 条数 OFFSET 偏移量(语义更清晰的写法)
语法:LIMIT row_count OFFSET offset含义:取 row_count 条数据,从第 offset 条(从 0 开始计数)开始。
sql
-- 取3条,从第0条开始(和LIMIT 0, 3 效果完全一样)
SELECT * FROM exam_result LIMIT 3 OFFSET 0;
两种写法对比与通用分页公式
表格
| 写法 | 参数顺序 | 优点 | 通用分页公式(第 page 页,每页 pageSize 条) |
|---|---|---|---|
LIMIT offset, row_count |
偏移量在前,条数在后 | 写法更短,很多老教材 / 老师习惯用 | LIMIT (page-1)*pageSize, pageSize |
LIMIT row_count OFFSET offset |
条数在前,偏移量在后 | 语义更清晰,不容易搞混参数 | LIMIT pageSize OFFSET (page-1)*pageSize |
💡 小提示:两种写法在 MySQL 中效果完全一致,按你上课学的习惯用就好,核心是记住偏移量从 0 开始计数!
七、Update:数据更新
一定要加 WHERE!否则全表更新!
sql
-- 单字段更新
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
-- 多字段更新
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
-- 在原值上修改
UPDATE exam_result SET math = math + 30 WHERE name = '宋公明';
八、Delete:数据删除
同样慎用!不加 WHERE 会清空全表!
sql
-- 删除指定数据
DELETE FROM exam_result WHERE name = '孙悟空';
-- 清空表数据(自增ID继续增长)
DELETE FROM for_delete;
-- 截断表(更快、重置自增ID、无法回滚)
TRUNCATE TABLE for_truncate;
DELETE vs TRUNCATE 对比
表格
| 特点 | DELETE | TRUNCATE |
|---|---|---|
| 操作范围 | 可删部分数据 | 只能清空全表 |
| 自增 ID | 保持不变 | 重置从 1 开始 |
| 速度 | 较慢 | 极快 |
| 事务回滚 | 支持 | 不支持 |
九、高级用法:插入查询结果
把一张表的查询结果直接插入另一张表,常用于去重、数据迁移。
sql
-- 去重插入
INSERT INTO no_duplicate_table
SELECT DISTINCT * FROM duplicate_table;
十、聚合函数:统计数据
对一列做统计计算,常用 5 个:
COUNT():计数SUM():求和AVG():平均值MAX():最大值MIN():最小值
sql
-- 统计人数
SELECT COUNT(*) FROM students;
-- 数学总分
SELECT SUM(math) FROM exam_result;
-- 英语最高分
SELECT MAX(english) FROM exam_result;
十一、GROUP BY:分组统计 + HAVING 分组过滤
GROUP BY按某列分组,HAVING对分组结果过滤(不能用 WHERE)。
sql
-- 每个部门平均工资
SELECT deptno, AVG(sal) FROM EMP GROUP BY deptno;
-- 平均工资低于2000的部门
SELECT deptno, AVG(sal) AS avg_sal
FROM EMP
GROUP BY deptno
HAVING avg_sal < 2000;
十二、SQL 执行顺序(面试高频)
记住这个顺序,写复杂 SQL 再也不晕:
plaintext
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
十三、总结
- 增:INSERT / INSERT ... ON DUPLICATE KEY UPDATE / REPLACE
- 查:SELECT + 表达式 + 别名 + DISTINCT
- 筛:WHERE(比较、逻辑、模糊、NULL)
- 排:ORDER BY ASC/DESC
- 页:LIMIT ... OFFSET ...
- 改:UPDATE 必须加 WHERE
- 删:DELETE / TRUNCATE 慎用
- 统计:聚合函数 + GROUP BY + HAVING
这套 MySQL CRUD 基本查询用法,覆盖日常开发 90% 场景,刷题、面试、工作都够用,建议收藏反复看!