在本教程中,将了解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
子句中,则它在功能上是等效的。