1. 程式人生 > >oracle多表查詢

oracle多表查詢

lec 所有 oracle 日期 sin 自然連接 ner and 笛卡爾積

oracle多表查詢

--1.DEPT表按照部門跟EMP表左關聯
select ename,sal,dname,e.deptno from emp e left outer join dept d on e.deptno = d.deptno
select ename,sal,dname,e.deptno from emp e , dept d where e.deptno = d.deptno(+)

--2. 列出所有“CLERK”(辦事員)的姓名及其部門名稱。 
--笛卡爾積
select ename,dname,job from emp e,dept d where e.deptno = d.deptno and job = 'CLERK'
--內連接
select ename,dname,job from emp e inner join dept d on e.deptno = d.deptno and job = 'CLERK'
select ename,dname,job from emp e join dept d on e.deptno = d.deptno and job = 'CLERK'
select ename,dname,job from emp e join dept d using(deptno) where job = 'CLERK'
--自然連接
select ename,dname,job from emp e natural join dept d where job = 'CLERK'
--外連接(不合適)
--select ename,dname,job from emp e right outer join dept d on e.deptno = d.deptno and job = 'CLERK'

--3. 列出所有雇員的雇員名稱、部門名稱和薪金(使用自然連接,using字句,on字句)
--自然連接
select ename,dname,sal from emp e natural join dept d
--using子句(inner可省略)
--內連接
select ename,dname,sal from emp e inner join dept d using(deptno)
select ename,dname,sal from emp e join dept d using(deptno)
--外連接
select ename,dname,sal from emp e left outer join dept d using(deptno)
select ename,dname,sal from emp e right outer join dept d using(deptno) 
--on子句(inner可省略)
--內連接
select ename,dname,sal from emp e  inner join dept d on e.deptno = d.deptno
select ename,dname,sal from emp e  join dept d on e.deptno = d.deptno 
--外連接
select ename,dname,sal from emp e left outer join dept d on e.deptno = d.deptno
select ename,dname,sal from emp e right outer join dept d on e.deptno = d.deptno
select ename ,dname,sal from emp e,dept d where e.deptno = d.deptno(+)
select ename ,dname,sal from emp e,dept d where e.deptno(+) = d.deptno
select ename,dname,sal from emp e full outer join dept d on e.deptno = d.deptno
    
--4. 列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門
--右外連接
select dname,e.* from emp e right outer join dept d on e.deptno = d.deptno

--5. 列出所有員工的姓名及其直接上級領導的姓名 
--笛卡爾積
select e.ename 員工姓名,b.ename 老板姓名 from emp e, emp b where e.mgr = b.empno
--內連接
select e.ename 員工姓名, b.ename 老板姓名 from emp e inner join emp b on e.mgr = b.empno
--外連接
--左外連接
select e.ename 員工姓名, b.ename 老板姓名 from emp e left outer join emp b on e.mgr = b.empno
select e.ename 員工姓名, b.ename 老板姓名 from emp e , emp b where e.mgr = b.empno(+)
--右外連接(不合適)
--select e.ename 員工姓名, b.ename 老板姓名 from emp e right outer join emp b on e.mgr = b.empno
--select e.ename 員工姓名, b.ename 老板姓名 from emp e , emp b where e.mgr(+) = b.empno

--6. 顯示所有員工的姓名ename,部門號deptno和部門名稱dname。(使用自然連接,using字句,on字句)
--自然連接
select ename,deptno,dname from emp e natural join dept d
--using
select ename ,deptno , dname from emp e join dept d using(deptno)
select ename,deptno , dname from emp e left outer join dept d using(deptno)
--on
select ename,d.deptno,dname from emp e join dept d on e.deptno = d.deptno
select ename ,d.deptno,dname from emp e left outer join dept d on e.deptno = d.deptno

--7. 查詢20號部門員工的job和20號部門的loc 20;
select job,loc from emp e join dept d on e.deptno = d.deptno and d.deptno = 20

--8. 選擇所有有獎金comm的員工的ename , dname , loc  
select ename,dname,loc from emp e join dept d on e.deptno = d.deptno and comm is not null; 

--9.選擇在DALLAS工作的員工的ename , job , deptno, dname   
select ename,job ,d.deptno, dname from emp e join dept d on e.deptno = d.deptno and loc = 'DALLAS'

--10. 顯示雇員名、雇員工資及所在部門的名字,並按部門排序。(使用自然連接,using字句,on字句)
--自然連接
select ename,sal,dname from emp e natural join dept d order by job
--using
select ename ,sal , dname from emp e join dept d using(deptno) order by job
select ename,sal , dname from emp e left outer join dept d using(deptno) order by job
--on
select ename,sal,dname from emp e join dept d on e.deptno = d.deptno order by job
select ename ,sal,dname from emp e left outer join dept d on e.deptno = d.deptno order by job

--11. 列出至少有一個員工的所有部門的部門名稱(DNAME)和該部門的員工人數(使用自然連接,using字句,on字句)
--自然連接
select dname,count(empno) 員工人數 from emp e natural join dept d group by dname 
--on子句
select dname,count(empno) 員工人數 from emp e left outer join dept d on e.deptno = d.deptno group by dname
--using子句
select dname,count(empno) 員工人數 from emp e left outer join dept d using(deptno) group by dname

--12. 查詢受雇日期早於其直接上級的所有員工的編號,姓名,部門名稱
select empno,h.hname,dname from dept d , 
(select e.empno,e.ename as hname,b.ename,e.deptno as dep from emp e join emp b on e.mgr = b.empno and 
e.hiredate < b.hiredate) h
where d.deptno = h.dep

--13. 查詢至少有4個員工的部門的部門名稱。(使用自然連接,using字句,on字句)
--自然連接
select dname from emp e natural join dept d group by dname having count(empno) > 4
--using子句
select dname from emp e join dept d using(deptno) group by dname having count(empno) > 4
--on子句
select dname from emp e join dept d on e.deptno = d.deptno group by dname having count(empno) > 4

--14. 查詢部門名稱中帶'S'字符的部門的員工的工資總和部門人數,顯示結果為部門名稱,部門員工的工資總和,部門人數
select dname,sum(sal),count(empno) from emp e join dept d on e.deptno = d.deptno and dname like '%S%' group by dname

--15. 查詢出沒有下屬的員工的姓名及他的職位
 select b.ename,b.job from emp b left outer join emp e on e.mgr = b.empno where e.ename is null

oracle多表查詢