• mysql的分组group by



    一、介绍

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

    1、分组查询的内容

    1. 聚合函数:组内多条记录的统计结果
    -- 各个单位的人数
    select
        dept_id,
        sum(id)
    from t_user
    group by dept_id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 查询分组字段:根据某个字段分组,那么查询出来的分组字段也是一样的
    -- 查询所有的单位id
    select
        dept_id
    from t_user
    group by dept_id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 查询分组字段外的其他字段:取排序后(mysql自然排序)的第一条记录的信息
    -- 根据单位id分组,每个单位内会有很多人,分组查询只能展示一条记录,所以会展示mysql自然排序的第一条记录的姓名
    select
        dept_id,
        name
    from t_user
    group by dept_id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、多字段分组

    group by 字段名,字段名......
    
    -- 查询每个单位下各个年龄的人数
    select
        dept_id,
        age,
        sum(id)
    from t_user
    group by dept_id,age
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、将查询内容连接group_concat

    -- 默认分隔符逗号
    group_concat(column,column......)
    
    -- 指定分隔符
    group_concat(column separator ';')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 返回结果 = varchar

    • 之前的分组结果都是聚合函数的结果:平均数、总和、数量,总之显示结果只会出现一条;group_concat可以将组内多条记录连接起来

    • 单字段

      -- 每个部门的员工的姓名
      select
          dept_id,
          group_concat(name) name
      from student
      group by dept_id
      
      -- 结果
      dept_id     name
      1           kimi,sally
      2           tony,jim
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 多字段

      -- 每个部门的员工的姓名、年龄
      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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    • 去重拼接

      - 每个单位员工的年龄
      select
          dept_id,
          group_concat(distinct age) age
      from student
      group by dept_id
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 排序拼接

      - 每个单位员工的年龄,并按照年龄倒序
      select
          dept_id,
          group_concat(age order by age desc) age
      from student
      group by dept_id
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    4、有条件的分组查询having

    • 需要结合group by使用
    • having与where的区别
      • where只能过滤普通字段的条件
      • having可以过滤普通字段的条件,也可以过滤聚合函数的条件
      • 但是一般都是where过滤普通字段,having过滤分组后的聚合条件
    -- 单位员工>10人的单位+人数
    select
        dept_id,
        count(id)
    from t_user
    group by dept_id
    having count(id)>10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    基于Vue和Spring Boot的在线点餐系统设计与实现
    使用vue-cli搭建SPA项目
    go语言 实现正向代理
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.10 jetcache 本地缓存方案
    【云原生kubernetes从入门到实践系列教程 ] 三.docker 镜像仓库
    Centos( 或Linux )下定时删除N天前的文件脚本
    路由器实现 IP 子网之间的通信
    Access — Cookie注入
    关于标准库中的string类 - c++
    【Redis笔记】基于Redis的Stream结构作为消息队列,实现异步任务
  • 原文地址:https://blog.csdn.net/weixin_43476020/article/details/132831421