前情回顾
之前,我们已经学习了聚合函数,可以通过聚合函数,进行一些我们希望的计算和统计,比如说,我们可以统计出总共有多少条数据,但是这样的功能显然还不够。
试设想这样一个场景,小区通过数据库记录了每天的进出的人员名单,如果,我们希望分别统计出每天到底有多少人进出,那么,如果按照之前学习的方法,只使用聚合函数和where,一点点进行统计的话,显然是不能让人满意的。因此,我们可以通过分组的功能,一次完成。
首先,我们创建这样的一个数据表。
create table Access(
id int not null auto_increment,
name varchar(50) not null,
status enum('进入', '外出'),
time date not null,
primary key(id)
)
按照惯例,我们为这个数据表,插入一些数据
insert into Access values
(0, '小王', '进入', '2021-12-10'),
(0, '小张', '进入', '2021-12-10'),
(0, '老李', '外出', '2021-12-10'),
(0, '小王', '外出', '2021-12-10'),
(0, '小花', '进入', '2021-12-11'),
(0, '小王', '进入', '2021-12-11'),
(0, '小张', '外出', '2021-12-11'),
(0, '小白', '外出', '2021-12-11'),
(0, '老关', '进入', '2021-12-11'),
(0, '小花', '外出', '2021-12-12'),
(0, '小王', '进入', '2021-12-13'),
(0, '老关', '外出', '2021-12-13'),
(0, '小蒋', '外出', '2021-12-13'),
(0, '大姜', '进入', '2021-12-13'),
(0, '小花', '进入', '2021-12-14');
使用group by分组查询
select <列1>, <列2>...
from <表名>
group by <列1>, <列2>...;
按照这个规则,比如,我们想要统计每天都有多少人进出,只需要这样做
select time as 时间, count(*) as 人数
from Access
group by time;
或者,我们想要统计每天分别有多少人进出,可以这样做
select time as 时间, status as 方向, count(*) as 人数
from Access
group by time, status;
如果想要统计这段时间,每个人,总共有多少条进出记录,可以这样做
select name as 姓名, count(*) as 次数
from Access
group by name;
group by与where配合使用
如果,要将group by与where配合使用,那么一定要将where写在group by的前边。如果把where写在group by的后边,这样做在语法上是不正确的。
select <列1>, <列2>...
from <表名>
where <条件>
group by <列1>, <列2>...;
比如说,我们可以尝试查询,2021年12月13日以前,每天进来的人数,那么可以这样做
select time as 时间, count(*) as 人数
from Access
where time < '2021-12-13'
group by time;