MYSQL Left Join 如何选择 NULL 值?
Posted
技术标签:
【中文标题】MYSQL Left Join 如何选择 NULL 值?【英文标题】:MYSQL Left Join how do I select NULL values? 【发布时间】:2012-07-15 01:19:33 【问题描述】:这是我上一个关于 mysql 中的表连接的问题的后续问题
我需要能够从左连接表中选择 NULL 值。
这是我的加入:
table1.id | table1.name | table2.id | table2.surname
1 | John | 1 | Doe
2 | Michael | 2 | Anderson
3 | Anna | NULL | NULL
4 | Sue | NULL | NULL
我想select WHERE table2.surname = NULL
,但是这样的查询不起作用:
SELECT table1.*,table2.*
FROM table1
LEFT JOIN table2
ON table1.id=table2.id
WHERE table2.surname=NULL
我可以理解它背后的逻辑没有给我任何结果,但必须有一种方法来获取它们的结果?
感谢任何帮助。
【问题讨论】:
【参考方案1】:要比较 NULL
值,您必须使用 IS NULL
谓词,如下所示:
SELECT table1.*, table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL
【讨论】:
与问题没有直接关系,但您必须使用WHERE
子句,而不是连接中的AND
子句,才能取回有意义的值。那让我绊倒了。【参考方案2】:
尝试:
SELECT table1.*,table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL
【讨论】:
【参考方案3】:你必须使用IS NULL
而不是= NULL
:
WHERE table2.surname IS NULL
之所以不能简单地做= NULL
是因为NULL
本质上是一个“未知数”,不能等于或不等于任何东西(甚至不等于它自己),所以试图将它与某个东西进行比较,就好像它应该是一个完全匹配的东西只会返回NULL
而不是预期的布尔值@987654327 @ 或 1
,这正是您的查询返回空结果的原因。
“未知”和“等于未知”之间有明显的区别。您当然可以测试某事物是否是未知或不是未知,但您无法测试某事物是否“等于” unknown,因为 unknown 是 unknown,它没有意义。
另外,由于您使用的是 MySQL,另一种选择是使用 table2.surname <=> NULL
,其中 <=>
是 MySQL 特定的 NULL 安全比较运算符,但尽量不要使用它并坚持使用标准 SQL方式(IS NULL
/IS NOT NULL
)
【讨论】:
【参考方案4】:根据MySQL specification,您应该使用“IS NULL”而不是“= NULL”。 它说“(NULL = NULL)等于NULL”。但是当它用作布尔值时,NULL 等于 False。
【讨论】:
以上是关于MYSQL Left Join 如何选择 NULL 值?的主要内容,如果未能解决你的问题,请参考以下文章
在 MYSQL 中执行 LEFT OUTER JOIN 时插入零而不是 NULL
带有 LEFT JOIN 和 GROUP BY 的 COUNT(*) 在 MySQL 中包含 NULL