• 使用mysql语句进行分组查询


    使用mysql语句进行分组查询

    1 作用

    对整个数据表的某几个字段进行分组,然后通过分组函数得到我们想要的结果

    2 如何用

    2.1 只分一个组

    2.1.1 本质

    就是根据分组字段把整个表的数据分为几组,然后分别对每组里面的数据进行汇总查询或者计算

    2.1.2 语法

    SELECT 分组字段,分组函数(汇总结果字段)
    FROM 表名
    GROUP BY 分组字段;
    
    • 1
    • 2
    • 3

    2.1.3 示例sql语句

     SELECT deptno,max(sal)
     FROM emp
     GROUP BY deptno;
     /*
     查询出emp(员工表)中每个部门中最高薪水是多少
     deptno是部门编号的意思,sal是薪水的意思
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.1.4 分析过程

    a 分组

    按照deptno字段可以把emp表分为三组(分组是没有先后顺序的,谁是第一组都行)

    分组的数据的标题(EMPNO,ENAME…)实际上只是为了看的更清楚,它实际并不参与分组的

    第一组 10,对应的数据如下所示
    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7782CLARKMANAGER78391981-06-092450.00NULL10
    7839KINGPRESIDENTNULL1981-11-175000.00NULL10
    7934MILLERCLERK77821982-01-231300.00NULL10
    第二组 20,对应的数据如下所示
    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7369SMITHCLERK79021980-12-17800.00NULL20
    7566JONESMANAGER78391981-04-022975.00NULL20
    7788SCOTTANALYST75661987-04-193000.00NULL20
    7876ADAMSCLERK77881987-05-231100.00NULL20
    7902FORDANALYST75661981-12-033000.00NULL20
    第三组 30 对应的数据如下所示
    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7499ALLENSALESMAN76981981-02-201600.00300.0030
    7521WARDSALESMAN76981981-02-221250.00500.0030
    7654MARTINSALESMAN76981981-09-281250.001400.0030
    7698BLAKEMANAGER78391981-05-012850.00NULL30
    7844TURNERSALESMAN76981981-09-081500.000.0030
    7900JAMESCLERK76981981-12-03950.00NULL30
    b 找最大值
    b.1 第一组 10中的最大值为5000
    b.2 第二组 20中的最大值为3000
    b.3 第三组 30中的最大值为2850
    c 把最大值和对应的分组字段的值作为一个整体进行展示出来
    deptnomax(sal)
    105000.00
    203000.00
    302850.00

    2.1.5 示例sql语句运行截图

    在这里插入图片描述

    2.2 分多个组

    2.2.1 语法

    SELECT 分组字段1,分组字段2....分组字段n,分组函数(汇总结果字段)
    FROM 表名
    GROUP BY 分组字段1,分组字段2....分组字段n;
    
    • 1
    • 2
    • 3

    2.2.2 本质

    根据分组字段1进行分组,在分好的组里面再用分组字段2进行分组,得到相应的组,然后在相应的组里面再根据分组字段3再一次分组,然后后面就依此类推了

    结论:后一个分组字段都是根据前一个分组字段分好的组里面进行再次分组的,其中第一个分组字段是根据整个数据表中的所有数据行进行分组的**,可以粗略理解成第一个分组字段的前一个分组字段分好后的结果就是一组,该组包含数据表中是所有数据行**(默认不写分组的结果就是把表中所有数据行当成一组)

    2.1.3 示例sql语句

    SELECT deptno,job,max(sal)
    FROM emp
    GROUP BY deptno,job;
     /*
     查询出emp(员工表)中每个部门中每种职位的最高工资
     deptno是部门编号的意思,sal是薪水的意思
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.1.4 分析过程

    a 第一次分组

    按照deptno字段可以把emp表分为三组,分组的数据的标题(EMPNO,ENAME…)实际上只是为了看的更清楚,它实际并不参与分组的

    第一组 10,对应的数据如下所示
    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7782CLARKMANAGER78391981-06-092450.00NULL10
    7839KINGPRESIDENTNULL1981-11-175000.00NULL10
    7934MILLERCLERK77821982-01-231300.00NULL10
    第二组 20,对应的数据如下所示
    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7369SMITHCLERK79021980-12-17800.00NULL20
    7566JONESMANAGER78391981-04-022975.00NULL20
    7788SCOTTANALYST75661987-04-193000.00NULL20
    7876ADAMSCLERK77881987-05-231100.00NULL20
    7902FORDANALYST75661981-12-033000.00NULL20
    第三组 30 对应的数据如下所示
    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7499ALLENSALESMAN76981981-02-201600.00300.0030
    7521WARDSALESMAN76981981-02-221250.00500.0030
    7654MARTINSALESMAN76981981-09-281250.001400.0030
    7698BLAKEMANAGER78391981-05-012850.00NULL30
    7844TURNERSALESMAN76981981-09-081500.000.0030
    7900JAMESCLERK76981981-12-03950.00NULL30
    b 第二次分组

    在第一次分好的组的基础上,按照job(职位)的不同进行再次分组

    b.1 部门编号为10的组 再次分组的结果如下所示

    b.1.1 MANAGER组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7782CLARKMANAGER78391981-06-092450.00NULL10

    b.1.2 PRESIDENT组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7839KINGPRESIDENTNULL1981-11-175000.00NULL10

    b.1.3 CLERK组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7934MILLERCLERK77821982-01-231300.00NULL10
    b.2 部门编号为20的组 再次分组的结果如下所示

    b.2.1 ANALYST组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7788SCOTTANALYST75661987-04-193000.00NULL20
    7902FORDANALYST75661981-12-033000.00NULL20

    b.2.2 CLERK组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7876ADAMSCLERK77881987-05-231100.00NULL20
    7369SMITHCLERK79021980-12-17800.00NULL20

    b.2.3 MANAGER组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7566JONESMANAGER78391981-04-022975.00NULL20
    b.3 部门编号为30的组 再次分组的结果如下所示

    b.3.1 CLERK组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7900JAMESCLERK76981981-12-03950.00NULL30

    b.3.2 MANAGER组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7698BLAKEMANAGER78391981-05-012850.00NULL30

    b.3.3 SALESMAN组

    EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
    7499ALLENSALESMAN76981981-02-201600.00300.0030
    7844TURNERSALESMAN76981981-09-081500.000.0030
    7521WARDSALESMAN76981981-02-221250.00500.0030
    7654MARTINSALESMAN76981981-09-281250.001400.0030
    c 找每个部门中每个岗位的最大薪水值
    c.1 部门编号为10的部门中

    CLERK职位的最高薪水为1300

    MANAGER职位的最高薪水是2450

    PRESIDENT职位的最高薪水是5000

    c.2 部门编号为20的部门中

    CLERK职位的最高薪水为1100

    MANAGER职位的最高薪水是2975

    ANALYST职位的最高薪水是3000

    c.2 部门编号为20的部门中

    CLERK职位的最高薪水为950

    MANAGER职位的最高薪水是2850

    SALESMAN职位的最高薪水是1600

    d 根据最大值和具体的几个分组字段作为一个整体展示出来
    deptnojobmax(sal)
    10CLERK1300.00
    10MANAGER2450.00
    10PRESIDENT5000.00
    20ANALYST3000.00
    20CLERK1100.00
    20MANAGER2975.00
    30CLERK950.00
    30MANAGER2850.00
    30SALESMAN1600.00

    2.1.5 示例sql语句运行截图

    在这里插入图片描述

    3 注意点

    3.1 分组的字段有null值,会把该字段所有的null值看成一组

    3.1.1 示例sql语句

    SELECT product_type
    FROM product
    GROUP BY product_type;
    
    • 1
    • 2
    • 3

    3.1.2 示例sql语句运行截图

    在这里插入图片描述

    3.2 当有GROUP BY子句时,SELECT子句中只能出现分组字段和分组函数,不能出现非分组字段

    3.2.1 分析

    因为分组字段进行分组想要查询出来的数据行一般是比原表小的,而SELECT中有非分组字段,非分组字段的数据行是与原表一致,可以明显看出此时非分组字段比分组字段的结果要多了,查询时,就会随机一个非分组字段与分组字段进行匹配,那么这样一来就得不到我们想要的结果了

    3.2.2 错误示例sql语句

    SELECT product_name,count(product_type) '数量'
    FROM product
    GROUP BY product_type;
    
    • 1
    • 2
    • 3

    3.2.3 错误示例sql语句运行截图

    在这里插入图片描述

    3.3 GROUP BY子句中不能出现SELECT子句中的别名

    3.2.1 分析

    GROUP BY子句的执行顺序永远在SELECT 子句之前,在执行GROUP BY子句的时候,你都没有执行SELECT子句,那么哪里会有SELECT子句中的别名给你用呢?要先存在才能用嘛!!!

    3.2.2 错误示例sql语句

    SELECT product_type '商品种类'
    FROM product
    GROUP BY '商品种类';
    
    • 1
    • 2
    • 3

    3.2.3 错误示例sql语句运行截图

    在这里插入图片描述

  • 相关阅读:
    CLI、CLR、CTS、CLS
    用c语言实现矩阵转置
    Day49——盒子类型,浮动属性,定位属性,JavaScript基础语法
    元强化学习 论文理解 MAESN
    致与青春同行的代码
    node.js结合redis+mysql
    Euclid空间or欧式空间(定义、正交性、正交变换、对称变换)&酉空间(定义、酉变换、Hermite变换、正规矩阵)
    C语言的结构体
    二零二三充能必读 | 1024程序员狂欢节 —— 掌握前沿技术,探索未知领域
    TensorFlow学习笔记
  • 原文地址:https://blog.csdn.net/SSS4362/article/details/126312605