在本教學中,將瞭解SQL Server LEFT JOIN
子句以及如何使用它來查詢來自多個表的數據。
SQL Server LEFT JOIN子句簡介
LEFT JOIN
子句用於查詢來自多個表的數據。它返回左表中的所有行和右表中的匹配行。 如果在右表中找不到匹配的行,則使用NULL
代替顯示。
以下說明如何使用LEFT JOIN
子句來連接兩個表T1
和T2
:
SELECT
select_list
FROM
T1
LEFT JOIN T2 ON
join_predicate;
在上面語法中,T1
和T2
分別是左表和右表。
對於T1
表中的每一行,查詢將其與T2
表中的所有行進行比較。 如果一對行導致連接謂詞計算為TRUE
,則將組合這些行中的列值以形成新行,然後將其包含在結果集中。
如果左表(T1
)中的行沒有與來自T2
表的任何匹配行,則查詢將左表中的行的列值與來自右表的每個列值的NULL
組合。
簡而言之,LEFT JOIN
子句返回左表(T1
)中的所有行以及右表(T2
)中匹配的行或NULL
值。
以下說明了兩個表T1(1,2,3)
和T2(A,B,C)
的LEFT JOIN
過程:
在上面圖示中,T2
表中的行不與T1
表中的行1
匹配,因此使用NULL
。 T1
表中的第2
行和第3
行分別與T2
表中的行A
和行B
匹配。
SQL Server LEFT JOIN示例
請參閱以下products
和 order_items
表的結構:
每個銷售訂單專案包括一個產品。 order_items
和products
表之間的鏈接是通過product_id
列中的值。
以下語句使用LEFT JOIN
子句查詢products
和order_items
表中的數據:
SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
ORDER BY
order_id;
執行上面查詢語句,得到以下結果:
從結果集中可以清楚地看到,order_id
列中的NULL
列表表明相應的產品尚未銷售給任何客戶。
可以使用WHERE
子句來過濾結果集。 以下查詢返回未出現在任何銷售訂單中的產品:
SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
WHERE order_id IS NULL
ORDER BY
order_id;
執行上面查詢語句,得到以下結果:
與往常一樣,SQL Server在LEFT JOIN
子句之後處理WHERE
子句。
SQL Server LEFT JOIN的條件:ON與WHERE子句
以下查詢查找屬於訂單ID為100
的產品:
SELECT
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
WHERE order_id = 100
ORDER BY
order_id;
執行上面查詢語句,得到以下結果:
如果將條件order_id = 100
移動到ON
子句:
SELECT
p.product_id,
product_name,
order_id
FROM
production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id AND p.product_id = 100
ORDER BY
order_id DESC;
執行上面查詢語句,得到以下結果:
查詢返回了所有產品,但只有ID為100
的產品具有關聯的訂單數據。
請注意,對於INNER JOIN
子句,如果將ON
子句中的條件放在WHERE
子句中,則它在功能上是等效的。