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