full join 和left join区别
时间: 2023-04-06 15:03:00 浏览: 143
Full join 和 left join 都是 SQL 中的连接查询,它们的区别在于返回的结果集不同。Left join 返回左表中所有记录和右表中匹配的记录,如果右表中没有匹配的记录,则返回 NULL 值。而 Full join 返回左表和右表中所有记录,如果某个表中没有匹配的记录,则返回 NULL 值。
相关问题
inner join和left join和full join和right join
### 不同类型的SQL连接操作的区别和用法
#### Inner Join
`INNER JOIN` 返回两个表中满足连接条件的记录。这意味着只有当左表和右表都存在匹配的数据时,才会返回这些数据。
```sql
SELECT *
FROM TableA AS A
INNER JOIN TableB AS B ON A.id = B.id;
```
此查询仅会显示那些在 `TableA` 和 `TableB` 中都有对应 `id` 值的行[^1]。
#### Left Join
`LEFT JOIN` (也称为 `LEFT OUTER JOIN`)返回左表中的所有记录,即使右表中不存在匹配项。对于没有找到匹配的情况,在结果集右边会出现 NULL 值。
```sql
SELECT *
FROM TableA AS A
LEFT JOIN TableB AS B ON A.id = B.id;
```
这段代码将展示来自 `TableA` 的每一行;如果 `TableB` 中有相应的匹配,则一起呈现;如果没有,则填充 NULL[^4]。
#### Right Join
`RIGHT JOIN` 是 `LEFT JOIN` 的镜像版本——它保留右侧表格的所有条目,并补充左侧可能存在的任何关联数据。同样地,缺少的部分会被标记为 NULL。
```sql
SELECT *
FROM TableA AS A
RIGHT JOIN TableB AS B ON A.id = B.id;
```
这里的结果将是基于 `TableB` 完整性的集合,加上从 `TableA` 获取的相关信息。
#### Full Join
`FULL JOIN` 或者说是 `FULL OUTER JOIN` 将两者的特性结合起来,即无论哪一侧是否有匹配,都会列出所有的组合情况。因此,最终得到的是两张原始表各自独立以及交叉部分的整体视图。未配对的地方则由 NULL 补充完整。
```sql
SELECT *
FROM TableA AS A
FULL JOIN TableB AS B ON A.id = B.id;
```
上述语句能够提供最全面的信息覆盖度,因为它不仅包含了共同拥有的项目,还包括了单独存在于任一表内的实体[^5]。
多表关联 full join 和left join
### SQL Full Join 与 Left Join 的区别及使用场景
#### 定义与功能
Full Join 是一种返回两个表中所有匹配和不匹配记录的结果集的方式。如果某个表中的记录在另一个表中找不到匹配项,则结果集中会显示 NULL 值[^3]。相比之下,Left Join 只保留左表中的所有记录,并补充右表中存在的匹配部分;对于右表中不存在的匹配项,在结果集中对应的位置填充为 NULL 值。
#### 使用语法
以下是两种连接方式的标准语法:
```sql
-- Full Join 示例 (适用于支持 FULL JOIN 的数据库如 PostgreSQL, Oracle 等)
SELECT columns
FROM table1
FULL OUTER JOIN table2
ON table1.common_column = table2.common_column;
-- Left Join 示例
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.common_column = table2.common_column;
```
需要注意的是,MySQL 并未原生支持 FULL OUTER JOIN 功能[^3]。因此,在 MySQL 中实现类似的功能通常需要借助 UNION 来组合 LEFT JOIN 和 RIGHT JOIN 的结果。
#### 数据处理差异
假设存在两张表 `employees` 和 `departments`,其中 `employees.department_id` 对应于 `departments.id` 字段。执行以下查询时,两者的输出会有显著不同:
- **Full Join**: 返回员工表 (`employees`) 和部门表 (`departments`) 所有记录,无论是否存在对应的关联关系。如果没有找到关联的数据,则用 NULL 表示缺失的部分。
- **Left Join**: 仅展示来自左侧表(即 `employees`)的所有行以及右侧表(即 `departments`)能够匹配上的列值。若某条员工记录无法映射到任何部门,则该位置填入 NULL。
#### 实际案例对比
考虑下面的例子来进一步说明它们之间的差别:
| employee_id | name | department_id |
|-------------|---------|---------------|
| 1 | Alice | 1 |
| 2 | Bob | null |
| id | dept_name |
|----|----------------|
| 1 | HR |
| 3 | Engineering |
##### 查询语句
```sql
-- Using Full Outer Join
SELECT e.name AS emp_name, d.dept_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
-- Using Left Join
SELECT e.name AS emp_name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
```
##### 输出结果
- **Full Join**:
```
emp_name | dept_name
---------|--------------
Alice | HR
Bob | null
null | Engineering
```
- **Left Join**:
```
emp_name | dept_name
---------|--------------
Alice | HR
Bob | null
```
可以看到,Full Join 还额外包含了那些只存在于右边表而不在左边表里的项目(例如 "Engineering" 部门),这正是其独特之处所在[^3]。
#### 应用场景分析
- 当希望获取完整的数据集合,既包括主表也包括辅助表的信息时,应该优先选用 Full Join;
- 如果更关注主体对象本身及其可能存在的附加属性描述,则可以选择效率更高的 Left Join 方式来进行操作。
---
阅读全文
相关推荐















