Oracle 多表連線
阿新 • • 發佈:2019-01-28
多表連線
--第五章 1.
SELECT * FROM EMP;
1.寫一個查詢,顯示所有員工姓名,部門編號,部門名稱。
SELECT e.ENAME ,e.DEPTNO ,d.DNAME
FROM emp e,DEPT d
WHERE e.DEPTNO = d.DEPTNO;
SELECT e.ENAME ,e.DEPTNO ,d.DNAME
FROM emp e
INNER JOIN DEPT d ON e.DEPTNO = d.DEPTNO;
2.寫一個查詢,顯示所有工作在CHICAGO並且獎金不為空的員工姓名,工作地點,獎金
select emp.ename,dept.loc,emp.comm
from emp , dept
where emp.comm <> 0 AND dept.deptno=emp.deptno;
select emp.ename,dept.loc,emp.comm
from emp join dept on dept.deptno=emp.deptno
where emp.comm <> 0;
3.寫一個查詢,顯示所有姓名中含有A字元的員工姓名,工作地點。
select emp.ename,dept.loc
from emp join dept on dept.deptno=emp.deptno
where emp.ename like '%A%';
練習2
1.查詢每個員工的編號,姓名,工資,工資等級,所在工作城市,按照工資等級進行升序排序。
--工資登記表:salgrade
SELECT * from SALGRADE;
SELECT e.EMPNO,e.ename, e.sal,s.grade,d.loc
FROM EMP e,DEPT d,SALGRADE s
WHERE e.DEPTNO = d.DEPTNO
AND SAL BETWEEN s.losal AND s.hisal
ORDER BY s.grade ASC;
select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.loc
from emp join dept on dept.deptno=emp.deptno,salgrade
order by salgrade.grade asc;
練習3
1.查詢所有工作在NEW YORK和CHICAGO的員工姓名,員工編號,以及他們的經理姓名,經理編號。
SELECT e1.ENAME 員工姓名 ,e1.empno 員工編號,e2.Ename 經理姓名,e1.MGR 經理編號,d.loc 工作地點
FROM EMP e1 ,EMP e2,DEPT d
WHERE E1.MGR = E2.EMPNO
AND E1.DEPTNO = d.DEPTNO
AND d.LOC IN ('NEW YORK','CHICAGO');
2.第上一題的基礎上,新增沒有經理的員工King,並按照員工編號排序。
SELECT e1.ENAME 員工姓名 ,e1.empno 員工編號,e2.Ename 經理姓名,e1.MGR 經理編號,d.loc 工作地點
FROM EMP e1 LEFT JOIN EMP e2 ON E1.MGR = E2.EMPNO ,DEPT d
WHERE
E1.DEPTNO = d.DEPTNO
AND d.LOC IN ('NEW YORK','CHICAGO')
order BY 2 ASC;
SELECT e1.ENAME 員工姓名 ,e1.empno 員工編號,e2.Ename 經理姓名,e1.MGR 經理編號,d.loc 工作地點
FROM EMP e1 ,EMP e2,DEPT d
WHERE E1.MGR = E2.EMPNO(+)
AND E1.DEPTNO = d.DEPTNO
AND d.LOC IN ('NEW YORK','CHICAGO')
order BY 2 ASC;
3.查詢所有員工編號,姓名,部門名稱,包括沒有員工的部門也要顯示出來。
SELECT e.empno,e.ename,d.dname 部門名稱
from EMP e , DEPT d
WHERE e.deptno(+) = d.deptno ;
select e.empno,e.ename,d.deptno
from emp e
full outer join dept d
on e.deptno=d.deptno;
練習4
• 1.建立個員工表和部門表的交叉連線
select emp.empno,emp.ename,dept.dname from emp ,dept;
select emp.empno,emp.ename,dept.dname from emp CROSS JOIN dept;
• 2.使用自然連線,顯示入職日期在80年5月1日之後的員工姓名,部門名稱,入職日期
SELECT e.ename,d.dname,e.hiredate
FROM emp e INNER JOIN DEPT d on e.deptno = d.deptno
WHERE e.hiredate>'1-5月-80';
SELECT e.ename,d.dname,e.hiredate
FROM emp e
NATURAL JOIN dept d
where e.hiredate > '1-5月-80';
• 3.使用USING子句,顯示工作在CHICAGO的員工姓名,部門名稱,工作地點
SELECT e.ENAME ,d.dname ,d.loc
FROM emp e join DEPT d using (DEPTNO)
where d.LOC = 'CHICAGO';
• 4.使用ON子句,顯示工作在CHICAGO的員工姓名,部門名稱,工作地點,薪資等級
SELECT e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"
FROM emp e join dept d on (e.deptno=d.deptno) ,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
SELECT e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"
FROM emp e, dept d,salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal;
• 5.使用左連線,查詢每個員工的姓名,經理姓名,沒有經理的King也要顯示出來。
SELECT e.ename,m.ename "經理名字"
from emp e
LEFT OUTER JOIN emp m
ON (e.mgr=m.EMPNO);
• 6.使用右連線,查詢每個員工的姓名,經理姓名,沒有經理的King也要顯示出來。
SELECT e.ename,m.ename "經理名字"
FROM emp m
right outer join emp e
on m.mgr=e.empno;
課後作業
• 1.顯示員工SMITH的姓名,部門名稱,直接上級名稱
SELECT e.ENAME,d.dname,m.ename
FROM emp e
join dept d using (deptno)
join emp m on (e.mgr=m.empno);
SELECT e.ename,d.dname,m.ename
FROM emp e
join dept d on e.deptno=d.deptno
join emp m on e.mgr=m.empno;
SELECT e.ename,d.dname,m.ename
FROM emp e,DEPT d,emp m
where e.deptno=d.deptno
AND e.mgr=m.empno;
• 2.顯示員工姓名,部門名稱,工資,工資級別,要求工資級別大於4級。
SELECT e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"
FROM emp e, dept d,salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal
AND s.grade>4
• 3.顯示員工KING和FORD管理的員工姓名及其經理姓名。
方法一:
SELECT e.ename "員工姓名",m.ename "經理姓名"
FROM emp e,emp m
WHERE e.mgr=m.empno
AND m.ename IN('KING','FORD');
方法二:
SELECT e.ename "員工姓名",m.ename "經理姓名"
FROM emp e,emp m
WHERE e.mgr=m.empno AND m.ename ='KING'
or e.mgr=m.empno and m.ename ='FORD';
• 4.顯示員工姓名,參加工作時間,經理名,參加工作時間,要求參加時間比經理早。
SELECT e.ename "員工姓名", e.hiredate "參加工作時間" ,m.ename "經理姓名", m.hiredate "經理參加工作時間"
FROM emp e,emp m
WHERE e.mgr=m.empno
AND e.hiredate< m.hiredate;
--第五章 1.
SELECT * FROM EMP;
1.寫一個查詢,顯示所有員工姓名,部門編號,部門名稱。
SELECT e.ENAME ,e.DEPTNO ,d.DNAME
FROM emp e,DEPT d
WHERE e.DEPTNO = d.DEPTNO;
SELECT e.ENAME ,e.DEPTNO ,d.DNAME
FROM emp e
INNER JOIN DEPT d ON e.DEPTNO = d.DEPTNO;
2.寫一個查詢,顯示所有工作在CHICAGO並且獎金不為空的員工姓名,工作地點,獎金
select emp.ename,dept.loc,emp.comm
from emp , dept
where emp.comm <> 0 AND dept.deptno=emp.deptno;
select emp.ename,dept.loc,emp.comm
from emp join dept on dept.deptno=emp.deptno
where emp.comm <> 0;
3.寫一個查詢,顯示所有姓名中含有A字元的員工姓名,工作地點。
select emp.ename,dept.loc
from emp join dept on dept.deptno=emp.deptno
where emp.ename like '%A%';
練習2
1.查詢每個員工的編號,姓名,工資,工資等級,所在工作城市,按照工資等級進行升序排序。
--工資登記表:salgrade
SELECT * from SALGRADE;
SELECT e.EMPNO,e.ename, e.sal,s.grade,d.loc
FROM EMP e,DEPT d,SALGRADE s
WHERE e.DEPTNO = d.DEPTNO
AND SAL BETWEEN s.losal AND s.hisal
ORDER BY s.grade ASC;
select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.loc
from emp join dept on dept.deptno=emp.deptno,salgrade
order by salgrade.grade asc;
練習3
1.查詢所有工作在NEW YORK和CHICAGO的員工姓名,員工編號,以及他們的經理姓名,經理編號。
SELECT e1.ENAME 員工姓名 ,e1.empno 員工編號,e2.Ename 經理姓名,e1.MGR 經理編號,d.loc 工作地點
FROM EMP e1 ,EMP e2,DEPT d
WHERE E1.MGR = E2.EMPNO
AND E1.DEPTNO = d.DEPTNO
AND d.LOC IN ('NEW YORK','CHICAGO');
2.第上一題的基礎上,新增沒有經理的員工King,並按照員工編號排序。
SELECT e1.ENAME 員工姓名 ,e1.empno 員工編號,e2.Ename 經理姓名,e1.MGR 經理編號,d.loc 工作地點
FROM EMP e1 LEFT JOIN EMP e2 ON E1.MGR = E2.EMPNO ,DEPT d
WHERE
E1.DEPTNO = d.DEPTNO
AND d.LOC IN ('NEW YORK','CHICAGO')
order BY 2 ASC;
SELECT e1.ENAME 員工姓名 ,e1.empno 員工編號,e2.Ename 經理姓名,e1.MGR 經理編號,d.loc 工作地點
FROM EMP e1 ,EMP e2,DEPT d
WHERE E1.MGR = E2.EMPNO(+)
AND E1.DEPTNO = d.DEPTNO
AND d.LOC IN ('NEW YORK','CHICAGO')
order BY 2 ASC;
3.查詢所有員工編號,姓名,部門名稱,包括沒有員工的部門也要顯示出來。
SELECT e.empno,e.ename,d.dname 部門名稱
from EMP e , DEPT d
WHERE e.deptno(+) = d.deptno ;
select e.empno,e.ename,d.deptno
from emp e
full outer join dept d
on e.deptno=d.deptno;
練習4
• 1.建立個員工表和部門表的交叉連線
select emp.empno,emp.ename,dept.dname from emp ,dept;
select emp.empno,emp.ename,dept.dname from emp CROSS JOIN dept;
• 2.使用自然連線,顯示入職日期在80年5月1日之後的員工姓名,部門名稱,入職日期
SELECT e.ename,d.dname,e.hiredate
FROM emp e INNER JOIN DEPT d on e.deptno = d.deptno
WHERE e.hiredate>'1-5月-80';
SELECT e.ename,d.dname,e.hiredate
FROM emp e
NATURAL JOIN dept d
where e.hiredate > '1-5月-80';
• 3.使用USING子句,顯示工作在CHICAGO的員工姓名,部門名稱,工作地點
SELECT e.ENAME ,d.dname ,d.loc
FROM emp e join DEPT d using (DEPTNO)
where d.LOC = 'CHICAGO';
• 4.使用ON子句,顯示工作在CHICAGO的員工姓名,部門名稱,工作地點,薪資等級
SELECT e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"
FROM emp e join dept d on (e.deptno=d.deptno) ,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
SELECT e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"
FROM emp e, dept d,salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal;
• 5.使用左連線,查詢每個員工的姓名,經理姓名,沒有經理的King也要顯示出來。
SELECT e.ename,m.ename "經理名字"
from emp e
LEFT OUTER JOIN emp m
ON (e.mgr=m.EMPNO);
• 6.使用右連線,查詢每個員工的姓名,經理姓名,沒有經理的King也要顯示出來。
SELECT e.ename,m.ename "經理名字"
FROM emp m
right outer join emp e
on m.mgr=e.empno;
課後作業
• 1.顯示員工SMITH的姓名,部門名稱,直接上級名稱
SELECT e.ENAME,d.dname,m.ename
FROM emp e
join dept d using (deptno)
join emp m on (e.mgr=m.empno);
SELECT e.ename,d.dname,m.ename
FROM emp e
join dept d on e.deptno=d.deptno
join emp m on e.mgr=m.empno;
SELECT e.ename,d.dname,m.ename
FROM emp e,DEPT d,emp m
where e.deptno=d.deptno
AND e.mgr=m.empno;
• 2.顯示員工姓名,部門名稱,工資,工資級別,要求工資級別大於4級。
SELECT e.ename "員工姓名",dname "部門名稱",e.sal "工資",s.grade "工資級別"
FROM emp e, dept d,salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal
AND s.grade>4
• 3.顯示員工KING和FORD管理的員工姓名及其經理姓名。
方法一:
SELECT e.ename "員工姓名",m.ename "經理姓名"
FROM emp e,emp m
WHERE e.mgr=m.empno
AND m.ename IN('KING','FORD');
方法二:
SELECT e.ename "員工姓名",m.ename "經理姓名"
FROM emp e,emp m
WHERE e.mgr=m.empno AND m.ename ='KING'
or e.mgr=m.empno and m.ename ='FORD';
• 4.顯示員工姓名,參加工作時間,經理名,參加工作時間,要求參加時間比經理早。
SELECT e.ename "員工姓名", e.hiredate "參加工作時間" ,m.ename "經理姓名", m.hiredate "經理參加工作時間"
FROM emp e,emp m
WHERE e.mgr=m.empno
AND e.hiredate< m.hiredate;