oracle练习-day02

--01.查询员工表和部门表
select * from emp e,dept d where e.deptno=d.deptno;
--02.查询出雇员的编号,姓名,部门的编号和名称,地址
select e.empno,e.ename,e.deptno,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;
--03.查询出每个员工的上级领导
--(员工编号、员工姓名、员工部门编号、员工工资、领导编号、领导姓名、领导工资)
select e1.empno,e1.ename,e1.deptno,e1.sal,e2.empno,e2.ename,e2.sal from emp e1,emp e2 where e1.mgr=e2.empno;
--04.在上一个例子的基础上查询该员工的部门名称
select e1.empno,e1.ename,e1.deptno,e1.sal,e2.empno,e2.ename,e2.sal,d.dname from emp e1,emp e2,dept d where e1.mgr=e2.empno and e1.deptno=d.deptno;
--05.在上一个例子的基础上查询员工工资等级和他的上级领导工资等级
select  
e1.empno 员工编号,
e1.ename 员工姓名,
e1.deptno 员工部门编号,
e1.sal 员工工资,
e2.empno 领导编号,
e2.ename 领导姓名,
e2.sal 领导工资,
d.dname 员工的部门名称,
s1.grade 员工工资等级,
s2.grade 领导工资等级
from
 emp e1,--员工表
 emp e2, --领导表
 dept d,--部门表
 salgrade s1,--员工薪资等级表
 salgrade s2 --领导薪资等级表
where e1.mgr = e2.empno
and e1.deptno = d.deptno
and e1.sal between s1.losal and s1.hisal
and e2.sal between s2.losal and s2.hisal;
--06.查询出所有员工的上级领导 (将没有领导的员工也查询出来)
select  
e1.empno 员工编号,
e1.ename 员工姓名,
e1.deptno 员工部门编号,
e1.sal 员工工资,
e2.empno 领导编号,
e2.ename 领导姓名,
e2.sal 领导工资
from
 emp e1 --员工表
left join 
 emp e2 --领导表
on e1.mgr = e2.empno;

select  
e1.empno 员工编号,
e1.ename 员工姓名,
e1.deptno 员工部门编号,
e1.sal 员工工资,
e2.empno 领导编号,
e2.ename 领导姓名,
e2.sal 领导工资
from
 emp e2 --领导表
right join 
 emp e1 --员工表
on e1.mgr = e2.empno;

---Oracle中独有的连接方式 + 这个特殊符号
select  
e1.empno 员工编号,
e1.ename 员工姓名,
e1.deptno 员工部门编号,
e1.sal 员工工资,
e2.empno 领导编号,
e2.ename 领导姓名,
e2.sal 领导工资
from
 emp e1,--员工表
 emp e2 --领导表
where e1.mgr = e2.empno(+);
--在非全量表条件上加上+
员工表:14条数据
领导表:13条数据(非全量表)
--07.查询出所有的部门下的员工,要求把没有员工的部门也展示出来
select * from 
dept d,--部门表
emp e  --员工表
where  
d.deptno = e.deptno(+);
--08.查询每个部门的平均工资,显示部门名称
select 
a.deptno 部门编号,
d.dname 部门名称,
a.sal 平均工资
from (
select avg(e.sal) sal,e.deptno from 
emp e 
group by e.deptno )a,dept d
where a.deptno = d.deptno;  
---------------------------子查询--------------------------------
--09.查询比scott工资高的员工
select * from emp where sal>(select sal from emp where ename='SCOTT');
--10.查询职位是经理并且工资比7782号员工高的员工
select * from emp e1 where e1.job='MANAGER' and e1.sal>(select sal from emp e2 where e2.empno='7782');
select * from emp e where e.job ='MANAGER' and e.sal > (select e.sal from emp e where e.empno = 7782);
--11.查询工资最低的员工
select * from emp where sal=(select min(sal) from emp);
--12.查询部门最低工资大于30号部门最低工资的结果
select e.deptno,min(e.sal) from 
emp e 
group by e.deptno 
having  min(e.sal)> (select min(sal) from emp e where e.deptno = 30);
--13.查询出和scott同部门并且同职位的员工
select  * from emp ee where 
ee.job = (select e.job from emp e where e.ename='SCOTT')
and 
ee.deptno = (select e.deptno from emp e where e.ename='SCOTT');

select  * from emp ee  where (ee.deptno,ee.job) 
= (select e.deptno,e.job from emp e where e.ename='SCOTT');
--14.查询出每个部门的最低工资和最低工资的雇员和部门名称
select e.ename,e.sal,e.deptno,d.dname from 
emp e, --员工表
(select min(e.sal) sal,e.deptno from emp e group by e.deptno) ee, --子查询返回的多行多列
dept d
where e.sal = ee.sal and e.deptno = ee.deptno
and e.deptno = d.deptno;
--15.查询出不是领导的员工
select * from emp e where e.empno not in (select mgr from emp where mgr is not null);
--16.exists 查询有员工的部门
select * from dept d where exists (select * from emp e where e.deptno = d.deptno);
--17.查询10号部门的名称和员工信息 
select e.*,d.dname from 
emp e,--员工表
dept d--部门表
where e.deptno = d.deptno
and d.deptno = 10;

select e.*,ee.dname from 
emp e,--员工表
(select * from dept d where d.deptno = 10)ee--部门表 只有一条记录
where e.deptno = ee.deptno; 
--子查询总结

------------------------课堂练习-------------------------------------
--18.查询员工表中工资最高的前三名
select rownum,ee.* from (
select e.* from emp e  order by e.sal desc)ee
where rownum < 4;
--19.Oracle的分页查询(第二页)
select * from (
select rownum rn,ee.* from (
select e.* from emp e  order by e.sal desc)ee
)eee
where eee.rn > 3 and eee.rn < 7;
--20.找到员工表中薪水大于本部门平均薪水的员工
select e.* from 
emp e,
(select avg(e.sal) avgsal,e.deptno from emp e  group by e.deptno) ee
where e.deptno = ee.deptno
and e.sal > ee.avgsal;
--21.统计每年入职的员工个数
select to_char(e.hiredate,'yyyy'),count(*) from emp e group by to_char(e.hiredate,'yyyy');
--行转列
select sum(count(*)) Total from emp e group by to_char(e.hiredate,'yyyy');

select sum(count(*)) Total,
sum(decode(to_char(e.hiredate,'yyyy'),'1980',count(*))) "1980",
sum(decode(to_char(e.hiredate,'yyyy'),'1981',count(*))) "1981"
sum(decode(to_char(e.hiredate,'yyyy'),'1982',count(*))) "1982",  
sum(decode(to_char(e.hiredate,'yyyy'),'1987',count(*))) "1987"  
from emp e group by to_char(e.hiredate,'yyyy');
----------------集合运算------------------------

--22.范例:工资大于1500,或者是20号部门下的员工
select * from emp e where e.sal > 1500
union
select * from emp e where e.deptno =20;
--23.范例:工资大于1500,并且是20号部门下的员工
select * from emp e where e.sal > 1500
intersect
select * from emp e where e.deptno = 20;
--24.范例:1981年入职的普通员工(不包括总裁和经理)
select * from emp e where to_char(e.hiredate,'yyyy') = '1981' 
minus
select * from emp e where to_char(e.hiredate,'yyyy') = '1981'  and e.job  in ('MANAGER','PRESIDENT');

猜你喜欢

转载自www.cnblogs.com/coder-wf/p/12199050.html