-
分组函数也成为多行处理函数,包含5个基本函数:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值 -
我们知道在表达式中如果出现
NULL
,就会使整个表达式结果为NULL
,但上述5个分组函数在计算值时自动忽略值为NULL
的数据。 -
首先需要注意
select
语句的执行顺序
我们知道select
语句的书写顺序为:
select
...
from
...
where
...
group by
...
order by
...
上述的书写顺序不能乱,其次,最重要的是其执行顺序:
1. from
2. where
3. group by
4. select
5. order by
group by
为分组关键字(后面学习),分组函数必须要分组后才能使用,如果没有分组,则整张表默认为一组。
观察以下代码:
select ename,sal from emp where sal > min(sal);//报错。
select sum(sal) from emp;//正确。
出现上面的情况的原因为:
根据select
语句的执行顺序,第一句由于where
语句在group by
后面执行,也就是还没有分完组,因此分组函数不能在where
语句中直接使用;而第二句由于select
语句在group by
后面执行,因此就算没有写group by
语句,系统也默认执行了一个空的该语句,也就是将整个表分为一组,所以可以直接在select
语句中直接使用分组函数。
group by
关键字的使用:
注意分组默认将值一样的分为一组
eg:找出每个工作岗位的工资和
select
job,sum(sal)
from
emp
group by
job;
注意:select
语句后面只能跟group by
分组后的字段以及分组函数。
- 如果想要找出“每个部门,不同工作岗位”的最高薪资? 我们可以在
group by
后面跟两个字段,联合分组来实现。
select
deptno, job, max(sal)
from
emp
group by
deptno, job;
- 另外还介绍一个
having
关键字,该关键字只在group by
之后使用,作用为筛选分组之后的数据,和where
有类似之处,因此如果可以,尽量使用where
而不使用having
,在where
实在解决不了时,比如需要对平均值进行筛选,而where
不能使用分组函数vag()
,此时只能用having
.
select
deptno,avg(sal)
from
emp
group by
deptno
having
avg(sal) > 2500;