SQL - 全连接



SQL 全连接

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

MySQL 不支持全外部连接。您可以通过对从左连接和右连接获得的结果集执行联合运算来模拟其工作方式。

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

Full Join
您还可以通过对左连接和右连接的结果集执行 UNION 操作来获得 FULL JOIN 的等效结果集。

语法

以下是 SQL 中全连接的基本语法:

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 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

让我们创建另一个名为 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);

该表显示如下:

OID 日期 CUSTOMER_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 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 Kaushik 3000 2009-10-08 00:00:00
3 Kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

使用全连接连接多个表

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

请注意,在 MySQL 数据库中,没有直接使用 FULL JOIN 关键字对多个表执行连接操作的规定。相反,一次计算两个表的左连接和右连接的 UNION,直到所有表都连接。

语法

使用全连接连接多个表的语法如下所示:

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

示例

为了演示全连接,让我们考虑我们之前创建的示例表 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 表将如下所示:

EID 员工姓名 销售额
102 SARIKA 4500
100 ALEKHYA 3623
101 REVATHI 1291
103 VIVEK 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 Ramesh NULL NULL
2 Khilan 2009-11-20 00:00:00 REVATHI
3 Kaushik 2009-10-08 00:00:00 ALEKHYA
3 Kaushik 2009-10-08 00:00:00 SARIKA
4 Chaitali 2008-05-20 00:00:00 VIVEK
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

带有 WHERE 子句的全连接

连接使用 ON 子句默认过滤记录。假设还需要根据特定条件/约束过滤这些记录,我们也可以将 WHERE 子句与连接一起使用。

语法

与 WHERE 子句一起使用全连接的语法如下所示:

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 Kaushik 2009-10-08 00:00:00 3000.00
4 Chaitali 2008-05-20 00:00:00 2060.00
广告