Part I
–1、查询出emp表中所有员工信息,按照工资顺序从高到低显示
select * from emp order by sal desc;
–2、查询出每个部门的最高工资
select deptno,max(sal) from emp group by deptno;
–3、查询部门20的员工,每个月的工资总和以及平均工资。
select sum(nvl(sal,0)),avg(nvl(sal,0)) from emp where deptno=20;
–4、查询每个部门每个岗位的工资总和,并按照部门号升序排序
select deptno,job,sum(sal) from emp group by deptno,job order by deptno;
–5、查询员工岗位中不是以’S’开头且平均工资在2500元以上的岗位以及平均工资,按照平均工资降序排序
select job,avg(nvl(sal,0)) from emp where job not like ‘S%’ group by job having avg(nvl(sal,0))>2500 order by avg(nvl(sal,0)) desc;
select * from emp;
–6、查询入职日期在1981-5-1到1981-12-31之间的所有员工的信息
select * from emp where hiredate between ‘01-5月-1981’ and ‘31-12月-1981’;
–7、显示10号部门的所有经理和20号部门的所有员工
select ename,job,deptno from emp where(deptno=10 and job=‘MANAGER’ or deptno=20 and job=20);
–8、求1982年入职的职工
select * from emp where extract(year from hiredate)=‘1982’;
select * from emp where hiredate between ‘01-1月-1982’ and ‘31-12月-1982’;
Part2
–查询练习(分组、组函数的使用、排序)
–1、显示平均工资低于 2000 的部门号和它的平均工资
select * from emp;
select deptno,round(avg(sal),2) from emp group by deptno having avg(sal)<2000;
–2、统计各部门下的工资>1000的员工的平均工资(先进行where条件筛选,不要使用having,过滤分组后的字段不一定包含需要的字段)
select deptno,round(avg(sal),2) from emp where sal>1000 group by deptno;
–3、计算部门30员工中的最高奖金
select max(comm) from emp where deptno=30;
–4、查询每个工种的每月所需支付的基本工资,并将工资升序排序
select job,sum(sal) from emp group by job order by sum(sal);
–5、查询每个部门中各个工种的最低工资(过滤分组)
select deptno,job,min(sal) from emp group by deptno,job;
–6、查询除了部门20之外的其他部门的平均工资(当涉及到条件判断以及筛选时,where与having的选择优先考虑where)
select deptno,round(avg(sal),2) from emp where deptno<>20 group by deptno;
Part3
select * from emp;
– 查询练习(包含各种运算符):
–1、查询出所有不是办事员的雇员信息
select * from emp where job<>‘CLERK’;
–2、查询出工资范围在1500~3000(包含区间值)的全部雇员信息
select * from emp where sal between 1500 and 3000;
–3、查询出在1981年雇用的全部雇员信息
select * from emp where hiredate between ‘01-1月-1981’ and ‘31-12月-1981’;
–4、找出部门10中既不是经理也不是员工,且工资大于等于2000的员工
select * from emp where deptno=10 and job<>‘MANAGER’ and job<>‘CLERK’ and sal>=2000;
–5、找出所有不收取佣金或收取佣金低于100的员工
select * from emp where comm is null or comm<100;
–6、找出收取佣金的员工的不同工作
select distinct job from emp where comm is not null;
Part4
select * from emp;
–1、显示雇员姓名,根据服务年限,将最老的排在前面。
select ename,hiredate from emp order by hiredate;
–2、找出姓名中不带 R 这个字母的员工
select * from emp where ename not like ‘%R%’;
–3、找出姓名为 5 个字母的员工,并按部门编号进行排序。
select * from emp where length(ename)=5 order by deptno;
–4、显示第三个字符为大写 O 的所有员工的姓名和工资
select ename,sal from emp where ename like ‘__O%’;
–5、显示没有上级的雇员的情况
select * from emp where mgr is null;
Part5
–1、找出有奖金的员工的不同的工作
select distinct job from emp where comm is not null and comm>0;
–2、找出每个月倒数第三天受雇的员工
select * from emp where last_day(hiredate)-2=hiredate;
–3、分组统计各部门下平均工资大于500的部门
select deptno,avg(sal) from emp group by deptno having avg(sal)>500;
–4、找出部门30中得到最多奖金的员工姓名
select ename from emp where comm in(select max(comm) from emp where deptno=30);
–5、计算每个职位的员工数以及最低工资
select job,count(*) 员工数,min(sal) from emp group by job;