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左右兩部分同時限制的目的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM