7.10 SQL Server全外连接查询

SQL Server Full Outer Join

SQL Server全外连接简介

全外连接也称全连接,效果很像左连接和右连接的结合起来。

当左表中的行不存在匹配行时,右表的列将包含NULL。同样,当右表中的行不存在匹配行时,左表的列将包含NULL。

语法:

SELECT 
    select_list
FROM 
    T1
FULL OUTER JOIN T2 ON condition;

同样OUTER关键字可省略:

SELECT 
    select_list
FROM 
    T1
FULL JOIN T2 ON condition;

语法中:

  • 首先在FROM子句中指定左表T1。
  • 然后指定右表T2和连接条件。

下面的维恩图解说明了FULL OUTER JOIN的结果:

全连接示例

先给示例创建几张新表:

首先,创建一个名为pm(project management)的架构,代表项目管理:

CREATE SCHEMA pm;
GO

然后在pm架构下创建项目表(projects)和成员表(members):

CREATE TABLE pm.projects(
    id INT PRIMARY KEY IDENTITY,
    title VARCHAR(255) NOT NULL
);

CREATE TABLE pm.members(
    id INT PRIMARY KEY IDENTITY,
    name VARCHAR(120) NOT NULL,
    project_id INT,
    FOREIGN KEY (project_id) 
        REFERENCES pm.projects(id)
);

假设每个成员只能参与一个项目,并且每个项目有零个或多个成员。如果项目处于初始阶段,则没有分配成员。

然后,在项目和成员表中插入一些行:

INSERT INTO 
    pm.projects(title)
VALUES
    ('New CRM for Project Sales'),
    ('ERP Implementation'),
    ('Develop Mobile Sales Platform');


INSERT INTO
    pm.members(name, project_id)
VALUES
    ('John Doe', 1),
    ('Lily Bush', 1),
    ('Jane Doe', 2),
    ('Jack Daniel', null);

然后,查看一下两个表中的数据

SELECT * FROM pm.projects;

SELECT * FROM pm.members;

最后,使用FULL OUTER JOIN查询项目和成员表中的数据:


SELECT 
    m.name member, 
    p.title project
FROM 
    pm.members m
    FULL OUTER JOIN pm.projects p 
        ON p.id = m.project_id;

在本例中,查询返回参与项目的成员、不参与任何项目的成员以及没有任何成员的项目。

要查找不参与任何项目的成员和没有任何成员的项目,请在上述查询SQL语句中添加WHERE子句:

SELECT 
    m.name member, 
    p.title project
FROM 
    pm.members m
    FULL OUTER JOIN pm.projects p 
        ON p.id = m.project_id
WHERE
    m.id IS NULL OR
    P.id IS NULL;

通过输出可以清楚知道,Jack Daniel没有参与任何项目,项目Develop Mobile Sales Platform没有任何成员。

posted @ 2023-01-29 11:07  平元兄  阅读(707)  评论(0编辑  收藏  举报