使用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,对应的数据如下所示

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7782

CLARK

MANAGER

7839

1981-06-09

2450.00

NULL

10

7839

KING

PRESIDENT

NULL

1981-11-17

5000.00

NULL

10

7934

MILLER

CLERK

7782

1982-01-23

1300.00

NULL

10

第二组 20,对应的数据如下所示

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

1980-12-17

800.00

NULL

20

7566

JONES

MANAGER

7839

1981-04-02

2975.00

NULL

20

7788

SCOTT

ANALYST

7566

1987-04-19

3000.00

NULL

20

7876

ADAMS

CLERK

7788

1987-05-23

1100.00

NULL

20

7902

FORD

ANALYST

7566

1981-12-03

3000.00

NULL

20

第三组 30 对应的数据如下所示

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7499

ALLEN

SALESMAN

7698

1981-02-20

1600.00

300.00

30

7521

WARD

SALESMAN

7698

1981-02-22

1250.00

500.00

30

7654

MARTIN

SALESMAN

7698

1981-09-28

1250.00

1400.00

30

7698

BLAKE

MANAGER

7839

1981-05-01

2850.00

NULL

30

7844

TURNER

SALESMAN

7698

1981-09-08

1500.00

0.00

30

7900

JAMES

CLERK

7698

1981-12-03

950.00

NULL

30

b 找最大值
b.1 第一组 10中的最大值为5000
b.2 第二组 20中的最大值为3000
b.3 第三组 30中的最大值为2850
c 把最大值和对应的分组字段的值作为一个整体进行展示出来

deptno

max(sal)

10

5000.00

20

3000.00

30

2850.00

2.1.5 示例sql语句运行截图

Mysql 分组合并 mysql中分组语句_Mysql 分组合并

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,对应的数据如下所示

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7782

CLARK

MANAGER

7839

1981-06-09

2450.00

NULL

10

7839

KING

PRESIDENT

NULL

1981-11-17

5000.00

NULL

10

7934

MILLER

CLERK

7782

1982-01-23

1300.00

NULL

10

第二组 20,对应的数据如下所示

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

1980-12-17

800.00

NULL

20

7566

JONES

MANAGER

7839

1981-04-02

2975.00

NULL

20

7788

SCOTT

ANALYST

7566

1987-04-19

3000.00

NULL

20

7876

ADAMS

CLERK

7788

1987-05-23

1100.00

NULL

20

7902

FORD

ANALYST

7566

1981-12-03

3000.00

NULL

20

第三组 30 对应的数据如下所示

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7499

ALLEN

SALESMAN

7698

1981-02-20

1600.00

300.00

30

7521

WARD

SALESMAN

7698

1981-02-22

1250.00

500.00

30

7654

MARTIN

SALESMAN

7698

1981-09-28

1250.00

1400.00

30

7698

BLAKE

MANAGER

7839

1981-05-01

2850.00

NULL

30

7844

TURNER

SALESMAN

7698

1981-09-08

1500.00

0.00

30

7900

JAMES

CLERK

7698

1981-12-03

950.00

NULL

30

b 第二次分组

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

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

b.1.1 MANAGER组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7782

CLARK

MANAGER

7839

1981-06-09

2450.00

NULL

10

b.1.2 PRESIDENT组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7839

KING

PRESIDENT

NULL

1981-11-17

5000.00

NULL

10

b.1.3 CLERK组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7934

MILLER

CLERK

7782

1982-01-23

1300.00

NULL

10

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

b.2.1 ANALYST组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7788

SCOTT

ANALYST

7566

1987-04-19

3000.00

NULL

20

7902

FORD

ANALYST

7566

1981-12-03

3000.00

NULL

20

b.2.2 CLERK组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7876

ADAMS

CLERK

7788

1987-05-23

1100.00

NULL

20

7369

SMITH

CLERK

7902

1980-12-17

800.00

NULL

20

b.2.3 MANAGER组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7566

JONES

MANAGER

7839

1981-04-02

2975.00

NULL

20

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

b.3.1 CLERK组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7900

JAMES

CLERK

7698

1981-12-03

950.00

NULL

30

b.3.2 MANAGER组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7698

BLAKE

MANAGER

7839

1981-05-01

2850.00

NULL

30

b.3.3 SALESMAN组

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7499

ALLEN

SALESMAN

7698

1981-02-20

1600.00

300.00

30

7844

TURNER

SALESMAN

7698

1981-09-08

1500.00

0.00

30

7521

WARD

SALESMAN

7698

1981-02-22

1250.00

500.00

30

7654

MARTIN

SALESMAN

7698

1981-09-28

1250.00

1400.00

30

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 根据最大值和具体的几个分组字段作为一个整体展示出来

deptno

job

max(sal)

10

CLERK

1300.00

10

MANAGER

2450.00

10

PRESIDENT

5000.00

20

ANALYST

3000.00

20

CLERK

1100.00

20

MANAGER

2975.00

30

CLERK

950.00

30

MANAGER

2850.00

30

SALESMAN

1600.00

2.1.5 示例sql语句运行截图

Mysql 分组合并 mysql中分组语句_mysql_02

3 注意点

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

3.1.1 示例sql语句

SELECT product_type
FROM product
GROUP BY product_type;

3.1.2 示例sql语句运行截图

Mysql 分组合并 mysql中分组语句_分组查询_03

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语句运行截图

Mysql 分组合并 mysql中分组语句_Mysql 分组合并_04

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语句运行截图

Mysql 分组合并 mysql中分组语句_Mysql 分组合并_05