7.9 SQL Server左连接与右连接查询

SQL Server左连接与右连接查询

SQL Server 左连接(Left Join)

SQL Server左连接简介

左连接是SELECT语句的一个子句。LEFT JOIN子句允许您查询多个表中的数据。

左联接返回左表中的所有行和右表中的匹配行。如果在右表中未找到匹配行,则使用NULL。

语法:

SELECT
select_list
FROM
T1
LEFT JOIN T2 ON
join_predicate;

其中 T1和T2分别是左表和右表。

如果左表中的行和右表中的行匹配上了,则和并这两个行中的列,然后输出到结果集中。

如果左表中的行没有和右表中任何行匹配上,则合并的行为左表中所有的列和右表中全为NULL的列。

简而言之,LEFT JOIN子句返回左表(T1)中的所有行以及右表(T2)中的匹配行或NULL值。

下面说明了两个表T1(1,2,3)和T2(A,B,C)的左连接。左连接将使用图案将T1表的行与T2表的行进行匹配:

在该图示中,T2表中没有行与T1表中的行1匹配;因此,使用NULL。T1表的行2和3分别与T2表的行A和B匹配。

SQL Server左连接示例

下面时产品表(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在左连接子句之后处理WHERE子句。

下面使用左连接连接三个表:产品表(products),订单表(orders),订单项(order_items):

SELECT
p.product_name,
o.order_id,
i.item_id,
o.order_date
FROM
production.products p
LEFT JOIN sales.order_items i
ON i.product_id = p.product_id
LEFT JOIN sales.orders o
ON o.order_id = i.order_id
ORDER BY
order_id;

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
o.order_id = 100
ORDER BY
order_id DESC;

查询返回了所有产品,但只有id为100的订单具有关联的产品信息。

但是请注意,对于内连接来说,把条件放于ON后面和WHERE子句后面是等效的。

SQL Server 右连接(Right Join)

SQL Server右连接简介

右连接子句从右表中开始选择数据,并将其与左表中的行进行匹配。右连接返回的结果集包括右表中的所有行,无论它们是否具有左表中的匹配行。

如果右表中的行没有左表中的任何匹配行,则结果集中左表的列将为空。

语法:

SELECT
select_list
FROM
T1
RIGHT JOIN T2 ON join_predicate;

在此语法中,T1是左表,T2是右表。

注意:RIGHT JOINRIGHT OUTER JOIN是一样的,OUTER关键字可以省略

以下维恩图说明了右连接操作:

SQL Server 右连接示例

如下是订单项(order_items)和产品(products)表

查询返回订单项(order_items)中的所有订单Id(order_id)和产品表(products)的所有产品名(product_name):

SELECT
product_name,
order_id
FROM
sales.order_items o
RIGHT JOIN production.products p
ON o.product_id = p.product_id
ORDER BY
order_id;

查询返回了产品表(右表)中的所有行以及订单项表(左表)中匹配上的行,如果产品没有任何销售,order_id列将为空。

要获取没有任何销售的产品,可以在上面的查询中添加WHERE子句,以筛选掉有销售的产品:

SELECT
product_name,
order_id
FROM
sales.order_items o
RIGHT JOIN production.products p
ON o.product_id = p.product_id
WHERE
order_id IS NULL
ORDER BY
product_name;

以下维恩图说明了上述右连接操作:

posted @   平元兄  阅读(2791)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示