使用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 empGROUP 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语句运行截图
使用mysql语句进行分组查询相关推荐
- mysql按月份分组查询_mysql如何按月份分组查询
mysql按月份分组查询的方法:根据format字符串格式化date值,语法为[DATE_FORMAT(date,format)],其中[%M ]为月的名字. mysql按月份分组查询的方法:sele ...
- SQL语句之分组查询--GROUP BY(group by)
SQL语句之分组查询–GROUP BY(group by) 语法 select 聚合函数,列(要求出现在group by的后面)from 表where 筛选条件group by 分组的列表order ...
- mysql 连接 分组_详解MySQL中的分组查询与连接查询语句
分组查询 group by group by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表 ...
- mysql 连接查询分组_详解MySQL中的分组查询与连接查询语句
分组查询 group bygroup by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达 ...
- mysql 分组查询 语句_详解MySQL中的分组查询与连接查询语句
分组查询 group bygroup by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达 ...
- 2020-09-10 MYSQL按时间段分组查询当天,每小时,15分钟数据分组
查询的需求比较麻烦,根据spreader_id和返回的状态码来判断事件的回传成功率,但是还需要新增时间段的查询,比如产品要的是每15分钟内数据的回传成功率. 这样的话就需要对时间段进行分组查询,我保存 ...
- mysql按照学生分组查询_将student表按照gender字段值进行分组查询,并计算每个分组中有多少名学生_学小易找答案...
[简答题]查询student表中一共有多少条记录 [简答题]在department表和employee表之间分别使用where查询.自连接查询 [简答题]使用DESC查看学生表和班级表 [简答题]在表 ...
- mysql数据库如何分组查询_数据库MySQL--分组查询
分组数据:group by 子句 分组查询语法: select 分组函数,列(要求是出现在group by的后面) from 表 (where 筛选条件) # where 必须连接from关键字 g ...
- 第七期,MySQL如何创建分组查询!!!!
分组查询 group by 子句 1.group by 子句 使用 group by 子句可以将数据划分到不同的组中,实现对记录的分组查询.group by 从英文字面的意义上可以理解为"根 ...
最新文章
- docker容器互联实战
- UA MATH567 高维统计II 随机向量9 图的Max-cut问题 0.878近似算法
- LaTeX文档插入图片的几种常用方法
- SAP UI5里一个包含众多操作的OData请求url实例
- python word
- 《全数据时代的炼金师》全书语言生动、易懂
- Django signal
- 自学python买什么教材-Python 有哪些入门学习方法和值得推荐的经典教材?
- QT显示图片和中途修改图片
- JVM内存大小配置方式
- MySQL int类型的显示
- MAYA安装包+安装教程
- QQ坦白说查看好友方法攻略
- Android中的Action和Category常量表
- gtx1050ti安装win10和ubuntu16.04双系统
- html5源码 母亲节,母亲节H5:非常有创意的5款母亲节H5案例分享
- contest 12.31
- 托福艺术导向(纪录片《文明》单词总结)PART1
- python怎么使用数据库系统有什么好处_数据库简单介绍
- 秒云“生活梦想家”计划,从一杯手冲开启