在 SQL 中,左连接(LEFT JOIN / LEFT OUTER JOIN)出现空值(NULL)是非常正常的现象,根本原因在于:左表的数据一定保留,而右表如果没有匹配记录,就用 NULL 来“占位”。
下面从原理到例子给你讲清楚。
SELECT *
FROM A
LEFT JOIN B
ON A.id = B.a_id;
规则只有一句话:
以左表 A 为主,A 的所有行都会出现在结果中;
如果 B 中没有匹配的行,B 的字段就用 NULL 填充。
例如:
用户表 users(左表)
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
订单表 orders(右表)
| id | user_id | amount |
|---|---|---|
| 10 | 1 | 100 |
| 11 | 2 | 200 |
执行:
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;
结果:
| name | amount |
|---|---|
| 张三 | 100 |
| 李四 | 200 |
| 王五 | NULL |
✅ 王五没有订单 → 右表无匹配 → NULL
例如:
ON A.id = B.id
但 B 里根本没有对应的 id
→ 左表数据还在
→ 右表全部是 NULL
即使匹配成功,如果右表字段本身存的是 NULL:
o.amount IS NULL
结果中也会显示 NULL(但这不是“连接造成的”)
ON A.id = B.a_id
AND B.status = 1
如果 status ≠ 1:
→ 视为“无匹配”
→ 右表字段为 NULL
| 情况 | 是否会有 NULL |
|---|---|
| 右表全匹配 | ❌ 没有 |
| 右表部分不匹配 | ✅ 有 |
| 右表为空表 | ✅ 全 NULL |
| INNER JOIN | ❌ 不会(直接丢弃) |
❌ “左连接应该是左表补右表” ✅ 实际是:右表补不了就用 NULL
❌ “NULL 是bug” ✅ NULL 是 SQL 表示“不存在”的标准方式
SELECT u.name, COALESCE(o.amount, 0)
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
WHERE o.id IS NULL
(找“没有订单的用户”)
INNER JOIN
左连接出现 NULL,是因为“左表必须保留,右表匹配不上”,
SQL 用 NULL 表示“这里没有数据”。
如果你愿意,可以把你的 SQL 或表结构发出来,我可以帮你具体看为什么出现了 NULL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。