Mysql — Group by用法说明
Posted 江湖@小小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql — Group by用法说明相关的知识,希望对你有一定的参考价值。
1. sql 执行顺序
分组函数:sum,count,avg,max,min
eg:
select ... from
表
where 条件
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;
优化策略 —— where 和 having 优先选择 where
测试:
以上是关于Mysql — Group by用法说明的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver2008,sql编程,group by 用法