MySQL GROUP BY 语句
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
GROUP BY 语法
SELECTcolumn_name,function(column_name) FROMtable_name WHEREcolumn_nameoperatorvalue GROUPBYcolumn_name;
实例演示
本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。
SETNAMESutf8; SETFOREIGN_KEY_CHECKS=0; ------------------------------ --Tablestructurefor`employee_tbl` ------------------------------ DROPTABLEIFEXISTS`employee_tbl`; CREATETABLE`employee_tbl`( `id`int(11)NOTNULL, `name`char(10)NOTNULLDEFAULT'', `date`datetimeNOTNULL, `signin`tinyint(4)NOTNULLDEFAULT'0'COMMENT'登录次数', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8; ------------------------------ --Recordsof`employee_tbl` ------------------------------ BEGIN; INSERTINTO`employee_tbl`VALUES ('1','小明','2022-03-2115:25:33','1'), ('2','小王','2022-03-2015:25:47','3'), ('3','小丽','2022-03-1915:26:02','2'), ('4','小王','2022-03-0715:26:14','4'), ('5','小明','2022-03-1115:26:40','4'), ('6','小明','2022-03-0415:26:54','2'); COMMIT; SETFOREIGN_KEY_CHECKS=1;
导入成功后,执行以下 SQL 语句:
mysql>setnamesutf8; mysql>SELECT*FROMemployee_tbl; +----+--------+---------------------+--------+ |id|name|date|signin| +----+--------+---------------------+--------+ |1|小明|2022-03-2115:25:33|1| |2|小王|2022-03-2015:25:47|3| |3|小丽|2022-03-1915:26:02|2| |4|小王|2022-03-0715:26:14|4| |5|小明|2022-03-1115:26:40|4| |6|小明|2022-03-0415:26:54|2| +----+--------+---------------------+--------+ 6rowsinset(0.00sec)
接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
mysql>SELECTname,COUNT(*)FROMemployee_tblGROUPBYname; +--------+----------+ |name|COUNT(*)| +--------+----------+ |小明|3| |小王|2| |小丽|1| +--------+----------+ 3rowsinset(0.02sec)
使用 WITH ROLLUP
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:
mysql>SELECTname,SUM(signin)assignin_countFROMemployee_tblGROUPBYnameWITHROLLUP; +--------+--------------+ |name|signin_count| +--------+--------------+ |小丽|2| |小明|7| |小王|7| |NULL|16| +--------+--------------+ 4rowsinset(0.00sec)
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
selectcoalesce(a,b,c);
参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。
mysql>SELECTcoalesce(name,'总数'),SUM(signin)assignin_countFROMemployee_tblGROUPBYnameWITHROLLUP; +--------------------------+--------------+ |coalesce(name,'总数')|signin_count| +--------------------------+--------------+ |小丽|2| |小明|7| |小王|7| |总数|16| +--------------------------+--------------+ 4rowsinset(0.00sec)