左连接、右连接和全外连接的区别
数据库管理系统 (DBMS) 允许使用连接从多个表中检索数据。连接主要是两个或多个关系(或表)的笛卡尔积。
SQL 连接大致分为内连接和外连接。内连接从满足连接条件的表中选择行。但是使用内部连接数据,特别是两个表中不满足条件的行都会丢失。外连接可用于防止表中的数据丢失。
外部连接的类型:
外连接再次分为 3 种类型: 左外连接 、 右外连接 和 完全外连接 。这些解释如下:
1. 左外连接:
左外连接返回左侧表中的所有行,右侧表中的列填充为空。左外连接从两个表中检索满足连接条件的所有行以及左表的不匹配行。
语法:
SELECT [column1, column2, ....]
FROM table1
LEFT OUTER JOIN table2 ON
table1.matching_column = table2.matching_column
WHERE [condition];
或者:
SELECT [column1, column2, ....]
FROM table1
LEFT OUTER JOIN table2
ON table1.matching_column = table2.matching_column
WHERE [condition];
图解表示:
2. 右外连接:
右外连接返回右侧表中的所有行,左侧表中的列填充为空。右外连接从两个表中检索满足连接条件的所有行以及右表的不匹配行。
语法:
SELECT [column1, column2, ....]
FROM table1
RIGHT OUTER JOIN table2 ON
table1.matching_column = table2.matching_column
WHERE [condition];
语法:
SELECT [column1, column2, ....]
FROM table1
RIGHT OUTER JOIN table2
ON table1.matching_column(+) = table2.matching_column
WHERE [condition];
图解表示:
3. 全外连接:
完全外连接返回两个表中的所有行。当左表中的行不存在匹配行时,右表的列被空填充。同样,当右表中的行不存在匹配行时,左表的列被空填充。全外连接是左外连接和右外连接的并集。
语法:
SELECT [column1, column2, ....]
FROM table1
FULL OUTER JOIN table2
ON table1.matching_column = table2.matching_column
WHERE [condition];
图解表示:
例子:
假设有一个员工表,有以下数据:
假设有一个部门表,有以下数据:
- 左外连接查询:
Select empid, ename, deptid, deptname
from employee
left outer join department
on employee.empdept = department.deptname;
查询结果:
- 右外连接查询:
Select empid, ename, deptid, deptname
from employee right outer join department
on employee.empdept = department.deptname;
查询结果:
- 全外连接查询:
Select empid, ename, deptid, deptname
from employee full outer join department
on employee.empdept = department.deptname;
查询结果:
左外连接、右外连接、全外连接的区别:
左外连接 | 右外连接 | 完全外连接 |
---|---|---|
从左侧表中获取所有行 | 从右侧表中获取所有行 | 从两个表中获取所有行 |
内连接 + 左表中所有不匹配的行 | 内连接 + 右表中所有不匹配的行 | 内连接 + 左表和右表中所有不匹配的行 |
右表不匹配数据丢失 | 左表不匹配数据丢失 | 无数据丢失 |