1. 程式人生 > >關於多表查詢sql常用的連線語句:左外連線、右外連線、內連線

關於多表查詢sql常用的連線語句:左外連線、右外連線、內連線

1)內聯接:

   內聯接使用比較運算子(使用像 =  或 <> 之類的比較運算子)根據每個表共有的列的值匹配兩個表中的行,根據這兩張表中相同列的條件,得出其      交集。例如:  檢索 students和courses表中學生標識號相同的所有行。   

     有兩種,顯式的和隱式的,返回連線表中符合連線條件和查詢條件的資料行(連結表就是資料庫在做查詢形成的中間表)。

      隱式的內連線:

 沒有INNER JOIN,形成的中間表為兩個表的笛卡爾積。   

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C,ORDERS O
WHERE C.ID=O.CUSTOMER_ID;
    顯示的內連線:

一般稱為內連線,有INNER JOIN,形成的中間表為兩個表經過ON條件過濾後的笛卡爾積。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;
  但是,這兩個查詢的結果是一樣的。

2)左向外聯:

      是用的是LEFT  JOIN或LEFT OUTER JOIN     連線語句。

      根據兩張表的關係(外來鍵關聯),笛卡爾過濾,也就是求出兩張表的交集, 如果交集中,左邊表的行, 在右邊表中沒有匹配,則該條記錄左邊表有資料, 右邊表所有的欄位都為null。

       左外連線時,寫where語句的獨立查詢條件:  規則, on後面寫連線條件, where後寫查詢條件  

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
WHERE O.ORDER_NUMBER<>'MIKE_ORDER001';

3)右外連線:

      RIGHT  JOIN 或 RIGHT  OUTER  JOIN     連線語句

       和左外連線是相反的,查出的兩張表的交集, 如果這條記錄,右邊表有資料,左邊表沒有, 則把左邊表的欄位都設定為null。

 案例:

  a表     id   name     b表     id   job   parent_id   
              1   張3                   1     23     1   
              2   李四                 2     34     2   
              3   王武                 3     34     4       
  a.id同parent_id   存在關係   

  內連線查詢:

  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id      
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   

左連線   :
  select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id      
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
  3   王武                  null   
 右連線   :
  select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id       
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
  null                       3     34     4  

對於SQL查詢的基本原理:

1)單表查詢:根據WHERE條件過濾表中的記錄,然後根據SELECT的選擇列選擇相應的列進行返回最終結果。

 2)兩表連線查詢: 在on後面寫連線條件, 在where後面寫過濾的查詢條件,然後再根據SELECT指定的列返回查詢結果。

3)多表連線查詢:先對第一個和第二個表按照兩表連線做查詢,然後用查詢結果和第三個表做連線查詢,以此類推,直到所有的表都連線上為止,最終形成一箇中間的結果表,然後根據WHERE條件過濾中間表的記錄,並根據SELECT指定的列返回查詢結果。

關於on條件和where條件的區別:

ON條件:是過濾兩個連結表笛卡爾積形成中間表的約束條件。

WHERE條件:ON只進行連線操作,WHERE只過濾中間表的記錄。

對於連線型別的選擇:  在實際運用中如果連線型別選擇不當, 不但出現效率低並且可能還會出現邏輯的錯誤

1、 查兩表關聯列相等的資料用內連線

2、 Col_L是Col_R的子集時用右外連線。(左邊表是右邊表的子集,用右外)

3、 Col_R是Col_L的子集時用左外連線。(右邊表是左邊表的子集, 用左外)

4、 求差操作的時候用聯合查詢。

並且,多個表查詢的時候,這些不同的連線型別可以寫到一塊

例如:

SELECT T1.C1,T2.CX,T3.CY
FROM TAB1 T1
       INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)
       INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)
       LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);
WHERE T1.X >T3.Y;


參考:http://blog.csdn.net/nieson2012/article/details/45789461