数据分组
一、分组
- 按照字段分组,表示此字段相同的数据会放到一个组中
- 分组的目的是配合聚合函数,聚合函数会对每一组数据分别进行统计;
语法:select 字段1,字段2,聚合函数...from表名 group by 字段1,字段2...
例1:查询各种sex性别的人数
select sex,count(*) from students group by sex;
例2:查询各种age年龄的人数
select age,count(*) from students group by age;
练习:用数据分组方法,统计各个班级学生总数、平均年龄、最大年龄、最小年龄。
select class,count(*),avg(age),max(age),min(age) from students GROUP BY class;
group by 与where条件一起使用
-- 查询‘1班’不同性别学生的数量
select class,sex,count(*) from students where class='1班' group by sex;
where和group by和order by的顺序
语法:select * from 表名where 条件 group by 字段 order by 字段
-- 练习:用数据分组方法,统计各个班级学生总数、平均年龄、最大年龄、最小年龄。
-- 但不统计3班,统计结果按班级名称从大到小排序
select class,count(*),avg(age),max(age),min(age)
from students where class!='3班'
GROUP BY class
ORDER BY class desc;
二、分组后的数据筛选
语法:
select 字段1,字段2,聚合... from 表名
group by 字段1,字段2,字段3...
having 字段1,... 聚合...
- having 后面的条件运算符与where的相同
例1:使用where子句,查询男生总人数
(先筛选复合条件的记录,然后在聚合统计)
SELECT sex,count(*) from students where sex='男';
例2:使用having子句,查询男生总人数
(先分组聚合统计,在统计的结果中筛选)
select count(*) from students group by sex having sex='男';
练习:用having子句,查询除了‘1班’以外,其他各个班级学生的平均年龄、最大年龄、最小年龄;
select class,count(*) from students group by class having count(*)>2;
- 对比where与having
- where是对from后面指定的表进行数据筛选,属于对原始数据的筛选;
- having是对group by 的结果进行筛选;
- having后面的条件中可以用聚合函数,where后面的条件不可以使用聚合函数。
练习:查询班级总人数大于2人的班级名称以及班级对应的总人数;
select class,count(*) from students group by class having count(*)>2;
数据分页显示
一、获取部分行
语法:select * from 表名 limit start,count;(limit语句总是出现在select语句的最后)
- 从start开始,获取count条数据
- start索引从0开始,省略start默认从0开始;
例1:查询前3行学生记录
select * from students limit 0,3;
例2:省略start,查询前5行学生记录
select * from students limit 5;
练习:查询从第4行开始的第3条学生记录;
select *from students limit 4,3;
练习:查询年龄最大的学生记录,使用limit语句
select * from students order by age desc limit 1;
当有where或group by 或者order by,limit总是出现在最后
二、分页
已知:每页显示m条数据,求第n页的数据
select * from students limit(n-1)*m,m;
例1:每页显示4条记录,查询第3页的数据
m=4,n=3 (3-1)*4=8
select * from students limit 8,4;