mysql join null,关于mysql:了解此SQL LEFT JOIN(带有IS NULL)示例

本文解析了如何使用LEFT JOIN和WHERE IS NULL条件在category表中筛选出没有子级的'叶子'元素。通过示例和SQL代码,揭示了查询逻辑背后的原理,并讨论了别名和NULL值在查询中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在数据库中,有一个名为category的表:

创建它是为了创建相邻列表模型树。这是当前表格内的内容:

a7c3bfe1ec56b5e1dd67bf380f53669a.png

在此示例中(您可以在底部找到源链接),以下sql代码用于获取表中的"叶子"元素,其中"叶子"元素是表中没有其他任何行的行行在"父级"列中使用其" category_id"。运行以下代码:

SELECT t1.name FROM

category AS t1 LEFT JOIN category as t2

ON t1.category_id = t2.parent

WHERE t2.category_id IS NULL;

先前的SQL代码的结果给出了以下结果:

8773c6da30556678f0859dff58ac10ba.png

例如,表中没有行在父列内部具有值为3,因此TUBE(category_id == 3)是"叶"元素。

问题:为什么该sql代码在逻辑上给出此结果?我很高兴这样做,因为它是我所需要的,但我无法将其背后的理由包扎起来。

示例的来源:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

带有null检查的Outer joins是一种常见模式,用于查看表中是否存在记录,在这种情况下,检查category_id是否为parent。 与使用not exists或not in非常相似。

每当您看到此模式时:

认为:"在TableA中查找TableB中不存在的行。

您的查询的意思是"查找没有子级的类别"。 如果删除WHERE子句并向查询中添加更多列,则更容易理解:

SELECT      t1.category_id,

t1.name,

t2.name  AS ChildName

FROM        category AS t1

LEFT JOIN   category as t2 ON t1.category_id = t2.parent

这是您的查询中发生的事情:

从category表开始,将其别名为t1和t2。 从现在开始,我将参考别名。

对于t1中的每一行,在t2中查找将该t1行标识为其父级的所有记录

如果t1行没有子行,则t2.category_id将为null

我们只想过滤没有子项的t1行

好吧,我真的很接近理解! 第1行完善,第2行完善,第3行如果t1行没有子行,则Im混淆的地方t2.category_id将为null。 从一开始,t2.category_id列中的所有单元格都没有值吗?

想想"如果我找不到适合您的孩子,我会离开null代替您的孩子category_id"

那么这个推理正确吗?:FROM category AS t1 LEFT JOIN category as t2 ON t1.category_id = t2.parent首先列出所有t1s信息,然后仅添加MATCHING t2列的信息。 由于某些t1.category_id与任何t2.parent不匹配,因此对于t2.parent和t2.category_id它们都将具有NULL值。 从那里,代码说:WHERE t2.category_id IS NULL(我只想要那些不匹配的),并且只想要名称列SELECT t1.name? 这是否还意味着我可以将WHERE t2.category_id IS NULL;替换为WHERE t2.parent_id IS NULL;并获得相同的结果?

是的,在两种情况下您都是对的。 您的描述虽然比较技术性

如果您还没有一个,我亲爱的朋友应该从stackoverflow获得一个天才徽章

我认为如果重命名表别名会更容易看到发生了什么:

SELECT tparent.name

FROM category AS tparent

LEFT JOIN category as tchild

ON tparent.category_id = tchild.parent

WHERE tchild.category_id IS NULL;

现在,可能更容易看到您要查找的是没有子项的所有父类别名称的列表[tchild.category_id IS NULL]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值