1. 程式人生 > >SQL server 使用 內聯結(INNER JOIN) 聯結多個表 (以及過濾條件 WHERE, AND使用區別)

SQL server 使用 內聯結(INNER JOIN) 聯結多個表 (以及過濾條件 WHERE, AND使用區別)

INNER JOIN ……ON的語法格式:

FROM (((表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號) INNER JOIN 表3 ON 表1.欄位號=表3.欄位號) 
INNER JOIN 表4 ON Member.欄位號=表4.欄位號) INNER JOIN 表X ON Member.欄位號=表X.欄位號;

 

連線兩個資料表語法格式:

FROM 表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號

連線三個資料表語法格式:

FROM (表1 INNER JOIN 表2 ON 表1.欄位號=表2.欄位號) 
INNER JOIN 表3 ON 表1.欄位號=表3.欄位號;

程式碼示例:

SELECT cust_name, cust_contact
FROM ((Customers INNER JOIN Orders ON Orders.cust_id =         
            Customers.cust_id) 
   INNER JOIN OrderItems ON OrderItems.order_num = 
            Orders.order_num)
   WHERE prod_id = 'RGAN01';

此處 WHERE 也可換成 AND

  • 對於inner join 兩種寫法在查詢結果上沒有區別。
  • 對於left join和right join 兩種寫法在查詢結果上是不一致的。

 

join聯結可以簡單理解為以下過程:

  • 首先兩個表做一個笛卡爾積。
  • 然後根據on後面的條件對這個笛卡爾積做一個過濾形成一張臨時表。
  • 如果有where就對上一步的臨時表再進行過濾,進而得到最終的結果集。
  • 也就是說如果inner join left join聯查過濾條件放在on中就是在第二步進行的過濾;如果過濾條件放在where中就是在第三步進行的過濾。

 

對於left join和right join 兩種寫法在查詢結果上是不一致的:

 

  • inner join內連線是沒有左右某部分為null的情況的,而對於left join和right join左右連線而言存在左右某部分為null的情況。
  • 以left join左連線為例 A left join B,如果你把過濾條件寫在on中,on後面的條件只對右表B有效,那最終結果集中這個限制對A是沒有影響的,因為就算是B中的資料被過濾了,A中的資料仍舊可以匹配null來展示(左連線性質)。同理right join也是一樣。
  • 如果你把過濾條件寫在where中,因為where中的過濾是上面所說的過程中的第三步,是對第二步生成的臨時表的過濾,所以會直接體現到對最後結果的限制,也就是等同於對AB左右兩部分同時限制的目的。