【MySQL 零基础入门】DQL 核心语法(二):表条件查询与分组查询篇

在上一篇中,我们学会了 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. 分组查询注意事项

  1. select 中只能包含 分组字段聚合函数 ,查询其他字段无实际意义(比如分组后查 name,只会显示每组第一条记录的姓名);
  2. 执行顺序:where → 分组 → 聚合函数 → having
  3. 聚合函数可以设置别名,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!


希望这篇文章对你有帮助,如果你有任何问题或建议,欢迎在评论区留言。谢谢阅读(求攒攒 收藏 关注)!

相关推荐
三少爷的鞋25 分钟前
Android 协程时代,Handler 应该退休了吗?
android
NineData9 小时前
NineData 迁移评估功能正式上线
数据库·dba
tingshuo29179 小时前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
火柴就是我14 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
NineData14 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师17 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
砖厂小工21 小时前
用 GLM + OpenClaw 打造你的 AI PR Review Agent — 让龙虾帮你审代码
android·github
全栈老石21 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
张拭心21 小时前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
张拭心21 小时前
Android 17 来了!新特性介绍与适配建议
android·前端