Mysql — Group by用法说明

Posted 江湖@小小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql — Group by用法说明相关的知识,希望对你有一定的参考价值。

1. sql 执行顺序

分组函数:sum,count,avg,max,min


eg:
	select  ... fromwhere 条件
	group by 字段(或者字面量)
	having (过滤)分组之后条件
	order by 字段 desc(或者 asc 默认升序)
	limit 0,5;

执行顺序:

	1. from
	2. where
	3. group by
	4. having
	5. select
	6. order by
	7. limit

反例(表数据如下)select * from emp where sum(emp.sal) > 5000
	[Err] 1111 - Invalid use of group function

即:where 后面呢不能使用分组函数;where 先执行,再执行group by。

因为执行 where 条件时,此时还未分组,无法执行sum函数。

注:
 当查询语句中没有 group by 关键字时,默认把整个表当成一组。

eg:
select sum(sal) from emp;   --  语句能正常执行。

注:
因为select执行顺序在 group by 之后,
当查询的时候,
已经分组完毕,所以能够执行sum(sal)


2. 反例测试


3. 两个字段联合分组

eg:查询每个部门,不同工作岗位的最高工资

表数据:


-- 查询每个部门,不同工作岗位的最高工资
SELECT 
e.dept,e.job_type,max(sal) 
from emp e 
GROUP BY e.dept,e.job_type;


注:1. group by 后面可以跟多个字段,即根据多个字段进行联合分组
	2. group by 之后,select 后面的字段可以跟的字段:
	   group by 的字段 
	   分组函数中的字段,
	   如例子中 sum() 中的 sal字段课题添加。



查询结果:

5. 使用Having关键字对分组之后的数据进一步过滤

注:having 关键字不能放在where之前,只能搭配 group by 使用。

eg:查询每个部门最高薪资,要求只显示最高薪资大于1000的?



-- 查询每个部门最高薪资,要求只显示最高薪资大于1000的?
	select 
		dept,MAX(sal) maxSal from 
		emp e 
	GROUP BY dept 
	HAVING maxSal > 1000;


优化 sql:先将大于 1000 的查询出来,然后再分组。
 -- 优化:查询每个部门最高薪资,要求只显示最高薪资大于1000的?
	select 
		dept,MAX(sal) maxSal from 
		emp e 
	WHERE
		sal > 1000 
	GROUP BY dept 
	HAVING maxSal > 1000;
 

优化策略 —— wherehaving 优先选择 where


测试:

以上是关于Mysql — Group by用法说明的主要内容,如果未能解决你的问题,请参考以下文章

mysql筛选GROUP BY多个字段组合时的用法分享

sqlserver2008,sql编程,group by 用法

sqlserver2008,sql编程,group by 用法

mysql group by 的用法,集合后取出指定的字段

mysql笔记--group by,limit用法

group by having用法举例