1.count(*)和count(具体的某个字段),他们有什么区别?
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm):表示统计comm字段中不为NULL的数据总数。
分组函数也能组合起来用:
select count (*),sum(sal),avg(sal),max(sal),min(sal) from emp;
2.group by 和 having
group by: 按照某个字段或者某个字段进行分组
having: having是对分组之后的数据进行再次过滤。
案例:找出每个工作岗位的最高薪资。
select max(sal) from emp group by job;
注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。
并且任何一个分组函数(count sum avg max min)都是在 group by语句执行结束之后才会执行的。
当一条SQL语句没有group by的话,整张表的数据会自成一组。
select ename,sal from emp where sal>avg(sal);//ERROR 1111(HY000):Invalid use of group function
思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句中有一个语法规则,分组函数不可直接使用在where子句中。
怎么解释?
因为group by是在where执行之后才会执行的。
还没有分组!!!!
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
所以应该先查询然后用查询到的数据,例如select ename,sal from emp where sal>(select avg(sal) from emp);
案例:找出每个工作岗位的最高薪资。
select max(sal),job from emp group by job;
select ename max(sal),job from emp group by job;//oracle会报错,mysql可以执行但是毫无意义。oracle的语法比MYSQL语法严谨。
切记!!!
当一条语句中有group by的时候,select后面只能跟分组函数和参与分组的字段。
每个岗位的平均薪资?
select job,avg(sal) from emp group by job;
多个字段能不能联合起来一块分组?
案例: 找出每个部分不同工作岗位的最高薪资
select
deptno,job,max(sal)
from
emp
group by
deptno,job;
找出每个部分的最高薪资,要求显示薪资大于2900的数据。
第一步:找出每个部门的最高薪资
select max(sal),deptno from emp group by deptno
第二步:找出薪资大于2900的
select max(sal),deptno from emp group by deptno having max(sal)>2900;//这种效率低!!!
用以下这种,效率高!!
select max(sal),deptno from emp where sal>2900 group by deptno;//效率高,如果能使用where过滤尽量用where
找出每个部门的平均薪资,要求显示薪资大于2000的数据。
第一步:找出每个部门的平均薪资
select avg(sal),deptno from emp group by deptno;
第二步:要求显示薪资大于2000的数据
select avg(sal),deptno from emp group by deptno having avg(sal) > 2000;
如果使用where筛选会报错,无效的使用了分组函数。
切记,很重要。这种情况只能使用having过滤