内连接 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
表 order
✅ 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='手机'