一、分组查询 group by
分组:将数据表记录按照指定字段进行分组,常搭配聚合函数完成分组统计。
1.基础语法
sql
select 分组字段/聚合函数
from 表名
[where 条件]
group by 分组列名 [having 条件]
[order by 排序字段];
重要规则
- select 后尽量不要使用
*,分组后*只会显示每组第一条数据,业务上无意义; - select 后面只允许写分组字段 和聚合函数;
- 执行顺序:
① where 过滤原始表数据 → ② group by 分组 → ③ having 过滤分组之后的数据
代码示例
sql
-- 示例1:按照性别分组,统计每种性别的学生人数
select stu_gender,count(stu_num) from stus group by stu_gender;
-- 示例2:按照性别分组,计算每组学生平均年龄
select stu_gender,avg(stu_age) from stus group by stu_gender;
-- 示例3:按年龄分组,统计每组人数,筛选人数大于1的分组,按年龄升序
select stu_age,count(stu_num)
from stus
group by stu_age
having count(stu_num)>1
order by stu_age;
-- 示例4:先筛选男生,按年龄分组,筛选人数大于1的分组,年龄升序排列
select stu_age,count(stu_num)
from stus
where stu_gender='男'
group by stu_age
having count(stu_num)>1
order by stu_age;
where 和 having 核心区别
- where:分组前过滤原始数据,不能识别聚合函数
- having:分组后过滤分组结果,可以使用聚合函数
二、分页查询 limit
数据量较大时,分段返回数据,实现分页展示。
1.语法格式
sql
select ...
from ...
where ...
limit param1,param2;
- param1:起始索引,从0开始
- param2:查询返回的记录条数
分页通用公式
已知:pageNum 当前页码,pageSize 每页条数
sql
select * from stus [where ...] limit (pageNum-1)*pageSize,pageSize;
代码示例
场景:数据表共10条数据,每页展示3条
sql
-- 第1页 (1-1)*3 = 0
select * from stus limit 0,3;
-- 第2页 (2-1)*3 = 3
select * from stus limit 3,3;
-- 第3页 (3-1)*3 = 6
select * from stus limit 6,3;
-- 第4页 (4-1)*3 = 9
select * from stus limit 9,3;
三、DQL完整语句顺序(重点)
书写顺序(开发写SQL遵循这个顺序)
select → from → where → group by → having → order by → limit
数据库真实执行顺序
from → where → group by → having → select → order by → limit
sql
-- 完整DQL标准模板示例
select stu_gender,avg(stu_age) avg_age
from stus
where stu_age >= 16
group by stu_gender
having avg_age > 18
order by avg_age desc
limit 0,2;