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
相关推荐
老邓计算机毕设1 小时前
SSM智慧社区家政服务系统80q7o(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架
松涛和鸣2 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa2 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k3 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦3 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i5 小时前
完全卸载MariaDB
数据库·mariadb