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:

· 需要两个表都有对应数据的场景

· 如:查询有订单的客户

  1. 何时用 LEFT JOIN:

· 需要主表全部记录,关联表信息可有可无

· 如:查询所有员工及其部门(包括未分配部门的员工)

· 数据完整性检查(查找没有对应关系的记录)

  1. 性能注意:

```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 是左表的全集与右表的交集组合

相关推荐
未若君雅裁1 小时前
MySQL-MVCC核心原理-版本链ReadView与可见性判断
数据库·mysql
KaMeidebaby5 小时前
卡梅德生物技术快报|骆驼纳米抗体:从原核表达、高通量测序到分子对接全流程实现
前端·数据库·其他·百度·新浪微博
2301_783848658 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
TE-茶叶蛋9 小时前
DBeaver 的Explain 执行计划,分析sql的性能
数据库·sql
CLX05059 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
m0_617493949 小时前
PySide6 网络请求深度实测:从基础 API 调用到数据解析实战指南
数据库
知识汲取者10 小时前
每日一篇高频面试题系列之【MySQL 锁】
数据库·mysql
老纪10 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
麦聪聊数据10 小时前
数据 API 平台选型:深度解读数据服务的四大关键技术与架构底座
数据库·sql
IT研究所10 小时前
AI 时代下的知识管理:从 Claude 的“复盘”能力看生成式 AI价值
大数据·运维·数据库·人工智能·科技·低代码·自然语言处理