文章目录
一、介绍
- 将某个字段的相同值分为一组,分组查询的结果强调的是一个整体,每组内容只显示一行
- 分组查询的内容一般要查询分组字段,因为要知道是哪个组的信息
1、分组查询的内容
- 聚合函数:组内多条记录的统计结果
sql
-- 各个单位的人数
select
dept_id,
sum(id)
from t_user
group by dept_id
- 查询分组字段:根据某个字段分组,那么查询出来的分组字段也是一样的
sql
-- 查询所有的单位id
select
dept_id
from t_user
group by dept_id
- 查询分组字段外的其他字段:取排序后(mysql自然排序)的第一条记录的信息
sql
-- 根据单位id分组,每个单位内会有很多人,分组查询只能展示一条记录,所以会展示mysql自然排序的第一条记录的姓名
select
dept_id,
name
from t_user
group by dept_id
2、多字段分组
sql
group by 字段名,字段名......
-- 查询每个单位下各个年龄的人数
select
dept_id,
age,
sum(id)
from t_user
group by dept_id,age
3、将查询内容连接group_concat
sql
-- 默认分隔符逗号
group_concat(column,column......)
-- 指定分隔符
group_concat(column separator ';')
-
返回结果 = varchar
-
之前的分组结果都是聚合函数的结果:平均数、总和、数量,总之显示结果只会出现一条;group_concat可以将组内多条记录连接起来
-
单字段
sql-- 每个部门的员工的姓名 select dept_id, group_concat(name) name from student group by dept_id -- 结果 dept_id name 1 kimi,sally 2 tony,jim
-
多字段
sql-- 每个部门的员工的姓名、年龄 select dept_id, group_concat(name,age) info from student group by dept_id -- 结果 dept_id info 1 kimi18,sally19 2 tony20,jim21 -- 由于多字段拼接没有字符连接,借助concat_ws()函数 select dept_id, group_concat(concat_ws('-',name,age)) info from student group by dept_id -- 结果 dept_id info 1 kimi-18,sally-19 2 tony-20,jim-21
-
去重拼接
sql- 每个单位员工的年龄 select dept_id, group_concat(distinct age) age from student group by dept_id
-
排序拼接
sql- 每个单位员工的年龄,并按照年龄倒序 select dept_id, group_concat(age order by age desc) age from student group by dept_id
4、有条件的分组查询having
- 需要结合group by使用
- having与where的区别
- where只能过滤普通字段的条件
- having可以过滤普通字段的条件,也可以过滤聚合函数的条件
- 但是一般都是where过滤普通字段,having过滤分组后的聚合条件
sql
-- 单位员工>10人的单位+人数
select
dept_id,
count(id)
from t_user
group by dept_id
having count(id)>10