--作业
--1、统计雇员表中的信息,按年份统计入职人数
select count(*) 人数,to_char(hiredate,'yyyy') 年份 from emp p group by to_char(hiredate,'yyyy') order by 年份;
--2、按职位统计,人数、平均工资、最高工资
select count(*) 人数,avg(p.sal) ,max(p.sal),job 职位 from emp p group by job;
--Having 表示分组之后的条件
---在2的基础之后的条件呢=,增加一个需求,只看平均工资小于3000的记录
select count(*) 人数, avg(p.sal) 平均工资, max(p.sal) 最高工资, job 职位
from emp p
group by job
having round(avg(p.sal), 2) < 3000
order by 平均工资 desc--order 在分组的情况下 排序列也必须是聚合列或者分组列
----where 错误示例
--select count(*) 人数, avg(p.sal) 平均工资, max(p.sal) 最高工资, job 职位
--from emp p
--where
--round(avg(p.sal), 2) < 3000 --where表示分组之前的条件,where语句之后不能直接跟聚合函数 聚合函数不能作为where的直接条件
--group by job
--order by 平均工资;
---经典的面试题 where和having的区别?
---SQL语句关键字执行的顺序???
--1、from 确定数据源,从数据库的物理文件加载数据块到内存
--2、where 筛选行 产生下一次操作的输入(一个临时的结果集)
--3、group by 分组
--4、having 分组之后的过滤
--5、select 计算select之后的表达式 产生一个别名
--6、order by 最后根据select的结果进行排序 完全可以使用select之后的别名
--完成作业:统计每个职位的平均工资,最高工资,按平均工资排序,
--但只统计部门编号是10和20的部门,且只统计平均工资小于3000的职位
select *from emp;
select avg(p.sal) 平均工资, max(p.sal) 最高工资,job 职位
from emp p
where p.deptno=10 or p.deptno=20
group by job
having round(avg(p.sal), 2) < 3000
order by 平均工资 desc
Oracle数据库之Having关键字使用
最新推荐文章于 2023-04-18 18:00:00 发布