SQL-全连接


SQL全连接

SQL Full Join通过将两个表连接为一个整体来创建一个新表。连接的表包含两个表中的所有记录,并为两侧缺失的匹配项填充 NULL 值。简而言之,全连接是一种外连接,它组合了左连接和右连接的结果集。

MySQL 不支持完全外连接。相反,您可以通过在从 Left Join 和 Right Join 获得的结果集之间执行并集操作来模仿其工作原理。

让我们借助下面的维恩图详细了解这个概念。假设我们有两个表作为两组(用圆圈表示)。使用完全连接获得的结果集(或新连接的表)只不过是这两个集合的并集。

全面加入
您还可以通过对 LEFT JOIN 和 RIGHT JOIN 的结果集执行 UNION 操作来获得与 FULL JOIN 等效的结果集。

句法

以下是 SQL 中 Full Join 的基本语法 -

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name;

例子

假设我们创建了一个名为 CUSTOMERS 的表,其中包含客户的个人详细信息,包括姓名、年龄、地址和工资等。使用以下查询 -

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

现在使用 INSERT 语句将值插入到该表中,如下所示 -

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

该表将创建为 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

让我们创建另一个表 ORDERS,其中包含订单的详细信息以及订单的日期。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2)
);

使用 INSERT 语句,将值插入到该表中,如下所示 -

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

该表显示如下 -

奥德 日期 客户ID 数量
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

以下查询连接 SQL Server 中的 CUSTOMERS 和 ORDERS 两个表 -

SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

输出

结果表如下 -

ID 姓名 数量 日期
1 拉梅什 无效的 无效的
2 基兰 1560 2009-11-20 00:00:00
3 考希克 3000 2009-10-08 00:00:00
3 考希克 1500 2009-10-08 00:00:00
4 柴塔利 2060 2008-05-20 00:00:00
5 哈迪克 无效的 无效的
6 科马尔 无效的 无效的
7 莫菲 无效的 无效的

使用全连接连接多个表

完全连接查询还可以用于连接两个以上的表。为此,我们一次按顺序组合两个表,直到所有表连接在一起。

需要注意的是,MySQL数据库中并没有提供直接使用FULL JOIN关键字对多个表进行join操作的规定。相反,一次计算两个表上的 LEFT JOIN 和 RIGHT JOIN 的 UNION,直到所有表都连接起来。

句法

使用 Full Join 连接多个表的语法如下 -

SELECT column1, column2, column3... 
FROM table1
FULL JOIN table2
ON condition_1
FULL JOIN table3
ON condition_2
....
....
FULL JOIN tableN
ON condition_N;

例子

为了演示 Full Join,让我们考虑之前创建的示例表 CUSTOMERS 和 ORDERS,并使用以下查询创建另一个表名称 EMPLOYEE -

CREATE TABLE EMPLOYEE (
   EID INT NOT NULL,
   EMPLOYEE_NAME VARCHAR (30) NOT NULL,
   SALES_MADE DECIMAL (20)
);

现在,我们可以使用 INSERT 语句将值插入到这个空表中,如下所示 -

INSERT INTO EMPLOYEE VALUES
(102, 'SARIKA', 4500),
(100, 'ALEKHYA', 3623),
(101, 'REVATHI', 1291),
(103, 'VIVEK', 3426);

创建的 EMPLOYEE 表如下所示 -

伊德 EMPLOYEE_NAMENAME 已销售
102 萨里卡 4500
100 阿莱克亚 3623
101 瑞瓦蒂 1291
103 威威克 3426

让我们使用下面给出的完整连接查询来连接这三个表 -

SELECT CUSTOMERS.ID, CUSTOMERS.NAME, ORDERS.DATE, EMPLOYEE.EMPLOYEE_NAME 
FROM CUSTOMERS 
FULL JOIN ORDERS 
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID 
FULL JOIN EMPLOYEE 
ON ORDERS.OID = EMPLOYEE.EID; 

通过此查询,我们将显示客户的 ID、姓名以及下订单的日期以及销售该商品的员工的姓名。

输出

结果表如下 -

ID 姓名 日期 员工姓名
1 拉梅什 无效的 无效的
2 基兰 2009-11-20 00:00:00 瑞瓦蒂
3 考希克 2009-10-08 00:00:00 阿莱克亚
3 考希克 2009-10-08 00:00:00 萨里卡
4 柴塔利 2008-05-20 00:00:00 威威克
5 哈迪克 无效的 无效的
6 科马尔 无效的 无效的
7 莫菲 无效的 无效的

带有 WHERE 子句的完整联接

默认情况下,联接使用 ON 子句来过滤记录。假设还需要根据某个条件/约束来过滤这些记录,我们还可以将 WHERE 子句与 Join 结合使用。

句法

与 WHERE 子句一起使用时 Full Join 的语法如下 -

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

例子

考虑前两个表 CUSTOMERS 和 ORDERS,并通过使用 WHERE 子句应用一些约束,使用以下完全联接查询来联接它们。

SELECT ID, NAME, DATE, AMOUNT FROM CUSTOMERS
FULL JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
WHERE ORDERS.AMOUNT > 2000.00;

输出

应用具有完全连接的 WHERE 子句后的结果表包含金额值大于 2000.00 的行 -

ID 姓名 日期 数量
3 考希克 2009-10-08 00:00:00 3000.00
4 柴塔利 2008-05-20 00:00:00 2060.00