SQL JOIN 类型对比:LEFT JOIN 与 INNER JOIN

SQL JOIN 类型对比:LEFT JOIN 与 INNER JOIN

INNER JOIN(内连接)

工作原理:只返回两个表中匹配的行

```sql
SELECT *
FROM 表A a
INNER JOIN 表B b ON a.id = b.a_id;
```

结果特点:

· 仅包含表A和表B中连接条件匹配的行
· 如果表B没有匹配的行,则表A的该行不会出现在结果中
· 如果表A没有匹配的行,则表B的该行不会出现在结果中

可视化:

```
表A       表B        结果
A1  ←→  B1        A1 + B1
A2  ←→  B2        A2 + B2
A3  ←→  (无)      (无)
(无) ←→  B4       (无)
```

LEFT JOIN(左连接)

工作原理:返回左表所有行,以及右表匹配的行

```sql
SELECT *
FROM 表A a
LEFT JOIN 表B b ON a.id = b.a_id;
```

结果特点:

· 包含左表(表A)的所有行
· 如果右表(表B)没有匹配的行,则结果中右表字段为 NULL
· 也称为 LEFT OUTER JOIN

可视化:

```
表A       表B        结果
A1  ←→  B1        A1 + B1
A2  ←→  B2        A2 + B2
A3  ←→  (无)      A3 + NULL
(无) ←→  B4       (无)
```

实际示例对比

假设有以下数据:

employees 表:

id name dept_id
1 张三 101
2 李四 102
3 王五 999

departments 表:

dept_id dept_name
101 技术部
102 市场部
103 人事部

INNER JOIN 示例:

```sql
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
```

结果(只返回匹配的行):

name dept_name
张三 技术部
李四 市场部

LEFT JOIN 示例:

```sql
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
```

结果(返回所有员工,部门不存在则为NULL):

name dept_name
张三 技术部
李四 市场部
王五 NULL

关键区别总结

特性 INNER JOIN LEFT JOIN
别名 内连接、等值连接 左连接、左外连接
返回行数 ≤ 两个表的行数 ≥ 左表行数
未匹配结果 丢弃 左表保留,右表为NULL
使用场景 需要两边都存在的关联数据 需要左表全部数据,关联表数据可有可无
性能 通常较快(数据量少) 可能较慢(需要处理NULL)
NULL处理 不会产生NULL 会产生NULL

实用建议

1. 何时用 INNER JOIN:
   · 需要两个表都有对应数据的场景
   · 如:查询有订单的客户
2. 何时用 LEFT JOIN:
   · 需要主表全部记录,关联表信息可有可无
   · 如:查询所有员工及其部门(包括未分配部门的员工)
   · 数据完整性检查(查找没有对应关系的记录)
3. 性能注意:
   ```sql
   -- 使用 WHERE 过滤 LEFT JOIN 结果时注意
   SELECT e.name, d.dept_name
   FROM employees e
   LEFT JOIN departments d ON e.dept_id = d.dept_id
   WHERE d.dept_id IS NULL;  -- 查找没有部门的员工
   
   -- vs
   SELECT e.name, d.dept_name
   FROM employees e
   LEFT JOIN departments d ON e.dept_id = d.dept_id
   WHERE d.dept_id = 101;  -- 这会将 LEFT JOIN 变为类似 INNER JOIN
   ```

记忆技巧

· INNER JOIN:取两个表的"交集"
· LEFT JOIN:保证左表完整,"能匹配就匹配,不能匹配就补NULL"
· 可以类比为数学中的集合操作:INNER JOIN 是交集,LEFT JOIN 是左表的全集与右表的交集组合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值