MySQL 核心语法速通:DML 数据操作 & DQL 进阶查询实战
MySQL 核心语法速通:DML 数据操作与 DQL 进阶查询实战
在企业级真实业务场景中,数据库往往面临着**“读多写少”**的常态。这意味着,除了必须熟练掌握 DML(数据操作语言)来实现基础的业务数据流转外,DQL(数据查询语言)的性能与逻辑严密性,将直接决定系统架构的上限。
本文将作为一份写给初学者的“避坑与速通指南”,带你从底层逻辑彻底拿下 DML 与 DQL 的核心语法。
一、 DML 数据操作实战(增、删、改)
DML(Data Manipulation Language)主要负责对表中的数据记录进行增(INSERT)、删(DELETE)、改(UPDATE)。在执行这些操作时,必须要时刻保持对数据的敬畏之心。
1. 数据的插入 (INSERT)
数据的插入分为指定字段的单条插入和全字段的批量插入。核心原则是:传入的数据类型必须与表结构严格对应。
-- 单条插入:指定核心字段进行赋值
insert into emp(username , password , name , gender , phone) value('Tom','123456','汤姆',1,'100 0000 0000');
-- 批量/全字段插入:注意自增主键可传 null 占位,时间字段可用 now() 函数
insert into emp value(null,'Rose','123456','萝丝',0,'13000000000',1,7000,'2020-01-01','1.jpg',now(),now());
2. 数据的更新 (UPDATE) 与 删除 (DELETE)
⚠️ 【极其重要:架构师的血泪避坑指南】
在生产环境中执行UPDATE和DELETE时,必须、绝对、一定要加WHERE条件!
如果漏写了WHERE条件,指令将对整张表生效,这会直接导致数据全部被篡改或清空的“删库级”灾难!
(注:在现代企业开发中,物理删除 DELETE 通常会被禁用,取而代之的是通过更新状态字段来实现逻辑删除。)
-- DML : 更新数据 (带 WHERE 条件,精准打击)
update emp set salary = 8000, update_time = now() where id = 1;
update emp set phone = '13800001111', job = 2, update_time = now() where name = '汤姆';
-- ❌ 极其危险:不加 where 条件会更新全表,员工入职日期全变成同一天!
update emp set entry_date = '2024-01-01', update_time = now();
-- DML : 删除数据 (带 WHERE 条件)
delete from emp where name = '萝丝';
delete from emp where id = 1;
-- ❌ 极其危险:不加条件将清空整表数据!
delete from emp;
二、 DQL 核心查询速通(从入门到进阶)
DQL(Data Query Language)是 SQL 语言中最复杂、使用极其频繁的部分。我们按照查询的进阶深度逐步拆解。
1. 基本与条件查询 (WHERE)
条件查询是缩小数据结果集的第一步。包含比较、范围、集合匹配与模糊查询。
-- 基础字段查询
select name, gender, entry_date from emp;
-- 多条件组合 (AND) 与范围查询 (BETWEEN...AND... 包含边界)
select * from emp where salary > 5000 and age < 30;
select * from emp where salary between 5000 and 8000;
-- 集合查询 (IN) 与模糊匹配 (LIKE:_ 代表单个字符,% 代表任意字符)
select * from emp where job in (1, 2, 3);
select * from emp where name like '张_';
-- 💡 【空值判断避坑】:在 SQL 中判断是否为空不能用 = null,必须使用 IS NULL
select * from emp where id is null;
2. 分组查询 (GROUP BY) 与 聚合函数
底层逻辑:GROUP BY 的本质是“分堆”。它会把指定列中具有相同值的行放到同一个虚拟桶里。分组后,通常会结合聚合函数(将一列数据作为一个整体进行纵向计算)来提取各组的统计信息。常见的聚合函数有:count(计数)、max(最大值)、min(最小值)、avg(平均值)、sum(求和)。
-- 按性别分组,统计各性别总人数
select gender, count(*) from emp group by gender;
-- 按职位分组,统计各职位的最高薪资与平均薪资
select job, max(salary), avg(salary) from emp group by job;
3. 【核心面试考点】WHERE 与 HAVING 的深度解析
当条件过滤遇到分组操作时,初学者极易混淆 WHERE 和 HAVING。请务必牢记以下核心差异:
| 核心维度 | WHERE 条件 | HAVING 条件 |
|---|---|---|
| 过滤时机 | 分组前进行初步数据过滤。 | 分组后对已经分好组的数据进行二次过滤。 |
| 聚合函数支持 | 绝对不能包含聚合函数(如 count)。 | 可以且经常配合聚合函数使用。 |
| 性能考量 | 尽早执行,剔除无效数据,能大幅减少后续计算的开销。 | 较晚执行,仅用于对统计结果的最终筛选。 |
-- DQL : 分组后条件查询 (having) 与 WHERE 的结合
-- 逻辑:先剔除年龄>=30的员工(where),再按职位分组(group by),最后保留人数>2的组(having)
select job, count(*) from emp where age < 30 group by job having count(*) > 2;
三、 进阶展示:排序查询 (ORDER BY) 与 分页查询 (LIMIT)
在完成数据的条件过滤与分组统计后,如何优雅地将数据呈现给用户,是前端展示的刚需。排序和分页正是解决这一问题的核心利器。
1. 排序查询 (ORDER BY)
排序查询用于打乱数据默认的存储顺序,按照特定业务需求重新排列。
- ASC (Ascending):升序排列(从小到大)。这是 MySQL 的默认选项,不写也是按升序排。
- DESC (Descending):降序排列(从大到小)。
- 多字段排序规则:当指定多个排序字段时,系统会优先按照第一个字段排序;只有当第一个字段的值完全相同时,才会根据第二个字段进行排序,以此类推。
-- 单字段升序:查询所有员工,按年龄从小到大排 (ASC 可以省略)
select * from emp order by age asc;
-- 单字段降序:查询所有员工,按工资从高到低排
select * from emp order by salary desc;
-- 多字段组合排序:先按入职时间降序排(越晚入职越靠前);如果入职时间恰好相同,再按年龄升序排
select * from emp order by entry_date desc, age asc;
2. 分页查询 (LIMIT)
在企业级真实开发中,单表动辄百万、千万级数据。如果不加限制地将数据一次性全部查出,瞬间暴增的内存压力足以直接压垮数据库服务器和用户的浏览器。因此,分页查询是所有列表展示接口的强制规范。
⚠️ 【极其重要:分页避坑指南】
- 起始索引是从 0 开始的:第一条数据的索引是 0,不是 1!
- 通用计算公式:
起始索引 = (查询页码 - 1) * 每页展示的记录数。掌握这个公式,你就能写出通用的分页接口。
-- 分页查询 (假设业务需求是每页展示 10 条数据)
-- 查询第 1 页,起始索引为 (1-1)*10=0
select * from emp limit 0, 10;
-- 查询第 2 页,起始索引为 (2-1)*10=10
select * from emp limit 10, 10;
-- 查询第 3 页,起始索引为 (3-1)*10=20
select * from emp limit 20, 10;
四、 DQL 终极综合演练与底层逻辑
在掌握了全部碎片语法后,我们来看一段真正的企业级“终极缝合怪” SQL:
业务需求:查询年龄小于 30 岁的员工,按性别进行分组,找出人数大于 3 人的性别组,并按组内人数降序排列,最后只取排名第一的数据。
select gender, count(*) as '人数'
from emp
where age < 30
group by gender
having count(*) > 3
order by count(*) desc
limit 0, 1;
🎯 画龙点睛:SQL 的底层执行顺序
写 SQL 是从 SELECT 开始,但 MySQL 底层引擎的执行顺序却截然不同。掌握这个生命周期,你就能闭着眼睛读懂任何复杂的嵌套查询:
FROM emp:定位并锁定数据源表。WHERE age < 30:第一波过滤,砍掉不符合基础条件的数据。GROUP BY gender:将剩下的数据按照性别进行物理/逻辑分堆。HAVING count(*) > 3:对分好堆的数据进行聚合运算,剔除人数不达标的组。SELECT gender, count(*):经过重重筛选,终于提取出需要展示的具体列。ORDER BY count(*) desc:对最终提取出的结果集进行降序排列。LIMIT 0, 1:最后一步掐头去尾,精准截取需要的那一页数据返回给客户端。
结语
SQL 是一门典型的“写多过看”的实战型语言。理清了 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT 的核心执行主线后,立刻打开你的数据库终端,将代码亲自敲拭运行一遍吧!让肌肉记忆成为你走向资深架构师的第一块基石。
更多推荐



所有评论(0)