文章目录
- 分组函数
- 常见的分组函数
- 分组函数使用时的注意事项
- 1.分组函数自动忽略 null ,不需要我们对 null 进行处理
- 2.分组函数中count(*)和count(字段)的区别
- 3.分组函数不能直接使用在where子句中
- 4.所有的分组函数可以组合使用
- 分组查询
- 1.SQL语句中关键字的执行顺序
- 2.having关键字
- distinct关键字
使用到的表
分组函数
分组函数又叫聚合函数、多行处理函数,其特点是输入多行数据,最终输出一行结果。
常见的分组函数
count | 取得记录数 |
sum | 求和 |
avg | 求平均值 |
max | 取最大值 |
min | 取最小值 |
需要注意的是,分组函数在使用时需要进行分组,然后才能使用。如果没有进行分组,将默认整张表为一组。
最低工资
select min(sal) from emp;
最高工资
select max(sal) from emp;
工资和
select sum(sal) from emp;
平均工资
select avg(sal) from emp;
员工数量
select count(ename) from emp;
分组函数使用时的注意事项
1.分组函数自动忽略 null ,不需要我们对 null 进行处理
对 COMM 字段进行求和
select sum(comm) from emp;
统计COMM字段的数据总数
select count(comm) from emp;
数字和null相加得到的结果是null,但在这里,分组函数进行了对应的处理。
字段值为null时,不进行统计
2.分组函数中count(*)和count(字段)的区别
count(*):统计表的总行数,只要有一行数据,count就会加一,因为在一行数据中,不可能所有字段都为 null
count(字段):表示统计该字段下所有不为null的元素的总数
3.分组函数不能直接使用在where子句中
找出工资比最低工资高的员工的信息
select ename,sal from emp where sal>min(sal);
报错:ERROR 1111 (HY000): Invalid use of group function 无效的使用了分组函数
4.所有的分组函数可以组合使用
select sum(sal),min(sal),avg(sal),count(*) from emp;
分组查询
在实际应用中,我们可能需要查询某些特定的数据,需要先进行分组,然后对每一组数据进行操作。这时候就需要使用到分组查询。
select ... from ... group by ... ;
1.SQL语句中关键字的执行顺序
select
...
from
...
where
...
group by
...
order by
...
以上关键字的顺序不能颠倒,其执行顺序为:
from
where
group by
select
order by
这时我们就能知道,为什么分组函数不能使用在where子句中。因为where执行时,还未进行group by分组,此时的分组函数还不能执行
而select sum(sal) from emp;之所以能执行,就是因为分组和分组函数的执行在select之前
查找每个工作岗位的工资和
select job,sum(sal) from emp group by job;
查找每个部门的最高薪资,先按照部门编号进行分组,然后再找出每组中的最高薪资
select deptno,max(sal) from emp group by deptno;
查找不同部门的不同岗位的最高薪资
select deptno,job,max(sal) from emp group by deptno,job;
2.having关键字
使用having可以对分完组之后的数据进行进一步过滤,having不能单独使用,其必须和group by一起使用,它也不能代替where。
查询每个部门的最高薪资,要求显示最高薪资大于3000的
select deptno,max(sal) from emp group by deptno having max(sal)>3000;
select deptno,max(sal) from emp where sal>3000 group by deptno;
这里两个语句都能进行查询,应优先使用where
查询每个部门的平均薪资,并显示平均薪资大于2500的。这个时候使用having更加方便
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
加上having后的SQL中关键字的位置和执行顺序
select
...
from
...
where
...
group by
...
having
...
order by
...
执行顺序:
from
where
group by
having
select
order by
distinct关键字
distinct关键字用于去除查询出的数据中的重复的内容
查询出所有的工作岗位并去除重复的
select distinct job from emp;
distinct只能使用在所有字段的最前方,表示一个或多个字段联合起来进行去除重复的数据
查询出不同部门的不同的岗位
select distinct deptno,job from emp;
可以看到,查询结果中在相同的部门中没有相同的岗位当没有使用到所有字段的最前方时会报错
distinct还可以和分组函数联合使用
统计工作岗位的数量,在distinct关键字前使用分组函数
select count(distinct job) from emp;