【東軟實訓】SQL多表連接

若是一個查詢同時涉及兩個以上的表,則稱之爲連接查詢,連接查詢是關係數據庫中最主要的查詢,主要包括等值連接查詢、非等值連接查詢、自身連接查詢、外連接查詢和複合條件連接查詢。 
這篇博文咱們來對多表連接進行學習。數據庫

Outline

Notes

## 連接的基本概念

  • 連接是在多個表之間經過必定的連接條件,使表之間發生關聯,進而能從多個表之間獲取數據。
  • 語法爲
    SELECT    table1.column, table2.column
    FROM    table1, table2
    WHERE    table1.column1 = table2.column2;
  • 在 WHERE子句中書寫連接條件。N個表相連時,至少須要N-1個連接條件。
  • 若是在多個表中出現相同的列名,則須要使用表名做爲來自該表的列名的前綴。

【連接的分類】性能

  一個用戶查詢請求涉及到多個表的時候,連接兩個表的條件爲=時,就是等值連接查詢;其餘的運算符連接的就是非等值查詢。 注意:連接條件中的各連接字段類型必須是可比的,但沒必要是相同的,整型和實型是可比的,可是字符型和整型就不可比。學習

  內鏈接,也被稱爲天然鏈接,只有兩個表相匹配的行才能在結果集中出現。返回的結果集選取了兩個表中全部相匹配的數據,捨棄了不匹配的數據。spa

  外鏈接不只包含符合鏈接條件的行,還包含左表(左鏈接時)、右表(右鏈接時)或兩個邊接表(全外鏈接)中的全部數據行。設計

 

## Oracle自有的鏈接方法(select from語句)

【等值鏈接】code

 連接兩個表的條件爲=時,就是等值連接查詢blog

SQL> SELECT     emp.empno,   emp.ename, emp.deptno, dept.deptno, dept.loc
  2  FROM       emp, dep
3 WHERE emp.deptno=dept.deptno;

 

注意:咱們還可使用And運算符添加其餘查詢條件,如:數學

注意:咱們還能夠用列別名提升性能和限制歧義列名table

  • 在用到多個表時可使用表名做前綴來限定列;
  • 經過使用表前綴能夠提升性能;
  • 經過使用列的別名能夠區分來自不一樣表可是名字相同的列;

如:class

 

【非等值鏈接】

 

SQL>    SELECT  e.ename, e.sal, s.grade
   2    FROM    emp e,   salgrade s
   3    WHERE   e.sal
   4    BETWEEN     s.losal AND s.hisal;

 

 

【自身鏈接】

   一個表與本身進行鏈接,這種鏈接稱爲表的自身鏈接查詢。 
  具體實現的時候,咱們能夠把本身的表起兩個別名,一個是first, 一個是second.在設計的時候能夠把這兩個表想成是徹底兩個同樣的表,可是各自的字段咱們均可以只有調用訪問。 

SQL> SELECT worker.ename||' leader is '||manager.ename
  2  FROM    emp worker, emp manager
  3  WHERE   worker.mgr = manager.empno;

 

 ## SQL標準語法鏈接方法

 【交叉鏈接】

  • 交叉鏈接會產生連個表的交叉乘積,和兩個表之間的笛卡爾積是同樣的;
  • 交叉鏈接使用 CROSS JOIN 子句完成。
  • 笛卡爾積: 第一個表中的全部行和第二個表中的全部行都發生鏈接。
  • 笛卡爾積在下列狀況產生:
    • 鏈接條件被省略
    • 鏈接條件是無效的
  • 爲了不笛卡爾積的產生,一般須要在WHERE子句中包含一個有效的鏈接條件。
<--笛卡爾積寫法-->
SQL> SELECT     emp.empno,   emp.ename, emp.deptno,dept.deptno, dept.loc
         FROM       emp, dept;


<--交叉鏈接寫法--> SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc FROM emp CROSS JOIN dept;

 

【天然鏈接】

  • 天然鏈接是對兩個表之間相同名字和數據類型的列進行的等值鏈接;
  • 若是兩個表之間相同名稱的列的數據類型不一樣,則會產生錯誤;
  • 使用NATURAL JOIN子句來完成。如:
    SELECT  empno,ename,sal,deptno,loc 
    FROM    emp 
    NATURAL JOIN     dept; 

【Using和On語句】

天然鏈接是使用全部名稱和數據類型相匹配的列做爲鏈接條件,而USING子句能夠指定用某個或某幾個相同名字和數據類型的列做爲鏈接條件,如:

SELECT     e.ename,e.ename,e.sal,deptno,d.loc 
FROM       emp e JOIN dept d USING (deptno) 
WHERE      deptno = 20 ;

 

  • 使用USING子句建立鏈接時,應注意如下幾點:
    • 若是若是有若干個列名稱相同但數據類型不一樣,天然鏈接子句能夠用USING子句來替換,以指定產生等值鏈接的列
    • 有多於一個列都匹配的狀況,使用USING子句只能指定其中的一列
    • USING子句中的用到的列不能使用表名和別名做爲前綴
    • NATURAL JOIN子句和USING子句是相互排斥的,不能同時使用
  • On語句:
    • 天然鏈接條件基本上是具備相同列名的表之間的等值鏈接;
    • 若是要指定任意鏈接條件,或指定要鏈接的列,則可使用ON子句;
    • 用ON將鏈接條件和其它檢索條件分隔開,其它檢索條件寫在WHERE子句
    • 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; 

 

【左外鏈接、右外鏈接、全鏈接】

  • 外連不但返回符合鏈接和查詢條件的數據行,還返回不符合條件的一些行。外鏈接分三類:左外鏈接(LEFT OUTER JOIN)、右外鏈接(RIGHT OUTER JOIN)和全外鏈接(FULL OUTER JOIN)。
  • 三者的共同點是都返回符合鏈接條件和查詢條件(即:內鏈接)的數據行。不一樣點以下:
    • 左外鏈接(⟕)還返回左表中不符合鏈接條件單符合查詢條件的數據行。
    • 右外鏈接(⋉)還返回右表中不符合鏈接條件單符合查詢條件的數據行。
    • 全外鏈接()還返回左表中不符合鏈接條件單符合查詢條件的數據行,而且還返回右表中不符合鏈接條件單符合查詢條件的數據行。全外鏈接實際是上左外鏈接和右外鏈接的數學合集(去掉重複),即「全外=左外 UNION 右外」。
  • 說明:左表就是在「(LEFT OUTER JOIN)」關鍵字左邊的表。在三種類型的外鏈接中,OUTER 關鍵字是可省略的。
<--左外鏈接-->
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);
相關文章
相關標籤/搜索