SQL 核心概念:JOIN 和 UNION 的区别
一个比喻彻底搞懂,再也不混淆
📖 先说结论
很多初学者容易把 JOIN 和 UNION 搞混,因为它们都是"把两张表合在一起"。但合并的方向完全不同:
JOIN 是把两张表左右合并,像把两张纸并排贴在一起。
UNION 是把两张表上下合并,像把两张纸上下拼接成一张长纸。
用逻辑来理解:
- JOIN(左右合并):表 A + 表 B = 结果(列变多)
- UNION(上下合并):表 A + 表 B = 结果(行变多)
🔗 一、JOIN —— 横向拼接
核心思想
JOIN 用于将同一业务实体的不同维度拼在一起。两张表之间必须存在可以对齐的关联关系(通常是外键),把符合条件的行左右合并成一行。
典型场景
我有一张订单表,想同时看到订单信息 + 下单患者的姓名。
订单表和患者表之间存在 patient_id 关联,每一条订单对应一个患者,这就是典型的横向拼接场景。
-- 查询订单,同时展示患者姓名
SELECT o.order_no AS 订单号,o.amount AS 金额,u.real_name AS 患者姓名
FROM orders o
JOIN patient_user u ON o.patient_id = u.id
WHERE o.create_time >= '2024-01-01'
结果长这样:
| 订单号 | 金额 | 患者姓名 |
|---|---|---|
| ORDER_001 | 199.00 | 张三 |
| ORDER_002 | 299.00 | 李四 |
| ORDER_003 | 99.00 | 张三 |
每一行都是一条订单 + 这条订单对应的患者,数据是横向扩展的,列变多了,行数不变(或者因为匹配关系有所变化)。
JOIN 的几种类型
-- INNER JOIN(内连接):只返回两边都能匹配上的行
SELECT * A B A.id B.a_id
A B A.id B.a_id
A B A.id B.a_id


