在上一篇中,我们学会了 DQL 的基础查询和聚合函数,今天继续深入学习 条件查询 和 分组查询 ------ 这是 DQL 中最常用的组合技巧,比如 "筛选成绩优秀的学生""按班级统计人数",都需要这两个知识点配合。所有案例仍基于 sicheng 数据库的 student 表。
目录
[1. 常用条件运算符汇总](#1. 常用条件运算符汇总)
[2. 条件查询实战案例](#2. 条件查询实战案例)
[1. 分组查询基本语法](#1. 分组查询基本语法)
[2. where 与 having 的核心区别](#2. where 与 having 的核心区别)
[3. 分组查询实战案例](#3. 分组查询实战案例)
[4. 分组查询注意事项](#4. 分组查询注意事项)
一、条件查询:筛选符合要求的记录
条件查询的核心是 where 子句,在 from 之后添加,用于过滤出符合条件的记录。常用的条件运算符分为 比较运算符 、逻辑运算符 、特殊运算符 三类。
1. 常用条件运算符汇总
| 运算符类型 | 符号 / 关键字 | 说明 | 示例(学生表) |
|---|---|---|---|
| 比较运算符 | >、>=、<、<= | 大小比较 | age > 16(年龄大于 16) |
| 比较运算符 | = | 等于 | gender = '女'(性别为女) |
| 比较运算符 | <> 或!= | 不等于 | class <> '高一(1)班'(非 1 班) |
| 逻辑运算符 | and | 并且(多条件同时满足) | age > 16 and gender = '男' |
| 逻辑运算符 | or | 或者(满足任一条件) | score > 90 or class = '高一(3)班' |
| 特殊运算符 | between ... and ... | 范围查询(包含边界) | score between 80 and 90(成绩 80-90) |
| 特殊运算符 | in (值 1, 值 2...) | 匹配列表中的任意值 | age in(16,17)(年龄 16 或 17) |
| 特殊运算符 | like | 模糊匹配 | name like '张%'(姓张的学生) |
| 特殊运算符 | is null / is not null | 判断是否为 null | address is not null(地址非空) |
2. 条件查询实战案例
案例 1:基础条件筛选
需求:查询高一 (2) 班的所有学生。
sql
select * from student where class = '高一(2)班';
执行结果:返回 3 条记录(李四、赵六、郑十)。
案例 2:多条件组合(and)
需求:查询年龄大于等于 16 岁且成绩大于等于 90 分的女生。
sql
select * from student where age >= 16 and score >= 90 and gender = '女';
执行结果:返回 2 条记录(孙七、钱十一)。
案例 3:范围查询(between and)
需求:查询成绩在 80~90 分之间的学生(包含 80 和 90)。
sql
select * from student where score between 80 and 90;
注意:between 后是最小值,and 后是最大值,顺序不能反(如 between 90 and 80 会无结果)。
案例 4:模糊查询(like)
模糊查询用通配符匹配:
%:匹配任意多个字符(包括 0 个);_:匹配单个字符。
需求 1:查询姓张的学生(姓名以 "张" 开头)。
sql
select * from student where name like '张%';
需求 2:查询姓名为两个字的学生。
sql
select * from student where name like '__';
案例 5:in 运算符(简化多值匹配)
需求:查询年龄为 16 或 18 岁的学生(替代 age=16 or age=18)。
sql
select * from student where age in(16,18);
执行结果:返回 6 条记录(16 岁:张三、王五、周八、钱十一;18 岁:赵六、吴九、孙十二)。
二、分组查询:按类别统计数据
分组查询的核心是 group by 子句,通常和聚合函数配合使用,比如 "按班级分组统计人数""按性别分组求平均成绩"。
1. 分组查询基本语法
sql
select 分组字段,聚合函数(字段)
from 表名
[where 分组前条件]
group by 分组字段
[分组和条件];
2. where 与 having 的核心区别
这是面试高频考点,一定要分清:
| 对比项 | where | having |
|---|---|---|
| 执行时机 | 分组前过滤 | 分组后过滤 |
| 聚合函数 | 不能使用聚合函数作为条件 | 可以使用聚合函数作为条件 |
| 作用对象 | 原始记录 | 分组后的结果 |
3. 分组查询实战案例
案例 1:基础分组(按性别分组统计人数)
需求:统计男生和女生的人数。
sql
select gender as '性别',count(id) as '总数'
from student
group by gender;
执行结果:
- 男:6 人;
- 女:4 人。
案例 2:分组前过滤(where)
需求:统计年龄大于 16 岁的学生中,每个班级的人数。
sql
select class 班级,count(*) 人数
from student
where age > 16
group by class;
执行结果:
- 高一 (1) 班:2 人(孙七、孙十二);
- 高一 (2) 班:3 人(李四、赵六、郑十);
- 高一 (3) 班:1 人(吴九)。
案例 3:分组后过滤(having)
需求:统计每个班级的平均成绩,只显示平均成绩大于 85 分的班级。
sql
select class 班级, avg(score) 平均成绩
from student
group by class
having 平均成绩 > 85;
执行结果:
- 高一 (1) 班:(85.5+78.5+90.0+79.0)/4 = 83.25(不满足);
- 高一 (2) 班:(92.0+88.0+81.0)/3 = 87.0(满足);
- 高一 (3) 班:(76.0+89.5+95.0)/3 ≈ 86.83(满足)。
4. 分组查询注意事项
select中只能包含 分组字段 和 聚合函数 ,查询其他字段无实际意义(比如分组后查name,只会显示每组第一条记录的姓名);- 执行顺序:
where→ 分组 → 聚合函数 →having; - 聚合函数可以设置别名,
having中可直接使用别名(如having 平均成绩 > 85)。
三、核心知识点总结
| 知识点 | 核心内容 | 易错点 |
|---|---|---|
| 条件查询 | where 子句配合运算符筛选记录;between and 是闭区间;like 通配符区分 % 和 _ |
between 顺序反了会无结果;like '__' 匹配两个字符 |
| 逻辑运算符 | and 同时满足,or 满足其一;多条件建议用括号分组(如 (age>16 and gender='女') or score>90) |
运算符优先级:and 高于 or,易导致条件错误 |
| 分组查询 | group by 按字段分组,where 分组前过滤,having 分组后过滤 |
select 中混入非分组 / 非聚合字段,无实际意义 |
| having 用法 | 可使用聚合函数作为条件,可复用聚合函数别名 | where 中不能使用聚合函数(如 where count(*) > 5 报错) |
四、预告:排序与分页查询
本文我们掌握了条件查询和分组查询,接下来会学习 DQL 的收尾技巧 ------排序查询 (按成绩 / 年龄排序)和 分页查询(实现分页展示学生列表),这是前端分页功能的核心逻辑。关注我,下一篇继续吃透 DQL!
希望这篇文章对你有帮助,如果你有任何问题或建议,欢迎在评论区留言。谢谢阅读(求攒攒 收藏 关注)!
