使用mysql语句进行分组查询

使用mysql语句进行分组查询

1 作用

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

2 如何用

2.1 只分一个组

2.1.1 本质

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

2.1.2 语法
SELECT 分组字段,分组函数(汇总结果字段)
FROM 表名
GROUP BY 分组字段;
2.1.3 示例sql语句
 SELECT deptno,max(sal)
 FROM emp
 GROUP BY deptno;
 /*
 查询出emp(员工表)中每个部门中最高薪水是多少
 deptno是部门编号的意思,sal是薪水的意思
 */
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;
2.2.2 本质

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

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

2.1.3 示例sql语句
SELECT deptno,job,max(sal)
FROM emp
GROUP BY deptno,job;
 /*
 查询出emp(员工表)中每个部门中每种职位的最高工资
 deptno是部门编号的意思,sal是薪水的意思
 */
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;
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;
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 '商品种类';
3.2.3 错误示例sql语句运行截图

在这里插入图片描述

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值