小易说IT 小易说IT

SQL 中内连接和左连接的区别

内连接 INNER JOIN

只返回两张表中匹配成功的行,两边条件都满足才会出现在结果里。

取交集

语法:

SELECT *
FROM A
INNER JOIN B
ON A.id = B.a_id;
  • A 和 B 满足 A.id = B.a_id 的数据才保留

  • A 里没有匹配 B 的记录、B 里没有匹配 A 的记录,全部丢掉

左连接 LEFT JOIN(左外连接)

以左边表(A)为基准,左边表所有行全部保留;右边表匹配上就带出数据,匹配不上,右边字段填 NULL。

左表全部 + 右表匹配部分

语法:

SELECT *
FROM A
LEFT JOIN B
ON A.id = B.a_id;
  • A 的每条数据一定存在结果集中

  • B 找不到对应数据时,B 的列值为 NULL

一句话对比

  • INNER JOIN:有匹配才出来,两边缺一不可

  • LEFT JOIN:左表全部保留,右表有就匹配、没有就 NULL

举个直观例子

表 user

uid

name

1

张三

2

李四

3

王五

表 order

oid

uid

goods

101

1

手机

102

1

耳机

103

4

键盘

✅ INNER JOIN user & order on user.uid = order.uid 结果只有 uid=1 的两条(只有张三有订单匹配),李四、王五、uid=4 的订单都消失。

✅ LEFT JOIN user LEFT JOIN order on user.uid = order.uid 结果:张三 2 条订单、李四(订单字段 NULL)、王五(订单字段 NULL);uid=4 的订单不会出现。

高频坑提醒

左连接的筛选条件位置很关键:

-- ✅ 正确:只关联时过滤订单,左表数据不会丢
FROM user LEFT JOIN order ON user.uid = order.uid AND order.goods='手机'

-- ❌ 错误:写在 WHERE,相当于变成内连接!NULL 会被 where 过滤掉
FROM user LEFT JOIN order ON user.uid = order.uid WHERE order.goods='手机'