下面是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 表
| id | name |
|---|---|
| 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_id | goods_name | name |
|---|---|---|
| 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 会排在前面。