mysql的分组group by

文章目录


一、介绍

  • 将某个字段的相同值分为一组,分组查询的结果强调的是一个整体,每组内容只显示一行
  • 分组查询的内容一般要查询分组字段,因为要知道是哪个组的信息

1、分组查询的内容

  1. 聚合函数:组内多条记录的统计结果
sql 复制代码
-- 各个单位的人数
select
    dept_id,
    sum(id)
from t_user
group by dept_id
  1. 查询分组字段:根据某个字段分组,那么查询出来的分组字段也是一样的
sql 复制代码
-- 查询所有的单位id
select
    dept_id
from t_user
group by dept_id
  1. 查询分组字段外的其他字段:取排序后(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
相关推荐
星恒随风6 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
吴名氏.7 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
爱码少年8 小时前
Springboot下如何将CSV文件数据导入H2、Mysql数据库表
数据库·mysql·csv
2603_969694859 小时前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea9 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
阿义有问题10 小时前
MySQL 迁移达梦全流程实战:DTS 七步图解 + 对象名全大写适配(附踩坑清单)
数据库
猫猫不是喵喵.12 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
lsc_blog14 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
墨痕诉清风14 小时前
SSRF漏洞实战记录+OSS桶命令执行+MCP漏洞
linux·服务器·数据库
Ashe81317 小时前
MySQL 慢日志先别急着加索引:三个指标能拦掉大半误判
数据库