函数
count | 数量 |
---|---|
sum | 求和 |
avg | 平均值 |
max | 最大值 |
min | 最小值 |
分组函数不能直接使用在where关键字后面。
mysql> select ename, sal from emp where max(sal) < sal;
ERROR 1111 (HY000): Invalid(无效) use of group function
去除重复记录
select distinct deptno,job from emp;
distinct只能出现在所有字段前方
分组查询
- 分组查询两个子句:
group by、 having
mysql> select ename,job, max(sal) from emp group by job;
在mysql中可以,但是没有实际意义。
在Oracle中不可以,语法报错。
重点:
若一条DQL语句当中有group by子句,那么select关键字后面只能跟参与分组的字段和分组函数。
select job, max(sal) from emp where job != 'MANAGER' group by job;
where条件得在group by的前面。先得去除不等于MAMAGER的,然后在进行分组。
select job, avg(sal) from emp where avg(sal) > 1500 group by job;
select job, avg(sal) from emp group by job having avg(sal) > 1500;
重点:
where关键字后面不能直接使用分组函数。
分组函数必须在分组完成后执行,而分组需要group by,而group by在where后面执行。
having和where功能都是为了完成数据的过滤。
where和having后面都是添加条件。
where在group by之前完成过滤。
having在group by之后完成过滤
原则:
尽量在where中过滤,无法过滤的数据,通常是需要先分组子后在过滤的,这个时候可以选择使用having。
完整的DQL语句的总结:
select
...
from ...
where ...
group by ...
having ...
order by...
说明:
1. 书写顺序不能改变
2. having不能单独使用,必须和group by连用
3. 执行顺序:
3.1 from 从某张表中检索数据
3.2 where 经过某个条件进行筛选
3.3 group by 分组
3.4 having 分组之后在筛选
3.5 select 查询列
3.6 order by 排序输出