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;
以下维恩图说明了上述右连接操作: