1、数据分组
(1)分组
- 按照字段分组,表示此字段相同的数据会被放到一个组中;
- 分组的目的是配合聚合函数,聚合函数会对每一组的数据分别进行统计;
- 语法:
select 字段1,字段2,聚合函数...from 表名 group by 字段1,字段2...
- 举例(注意:使用group by 的前提,前面必须要用聚合函数)
-- 分别查询男女同学的数量
select count(*) from e where sex='女';
select count(*) from e where sex='男';
select sex,count(*) from e group by sex;
- where与分组
-- 查询来自河北的不同性别学生数量
select sex,count(*) from e where hometown='河北' group by sex;
-- 用数据分组方法,统计不同地区的学生总数、平均年龄、最大年龄、最小年龄的人数;
select hometown,count(*),sum(age),avg(age),max(age),min(age) from e group by hometown;
- 综合(查询函数select + 聚合函数count + 条件函数where + 分组函数group by + 排序函数order by)
语法:select * from 表名 where 条件 group by 字段 order by 字段;
-- 用数据分组方法,统计不同地区的学生总数、平均年龄、最大年龄、最小年龄的人数,
-- 但不统计河北的学生,统计结果按学号从大到小排序;
select hometown,count(*),sum(age),avg(age),max(age),min(age) from e where hometown!='河北' group by hometown order by number desc;
(2)分组后的数据筛选
- having总是出现再group by 后面
– 用where查询男生总数;
– where先筛选符合条件的记录,然后再聚合统计;
select count(*) from e where sex='男';
– 用having查询男生总数
– having先分组聚合统计,再统计的结果中筛选;
select count(*) from e group by sex having sex='男';
(3)having配合聚合函数的使用
where 后面条件不能用聚合函数,having可以使用聚合函数;
(4)having与where筛选的区别
- where是对原始数据进行筛选
- having是对group by 之后已经分过组的数据进行筛选;
- having后面可以使用聚合函数,where 后面不能使用聚合函数
-- 查询年龄大于20的学生所来自的省份,以及对应的人数;
select hometown,count(*) from e where age>20 group by hometown;
select age,hometown,count(*) from e group by hometown having age>20;
-- 查询平均年龄大于30岁的地方名称以及对应的人数;
select hometown,count(*) from e group by hometown having avg(age)>30 ;
2、数据分页显示
(1)limit获取部分行
- 当数据过大时,在一页中查看数据时使用;
- select * from 表名 where 条件 group by 字段 order by 字段 limit start, count;
- 语法:limit+开始行(0),结束行(开始行可以省略);
- 省略start,默认从零开始,即从第一行开始。
select * from 表名 limit start,count
(2)分页
- 语法:已知每页显示m条数据,求:查询第n页的数据;
select * from 表名 limit(n-1)*m,m;
- 例子:查询表中,每页显示5条记录,求总页数;
1)查询记录总条数a;
2)使用a除以每页显示条数,得到b;
3)如果b为整数,则b为总数页;
4)如果b不为整数,则b+1为总页数。
总结
- 别名:as(表和字段都可以有别名,as可以省略)
- 过滤重复记录:distinct
- 条件函数:where
- 比较运算符:
- 逻辑运算符
- 模糊查找:like—>%,_
- 范围查找:in,between…and
- 空值判断:is null;is not null;
- 排序:order by(asc(升序,可省略),desc降序)
- 聚合函数:count,sum,max,min,avg;
- 数据分组:group by(having)
- 显示指定数量的记录:limit(start,count)