select
e.empno 员工编号, e.ename 员工姓名, d.dname 员工部门名称,
s.grade 员工工资等级, e2.ename 领导姓名, s2.grade 领导工资等级
from
emp e, dept d, salgrade s, emp e2, salgrade s2
where
e.deptno = d.deptno(+)
and
e.sal between s.losal and s.hisal
and
e.mgr = e2.empno(+)
and
e2.sal between s2.losal and s2.hisal;
查询结果:
思路:第一张员工表(emp e)和第二张部门表(dept d)在条件(e.deptno = d.deptno(+))下进行查询,结果作为一张新表,与第三张员工工资等级表('salgrade s')在条件(' e.sal between s.losal and s.hisal')下进行查询,结果作为另一张新表,与第四张领导表('emp e2')在条件('emp e2')下进行查询,结果作为另另一张新表,与第五张领导工资级别表('salgrade s2')在条件('e2.sal between s2.losal and s2.hisal')下进行查询,记得最终结果。
5. 查询比SCOTT工资高的员工
select * from emp where sal >
(select sal from emp where ename = 'SCOTT');
运行结果:
思路:使用子查询的方法。先查询到SCOTT员工的工资(select sal from emp where ename = 'SCOTT'),然后在把结果作为另一条sql语句条件表达式的一部分,进行查询。
6. 查询职位是经理并且工资比7782号员工高的员工
方法1(子查询):
select * from emp where job = 'MANAGER' and sal > (select sal from emp where empno = 7782);
方法2(集合运算):
select * from emp where job = 'MANAGER'
intersect -- 交集
select * from emp where sal > (select sal from emp where empno = 7782);
select deptno, min(sal) from emp
group by deptno having
min(sal) > (select min(sal) from emp where deptno = '30');
查询结果:
思路: 先查询出30号部门最低工资select min(sal) from emp where deptno = '30',再查询部门的最低工资select deptno, min(sal) from emp group by deptno,根据题目要求将两个查询语句拼接即可。
8. 查询出和SCOTT同部门并且同职位的员工(不包含SCOTT本人)
select * from emp where
(job, deptno) =
(select job, deptno from emp where ename = 'SCOTT')
and ename != 'SCOTT';
select e.*, d.dname from emp e, dept d
where e.sal in
(select min(sal) from emp group by deptno)
and e.deptno = d.deptno;
查询结果:
思路:先查询每个部门的最低工资select min(sal) from emp group by deptno,在查询最低工资对应的员工信息select * from emp where e.sal in 各部门最低工资结果集,再将查询结果集(新表)和dept表进行内连接,去除无效记录即得结果.
10. 查询出不是领导的员工
select * from emp
where empno not in
(select distinct mgr from emp where mgr is not null);
查询结果:
思路: 查询出各个员工的领导的编号select distinct mgr from emp where mgr is not null(总裁没有上级领导,所以为null,要排除掉),在查询员工表中员工编号不在此结果集的排除掉select * from emp where empno not in 领导编号结果集,即得结果.
11. 题目11: 查询员工表中工资最高的前三名
select t.*,rownum from (select * from emp order by sal desc) t where rownum < 4;
查询结果:
思路: 不能通过select * from emp where rownum < 4 order by sal desc;de方式获取到结果,原因是rownmu是伪列,在查询条件前就已经生成,不能成为查询的条件,需要对排序结果进行二次查询,产生新的rownum才能作为查询的条件依据.
12. 在上一题的基础上查询工资第4~6名的员工信息
select * from
(select ed.*, rownum r from
(select * from emp order by sal desc) ed
where rownum < 7) t
where t.r > 3
运行结果:
思路: 先将表按照sal降序排列select * from emp order by sal desc, 在将结果作为临时表,获取工资前6名的员工信息和行号select ed.*, rownum r from sal降序表 ed where rownum < 7,将查询结果作为另一张临时表,查询出工资4~6名的数据select * from 前6名员工表 where t.r > 3;不使用select ed.*, rownum r from sal降序表 ed where rownum > 3 and rownum < 7是因为rownum不支持大于号运算。
** 本题涉及到oracle分页的思想,以后有时间再深入**
13. 找到员工表中薪水大于本部门平均薪水的员工
select * from emp e, (select deptno, avg(sal) avgsal
from emp group by deptno) t
where t.deptno = e.deptno and e.sal > t.avgsal;
查询结果:
思路: 先查询每个部门的平均薪水select deptno, avg(sal) avgsal from emp group by deptno作为临时表,在查询select * from emp e, 各部门平均工资表 where t.deptno = e.deptno and e.sal > t.avgsal,即得结果。
14. 统计每年入职的员工个数
select to_char(hiredate, 'yyyy') 年份, count(*) 入职人数 from emp e
group by to_char(hiredate, 'yyyy');