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 JOIN
和RIGHT 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;
以下维恩图说明了上述右连接操作:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器