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 @ 2023-01-29 11:05  平元兄  阅读(2275)  评论(0编辑  收藏  举报