您好!欢迎访问家园网-www.jy.wang!

家园网

啥是左外连接

网络 作者:本站 点击:

下面是sql左外连接的示例,在goods商品信息表和good_type商品类型表中,

通过左外连接查询每个商品的商品id(goods_id)、商品名称(goods_name)和商品所属类型(name)。

请讲解一下下面的代码。不是很明白,什么左外连接,啥意思?这里不用LEFT还不一样吗?

SELECT goods_id,goods_name,name
FROM goods LEFT JOIN goods_type
ON goods.goods_type=goods_type.id ORDER BY goods_id DESC;


你的问题非常好,很多初学者对左外连接(LEFT JOIN)都会有同样的疑惑。我们一步步来拆解。

一、先理解两张表的作用

  • goods(商品表):存具体商品,比如“华为手机”、“苹果电脑”。每个商品有一个 goods_type 字段,存的是“类型编号”。

  • goods_type(商品类型表):存类型名称,比如 1→手机,2→电脑。

例子数据:

goods 表

goods_id

goods_name

goods_type

101

华为手机

1

102

苹果电脑

2

103

三星耳机

99 ← 注意:99 不在类型表中


goods_type 表

idname
1手机
2电脑

二、什么是左外连接(LEFT JOIN)

左外连接:以 左边的表(这里是 goods)为主表,
把左边表所有行都保留,右边表(goods_type)有匹配就显示,没有匹配就用 NULL 填充。

你的 SQL:

sql

SELECT goods_id, goods_name, nameFROM goods LEFT JOIN goods_typeON goods.goods_type = goods_type.idORDER BY goods_id DESC;

三、LEFT JOIN 和不加 LEFT(即 INNER JOIN)的区别

连接方式结果说明
LEFT JOIN保留 左表所有行。如果右边表没有匹配 → name 为 NULL
INNER JOIN(直接写 JOIN)只保留两边都匹配的行。右边表没有匹配 → 整行不显示

具体结果对比

LEFT JOIN 结果(你的代码)

goods_id

goods_name

name

103

三星耳机

NULL ← 虽然类型99不存在,商品依然出现

102

苹果电脑

电脑

101

华为手机

手机


如果换成 JOIN / INNER JOIN

goods_idgoods_namename
102苹果电脑电脑
101华为手机手机

编号 103 的三星耳机直接消失,因为它的 goods_type=99 在类型表里没有匹配。

四、什么时候必须用 LEFT JOIN?

当你要保留主表所有信息,即使某些字段在另一张表里查不到。
比如:

  • 查出所有商品,类型未知的也要显示(用 NULL 表示)

  • 统计每个商品的销售情况(没卖过的商品也要列出)

如果不用 LEFT JOIN,那些“类型缺失”或“无销量”的商品会被悄悄过滤掉,可能导致你漏掉数据

五、简单记忆

  • LEFT JOIN = 左表全要,右表能配就配,配不到填空(NULL)

  • INNER JOIN = 两边都要能配上,否则不显示

你现在的例子中,如果有商品类型编号在 goods_type 表里不存在,
用 LEFT JOIN → 还能看到这个商品,只是类型显示为 NULL
用 JOIN → 这个商品直接不出现。

六、你的 SQL 末尾的 ORDER BY goods_id DESC

意思是按商品 ID 从大到小排序,所以 103 会排在前面。

标签: