1. 程式人生 > >Oracle中表的四種連線方式講解

Oracle中表的四種連線方式講解

轉載地址:http://soft.chinabyte.com/database/333/12645333.shtml

  表的連線是指在一個SQL語句中通過表與表之間的關連,從一個或多個表中檢索相關的資料,大體上表與表之間的連線主要可分四種,分別為相等連線,外連線,不等連線和自連線,本文將主要從以下幾個典型的例子來分析Oracle表的四種不同連線方式:

  1. 相等連線

  通過兩個表具有相同意義的列,可以建立相等連線條件。

  只有連線列上在兩個表中都出現且值相等的行才會出現在查詢結果中。

  例 查詢員工資訊以及對應的員工所在的部門資訊;

  SELECT * FROM EMP,DEPT;

  SELECT * FROM EMP,DEPT

  WHERE EMP.DEPTNO = DEPT.DEPTNO;

  REM 顯示工資超過2000的員工資訊以及對應的員工的部門名稱。

  2. 外連線

  對於外連線,Oracle中可以使用“(+)”來表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面將配合例項一一介紹。除了顯示匹配相等連線條件的資訊之外,還顯示無法匹配相等連線條件的某個表的資訊。

  外連線採用(+)來識別。

  A) 左條件(+) = 右條件;

  代表除了顯示匹配相等連線條件的資訊之外,還顯示右條件所在的表中無法匹配相等連線條件的資訊。

  此時也稱為"右外連線".另一種表示方法是:

  SELECT ... FROM 表1 RIGHT OUTER JOIN 表2 ON 連線條件

  B) 左條件 = 右條件(+);

  代表除了顯示匹配相等連線條件的資訊之外,還顯示左條件所在的表中無法匹配相等連線條件的資訊。

  此時也稱為"左外連線".

  SELECT ... FROM 表1 LEFT OUTER JOIN 表2 ON 連線條件

  例 顯示員工資訊以及所對應的部門資訊

  --無法顯示沒有部門的員工資訊

  --無法顯示沒有員工的部門資訊

  --SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

  --直接做相等連線:

  SELECT * FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

  REM 顯示員工資訊以及所對應的部門資訊,顯示沒有員工的部門資訊

  --SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO;

  SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

  REM 顯示員工資訊以及所對應的部門資訊,顯示沒有部門的員工資訊

  --SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO(+);

  SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

  3. 不等連線

  兩個表中的相關的兩列進行不等連線,比較符號一般為>,<,...,BETWEEN.. AND..

  REM SALGRADE

  --DESC SALGRADE;

  --SELECT * FROM SALGRADE;

  REM 顯示員工的編號,姓名,工資,以及工資所對應的級別。

  SELECT EMPNO,ENAME,SAL,SALGRADE.* FROM SALGRADE,EMP

  WHERE EMP.SAL BETWEEN LOSAL AND HISAL;

  REM 顯示僱員的編號,姓名,工資,工資級別,所在部門的名稱;

  SELECT EMPNO,ENAME,SAL,GRADE,DNAME FROM EMP,DEPT,SALGRADE

  WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.SAL BETWEEN LOSAL AND HISAL;

  4. 自連線

  自連線是資料庫中經常要用的連線方式,使用自連線可以將自身表的一個映象當作另一個表來對待,從而能夠得到一些特殊的資料。下面介紹一下自連線的方法:

  將原表複製一份作為另一個表,兩表做笛卡兒相等連線。

  例 顯示僱員的編號,名稱,以及該僱員的經理名稱

  SELECT WORKER.ENAME,WORKER.MGR,MANAGER.EMPNO,MANAGER.ENAME FROM EMP WORKER,EMP MANAGER

  WHERE WORKER.MGR = MANAGER.EMPNO;