【发布时间】:2018-11-08 06:59:18
【问题描述】:
我有 2 个 MySQL 表:join_test_l 和 join_test_r。
join_test_l:
+------+------+
| ca | cb |
+------+------+
| a | s |
| b | s |
| c | d |
| d | NULL |
+------+------+
join_test_r:
+------+------+
| cc | cb |
+------+------+
| a | NULL |
| b | s |
| c | d |
| d | NULL |
+------+------+
当我尝试使用左连接和左表上的<> 过滤器进行查询时:
select * from join_test_l as l left join join_test_r as r on l.cb=r.cb where l.ca<>'c';
+------+------+------+------+
| ca | cb | cc | cb |
+------+------+------+------+
| a | s | b | s |
| b | s | b | s |
| d | NULL | NULL | NULL |
+------+------+------+------+
l.ca 为 null 的行仍然存在。
当我尝试使用左连接和右表上的<> 过滤器进行查询时:
select * from join_test_l as l left join join_test_r as r on l.cb=r.cb where r.cc<>'c';
+------+------+------+------+
| ca | cb | cc | cb |
+------+------+------+------+
| a | s | b | s |
| b | s | b | s |
+------+------+------+------+
r.cc 为 null 的所有行也会被删除。
谁能解释一下?
我的意思是为什么结果集中的空值会被<> 子句过滤?
【问题讨论】:
-
嗨。这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并采取行动minimal reproducible example。
-
A minimal reproducible example 包括 DBMS、版本、清晰的规范、剪切、粘贴和可运行代码(包括输入)(表格初始化格式化为表格)和可区分(因此有序)所需的输出。但是调试的绝对基础说:表明你的程序在通过(子)表达式时做了你期望的事情,说明它是什么,并表明它实际上是通过增量输出做到的。研究(在手册和网络中)最少的附加代码,给出您无法解决的问题。重复,最小化工作代码。然后询问工作示例和问题示例之间的(小)差异。
-
NULL没有价值,它是“不确定的”,因此它不能等于任何东西,甚至等于另一个NULL(因为两者都是不确定的,你无法知道它们是否相同或不)。因此对于 NULL,您无法确定相等,因此您也无法确定 not 相等。这是 SQL 中常见的挫败感。考虑空值时必须使用IS:IS NULL或IS NOT NULL