group by 分组查询,一般配合统计函数来使用
max:求最大
min:求最小
sum:求总和
avg:求平均值
count:求总行数
数据库如下表所示
id
name
age
学号
编号
1
lee
10
Null
0
2
骚猪
33
Null
1
3
张鹏
22
Null
1
4
大表哥
12
00001
0
统计函数:
max 取最大值
用法1:selectmax(列名)from 表名; 单条数据
select max(age) from msg;
用法2:select id,name,max(age),学号 from 表名;多条数据查询,用逗号隔开,仅在MySQL 中使用,但无意义,应为数值没有对应。如果有意义,必须要加 group by
select id,name,max(age),学号 from msg;
用法3:select max(列名) from 表名group by 列名#注意 group by 列名 (该列名必须是可以分组的列 )
如:取编号1,编号2这2组中,年龄最大的人,查询结果有几组,就有几行
select id,max(age) from msg group by 编号;
sum 求总和
如,求4个人总年龄
select sum(age) from msg;
min 求最小
avg 求平均值
count 求总行数
如,求总人数(行数)
select count(*) from msg;
注意:count 只能统计行数,无论 count() 中的内容是什么,如下图所示,如果要统计每个人的挂科的数量
错误写法:
select name,count(fs<60) from cj group by name;
-- count(fs<60) 并不是统计 fs<60的 个数,它依然统计行数
-- 所以得到结果
/*
+------+--------------+
| name | count(fs<60) |
+------+--------------+
| 张三 | 3 |
| 李四 | 2 |
| 王五 | 1 |
+------+--------------+
*/
正确写法:
select name,sum(fs<60) from cj group by name;
/*
1、fs <60 得到结果 为0 或1
2、求xx条件用sum ,不能用count
+------+------------+
| name | sum(fs<60) |
+------+------------+
| 张三 | 2 |
| 李四 | 2 |
| 王五 | 1 |
+------+------------+
*/
给列名加1个别名:as
select 编号as分组from msg;
with rollup
用来在分组统计数据的基础上再进行统计汇总,即用来得到group by的汇总信息
SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;