📅  最后修改于: 2023-12-03 15:37:09.660000             🧑  作者: Mango
在SQL中,连接(Join)是一种将多个表中的数据进行复合的方式,其中右外连接和左外连接是两种常见的连接方式。
左外连接(Left Outer Join)是一种连接方式,它将左侧表的每一行数据与右侧表中符合条件的行数据按照指定的规则进行复合,并返回复合结果。如果右侧表中没有符合条件的行,则以 NULL 值来填充右侧表的那些列。
左外连接的语法如下:
SELECT [列名称]
FROM 表1
LEFT JOIN 表2 ON 表1.列名称 = 表2.列名称;
右外连接(Right Outer Join)与左外连接类似,但是它将右侧表的每一行数据与左侧表中符合条件的行数据按照指定的规则进行复合,并返回复合结果。如果左侧表中没有符合条件的行,则以 NULL 值来填充左侧表的那些列。
右外连接的语法如下:
SELECT [列名称]
FROM 表1
RIGHT JOIN 表2 ON 表1.列名称 = 表2.列名称;
为了更好地理解左外连接和右外连接,下面是一个简单的示例。假设我们有两张表,一张存储了员工的信息,另一张存储了员工的销售记录。我们希望列出所有员工的销售记录,如果有员工没有销售记录,那么也要将该员工列出来。
首先构建员工信息表:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL
);
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1, 'John', 'Doe'), (2, 'Alice', 'Smith'), (3, 'Bob', 'Johnson');
然后构建员工销售记录表:
CREATE TABLE sales (
sales_id INT PRIMARY KEY,
employee_id INT NOT NULL,
sale_amount DECIMAL(10,2) NOT NULL
);
INSERT INTO sales (sales_id, employee_id, sale_amount)
VALUES (1, 1, 500.00), (2, 1, 1000.00), (3, 2, 250.00);
现在,我们可以使用左外连接来列出所有员工的销售记录:
SELECT employees.employee_id, employees.first_name, employees.last_name, sales.sale_amount
FROM employees
LEFT JOIN sales ON employees.employee_id = sales.employee_id;
结果如下:
employee_id | first_name | last_name | sale_amount
-------------|------------|-----------|--------------------
1 | John | Doe | 500.00
1 | John | Doe | 1000.00
2 | Alice | Smith | 250.00
3 | Bob | Johnson | NULL
我们发现,所有员工都被列出来了,其中 Bob 没有销售记录,但是他也被列出来了,以 NULL 填充了销售记录部分。
同样的,我们可以使用右外连接来列出所有销售记录及其对应的员工信息:
SELECT employees.employee_id, employees.first_name, employees.last_name, sales.sale_amount
FROM employees
RIGHT JOIN sales ON employees.employee_id = sales.employee_id;
结果如下:
employee_id | first_name | last_name | sale_amount
-------------|------------|-----------|--------------------
1 | John | Doe | 500.00
1 | John | Doe | 1000.00
2 | Alice | Smith | 250.00
(NULL) | (NULL) | (NULL) | 1500.00
这次,所有销售记录都被列出来了,同时也包括一条 NULL 行,这是因为员工信息表中没有对应的数据。