MySQL:选择列为空的行

Posted

技术标签:

【中文标题】MySQL:选择列为空的行【英文标题】:MySQL: selecting rows where a column is null 【发布时间】:2011-04-01 23:43:45 【问题描述】:

我遇到了一个问题,当我尝试为某个列选择具有 NULL 的行时,它返回一个空集。但是,当我查看 phpMyAdmin 中的表格时,大多数行都显示为 null。

我的查询如下所示:

SELECT pid FROM planets WHERE userid = NULL

每次都是空集。

很多地方说要确保它不存储为“NULL”或“null”而不是实际值,还有一个说尝试只寻找一个空格 (userid = ' '),但这些都没有奏效。有人建议不要使用 MyISAM 并使用 innoDB,因为 MyISAM 无法存储 null。我将表切换到innoDB,但现在我觉得问题可能是它实际上仍然不是空的,因为它可能会转换它。我想这样做,而不必将表重新创建为 innoDB 或其他任何东西,但如果必须,我当然可以尝试。

【问题讨论】:

MyISAM 存储空值没有问题。 NULL 本身的语义应该独立于引擎。 【参考方案1】:
SELECT pid FROM planets WHERE userid is null;

【讨论】:

【参考方案2】:

SQL NULL 的特殊性,你必须这样做WHERE field IS NULL,因为 NULL 不能等于任何东西,

包括自身(即:NULL = NULL 始终为假)。

Rule 3https://en.wikipedia.org/wiki/Codd%27s_12_rules

【讨论】:

未知 - 不是假的。 SQL 使用三值逻辑。 NULL = NULL 并不是真正的 FALSE - 它又是 NULL。但它也不是 TRUE,所以 IF(NULL = NULL) 不会执行。 另见@obe 答案:SELECT 1 1, NULL NULL, 1 NULL; -> 1, 1, 0 null 不仅不等于任何东西,也不等于任何东西。换句话说,select * from foo where bar <> "abc"返回 bar 为空的行。这让我今天陷入了困境。文档将<> 称为“不等于”运算符,但实际上它是“等于”运算符。【参考方案3】:

在查询中遇到同样的问题:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

没有返回值。 似乎是 MyISAM 的问题,对 InnoDB 中数据的相同查询返回了预期结果。

去:

SELECT * FROM 'column' WHERE 'column' = ' '; 

返回所有预期结果。

【讨论】:

【参考方案4】:

来自http://w3schools.com/sql/sql_null_values.asp的信息:

1) NULL 值表示缺少未知数据。

2) 默认情况下,表列可以保存 NULL 值。

3) NULL 值与其他值的处理方式不同

4) 不能比较NULL和0;它们是不等价的。

5) 无法通过比较来测试 NULL 值 运算符,例如 =、。

6) 我们将不得不使用 IS NULL 和 IS NOT NULL 运算符

所以如果您遇到问题:

SELECT pid FROM planets WHERE userid IS NULL

【讨论】:

【参考方案5】:

还有一个<=> 运算符:

SELECT pid FROM planets WHERE userid <=> NULL

会工作的。好消息是 &lt;=&gt; 也可以与非 NULL 值一起使用:

SELECT NULL &lt;=&gt; NULL 产生1

SELECT 42 &lt;=&gt; 42 也会产生 1

请看这里:https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to

【讨论】:

【参考方案6】:

我在将数据库从 Access 转换为 MySQL 时遇到了同样的问题(使用 vb.net 与数据库通信)。

我需要评估一个字段(字段类型 varchar(1))是否为空。

此语句适用于我的场景:

SELECT * FROM [table name] WHERE [field name] = ''

【讨论】:

如果这对你有用,你的 varchar(1) 的默认值是 '' 而不是 null,因此与这个问题无关。【参考方案7】:

既然都给出了答案,我想再补充一点。我也遇到过同样的问题。

为什么您的查询失败了?你有,

SELECT pid FROM planets WHERE userid = NULL;

这不会给你预期的结果,因为来自mysql doc

在 SQL 中,NULL 值与任何其他值相比永远不会为真,即使是 NULL。 包含 NULL 的表达式始终会产生 NULL 值,除非在运算符和函数的文档中另有说明参与表达。

强调我的。

要搜索 NULL 的列值,您不能使用 expr = NULL 测试。以下语句不返回任何行,因为 expr = NULL 对于任何表达式都不为真

解决方案

SELECT pid FROM planets WHERE userid IS NULL; 

要测试NULL,请使用IS NULLIS NOT NULL 运算符。

operator IS NULL 测试一个值是否为NULL。 operator IS NOT NULL 测试一个值是否不是NULL。 MySQL comparison operators

【讨论】:

【参考方案8】:
SELECT pid FROM planets WHERE userid IS NULL

【讨论】:

以上是关于MySQL:选择列为空的行的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP PDO 准备语句和 MySQL 选择字段为空的行

excel 怎样筛选出 有一个值为空的行

春季启动和休眠:更新条目为空的所有列的行

选择至少一列为 NaN 的数据框的行 [重复]

根据可以具有值或为空的字段选择组内的行

按列分组,优先选择另一列不为空的行