(04)oracle新人筆記------多表連接

多表查詢(等值連接)

SELECT  emp.empno,  emp.ename,  emp.deptno,  dept.deptno,   dept.loc

FROM  emp,dept

WHERE  empno.deptno=dept.deptno  AND  loc=’NEW YORK’;

 

表起別名

SELECT  e.empno,  e.ename,  e.deptno,  d.deptno,   d.loc

FROM  emp e  ,  dept d

WHERE  e.deptno=d.deptno;

 

非等值連接的數據檢索

SELECT e.ename,e.sal,s.grade

FROM emp e,salgrade s

WHERE e.sal BETWEEN s.losal AND s.hisal;

 

外部連接

加號相當於萬能行,這個行全部由空值組成。它可以和另一邊表中所有不滿足連接條件的行連接

SELECT e.ename,d.deptno,d.dname

FROM emp e,dept d

WHERE e.deptno(+) =d.deptno     

ORDER BY e.deptno;              

 

自身連接

SELECT worker.ename||'leader is'||manager.ename

FROM emp worker,emp manager

WHERE worker.mgr=manager.empno;

 

交叉連接 (沒用)

SELECT emp.empno,emp.ename,dept.loc

FROM emp

CROSS JOIN dept;

 

自然連接

對兩表之間相同名字和數據類型的列進行的等值連接

SELECT empno,ename,sal,deptno,loc

FROM emp

NATURAL JOIN dept;

 

USING子句

//和自然連接差不多,不過這個是指定列,範圍更細

//NATURAL JOIN子句和USING子句相互排斥,不能同時使用

SELECT empno,ename,sal,deptno,loc

FROM emp JOIN dept USING(deptno)

WHERE deptno=20;

 

ON子句

//指定任意連接條件,或指定任意要連接的列

查詢員工的姓名、編號、地址、主管姓名

SELECT e.empno,e.ename,d.loc,m.ename

FROM emp e

JOIN dept d

ON (e.deptno=d.deptno)

JOIN emp m

ON e.mgr=m.empno;

 

 

左外連接

//左邊爲基本表,右邊爲空的還是會顯示出來,作用和(+)差不多

SELECT e.ename,e.deptno,d.loc

FROM emp e

LEFT OUTER JOIN dept d

ON (e.deptno=d.deptno);

 

右外連接

SELECT e.ename,e.deptno,d.loc

FROM emp e

RIGHT OUTER JOIN dept d

ON (e.deptno=d.deptno);

 

全外連接

SELECT e.ename,e.deptno,d.loc

FROM emp e

FULL OUTER JOIN dept d

ON (e.deptno=d.deptno);

 

 

 

 

 

 

練習

  1. SELECTename,dept.deptno,dept.dname FROMemp, dept;
  2. SELECTename,dept.deptno,dept.dname FROMemp, dept;
  3. SELECTename,dept.loc,emp.comm FROM emp,dept WHERE dept.loc!='CHICAGO' AND emp.comm  IS NOT NULL;
  4. SELECT* FROM emp,dept;
  5. SELECTename,dname,hiredate

    FROM emp

    NATURAL JOIN dept

    WHERE hiredate>'01-5月-80';

 

  1. SELECTename,dname,manager.ename

FROM emp worker,emp manager,dept

WHERE dept.deptno=worker.deptno

AND worker.mgr=manager.empno

AND worker.ename='SMITH';

 

  1. SELECTename,dname,sal,grade

FROM emp,dept,salgrade

WHERE emp.deptno=dept.deptno

AND  emp.sal BETWEEN salgrade.losal AND salgrade.hisal

AND grade>4;

 

  1. SELECTename,m.ename

FROM emp w,emp m

WHERE w.mgr=m.empno

AND (m.ename='KING' OR m.ename='FORD');

 

  1. SELECTename worker_name,w.hiredate,m.ename manager_name,m.hiredate

FROM emp w,emp m

WHERE w.mgr=m.empno

AND w.hiredate<m.hiredate;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章