目录
[1. 数据插入(Create)](#1. 数据插入(Create))
[2. 数据查询(Retrieve)](#2. 数据查询(Retrieve))
[3. 数据更新(Update)](#3. 数据更新(Update))
[4. 数据删除(Delete)](#4. 数据删除(Delete))
[1. 常用聚合函数](#1. 常用聚合函数)
[2. 分组查询(GROUP BY)](#2. 分组查询(GROUP BY))
[1. 去重与数据迁移](#1. 去重与数据迁移)
[2. 分页查询优化](#2. 分页查询优化)
[3. 处理复杂条件](#3. 处理复杂条件)
一、引言
MySQL作为最流行的关系型数据库之一,其核心操作CRUD(Create, Retrieve, Update, Delete)是每个开发者必须掌握的基础技能。本文将系统性地讲解MySQL的增删改查操作,涵盖基础语法、高级技巧和实战案例,帮助读者构建完整的知识体系。
二、CRUD基础操作
1. 数据插入(Create)
全列插入与指定列插入
sql
-- 全列插入(需按表结构顺序填写所有字段)
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
-- 指定列插入(可省略自增主键或允许为NULL的字段)
INSERT INTO students (sn, name) VALUES (20001, '曹孟德');
冲突处理:插入否则更新
当主键或唯一键冲突时,使用 ON DUPLICATE KEY UPDATE
同步更新数据:
sql
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
替换操作
REPLACE
在冲突时先删除再插入:
sql
REPLACE INTO students (sn, name) VALUES (20001, '曹阿晴');
2. 数据查询(Retrieve)
基础查询
sql
-- 全列查询(谨慎使用,可能影响性能)
SELECT * FROM exam_result;
-- 指定列查询
SELECT name, math FROM exam_result;
-- 别名与表达式
SELECT name, chinese + math + english AS 总分 FROM exam_result;
条件筛选(WHERE)
sql
-- 比较运算符
SELECT name, english FROM exam_result WHERE english < 60;
-- 范围查询
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
-- 模糊匹配
SELECT name FROM exam_result WHERE name LIKE '孙%'; -- 姓孙的同学
SELECT name FROM exam_result WHERE name LIKE '孙_'; -- 姓孙且名字为两字的同学
排序与分页
sql
-- 按总分降序排列
SELECT name, chinese + math + english 总分
FROM exam_result
ORDER BY 总分 DESC;
-- 分页查询(每页3条,查看第2页)
SELECT id, name
FROM exam_result
ORDER BY id
LIMIT 3 OFFSET 3;
3. 数据更新(Update)
sql
-- 单字段更新
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
-- 多字段更新
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
-- 表达式更新(为总分倒数前三的同学数学加30分)
UPDATE exam_result SET math = math + 30
ORDER BY chinese + math + english
LIMIT 3;
4. 数据删除(Delete)
sql
-- 删除特定记录
DELETE FROM exam_result WHERE name = '孙悟空';
-- 清空表(自增ID保留)
DELETE FROM for_delete;
-- 截断表(自增ID重置)
TRUNCATE TABLE for_truncate;
三、聚合函数与分组查询
1. 常用聚合函数
函数 | 说明 |
---|---|
COUNT() |
统计行数 |
SUM() |
求和 |
AVG() |
求平均值 |
MAX() |
最大值 |
MIN() |
最小值 |
示例
sql
-- 统计班级人数
SELECT COUNT(*) FROM students;
-- 统计数学成绩种类数
SELECT COUNT(DISTINCT math) FROM exam_result;
-- 计算平均总分
SELECT AVG(chinese + math + english) AS 平均总分 FROM exam_result;
2. 分组查询(GROUP BY)
sql
-- 统计各部门的平均工资与最高工资
SELECT deptno, AVG(sal), MAX(sal)
FROM emp
GROUP BY deptno;
-- 过滤分组结果(HAVING)
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
HAVING avg_sal < 2000;
四、实战应用场景
1. 去重与数据迁移
sql
-- 创建新表并插入去重数据
CREATE TABLE no_duplicate_table LIKE duplicate_table;
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;
-- 重命名表实现原子操作
RENAME TABLE duplicate_table TO old_duplicate_table,
no_duplicate_table TO duplicate_table;
2. 分页查询优化
sql
-- 使用LIMIT和OFFSET实现分页
SELECT * FROM large_table
ORDER BY id
LIMIT 10 OFFSET 20; -- 第3页,每页10条
3. 处理复杂条件
sql
-- 查询姓孙或总成绩>200且语文<数学的同学
SELECT name, chinese, math, english
FROM exam_result
WHERE name LIKE '孙%' OR (chinese + math + english > 200 AND chinese < math);
五、面试重点:SQL执行顺序
SQL关键字执行顺序决定了查询逻辑的优先级:
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
六、总结与最佳实践
-
避免全列查询 :使用
SELECT *
可能导致性能问题,明确指定所需字段。 -
谨慎更新/删除:操作前务必确认WHERE条件,可先通过SELECT验证。
-
索引优化:频繁查询的字段建议添加索引,但需权衡写入性能。
-
事务处理:批量操作时使用事务,确保数据一致性。
通过本文的学习,相信你已经掌握了MySQL的核心操作。建议结合实战题目(如LeetCode SQL题库)进一步巩固技能,提升解决复杂问题的能力。
