繁体   English   中英

MySQL SELECT列FROM表WHERE列为NULL

[英]MySQL SELECT column FROM table WHERE column IS NULL

使用Toad for MySQL ,这对我不起作用。 我正在Windows上使用XAMPP 1.83 MySQL 5.5

我有一个表,列InstitutionState定义为VARCHAR(20) 某些行似乎具有此列“空”,这意味着LENGTH(InstitutionState) = 0

如果我SELECT ... WHERE InstitutionState IS NULL ,则不会获得任何行。

如果我SELECT ... WHERE InstitutionState = '' ,那么它将起作用。 为什么是这样?

这是示例数据。

mysql> select InstitutionState, ISNULL(InstitutionState), length(InstitutionState)
    ->   from institution;
+----------------------+--------------------------+--------------------------+
| InstitutionState     | ISNULL(InstitutionState) | length(InstitutionState) |
+----------------------+--------------------------+--------------------------+
| NY                   |                        0 |                        2 |
| NY                   |                        0 |                        2 |
| NY                   |                        0 |                        2 |
| IL                   |                        0 |                        2 |
| NC                   |                        0 |                        2 |
| TX                   |                        0 |                        2 |
| DC                   |                        0 |                        2 |
| NY                   |                        0 |                        2 |
| CA                   |                        0 |                        2 |
|                      |                        0 |                        0 |
| KS                   |                        0 |                        2 |
|                      |                        0 |                        0 |
| NY                   |                        0 |                        2 |
| ND                   |                        0 |                        2 |
| PA                   |                        0 |                        2 |
| WI                   |                        0 |                        2 |
| PA                   |                        0 |                        2 |
| MD                   |                        0 |                        2 |
| IN                   |                        0 |                        2 |
| PA                   |                        0 |                        2 |
| NE                   |                        0 |                        2 |
| ID                   |                        0 |                        2 |
| CA                   |                        0 |                        2 |
|                      |                        0 |                        0 |
| FL                   |                        0 |                        2 |
| MO                   |                        0 |                        2 |
|                      |                        0 |                        0 |
| OH                   |                        0 |                        2 |
| IL                   |                        0 |                        2 |
| OH                   |                        0 |                        2 |

从概念上讲, NULL表示“缺少未知值”

要么

NULL表示无数据,空虚,无,未知,缺失值等 空字符串表示空字符串。

  • 混淆NULL值和空字符串可能会导致数据完整性问题。

在关系数据库的上下文中, NULL意思是,指向字符字段的指针在行的标题中设置为0x00 ,因此没有数据可访问。

  • NULL''占用磁盘上完全相同的字节数。

因此,没有节省空间。

  • 您可以在可以具有NULL值的列上添加索引。 否则,必须声明一个索引列NOT NULL ,并且不能在该列中插入NULL

此外,与不允许NULL相比,允许NULL的限制较少。 只有这样,如果出现任何实体完整性问题,就可以通过FEWER检查数据是否正确。 因此,从逻辑上讲,允许NULL应该始终有一个充分的充分理由,而不允许NULL是一个好习惯。

mysql> INSERT INTO ... (InstitutionState) VALUES (NULL);

mysql> INSERT INTO ... (InstitutionState) VALUES ('');

这两个语句都会在InstitutionState列中插入一个值,但是第一个语句将插入NULL值,第二个语句将插入一个空字符串。 第一个的含义可以视为“未知机构状态”,第二个的含义可以视为“已知机构不具有状态,因此也没有InstitutionState”。

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

mysql> SELECT ... WHERE InstitutionState = NULL;

要查找NULL值,必须使用IS NULL测试。 以下语句显示如何查找NULL InstitutionState和空InstitutionState:

mysql> SELECT ... WHERE InstitutionState IS NULL;

mysql> SELECT ... WHERE InstitutionState = '';

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;

+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+

您不能使用算术比较运算符(例如=,<或<>)测试NULL。 为了自己演示这一点,请尝试以下查询:

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;

+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+

此外,

要获得'' AND NULL

我们将使用:

 SELECT ... WHERE IFNULL(InstitutionState , '') = '';

它说如果该字段为NULL ,则假装它是一个空字符串,即''

NULL值不是SQL中的实际值,而是缺少值。 人们可以认为这是未知的 因此,甚至NULL都不等于另一个null

空值实际上是作为行上的位掩码实现的,它指示哪些列具有空值。 因此,这些值甚至没有以与其他值相同的方式存储在堆表中,这就是为什么必须将一列显式声明为nullable的原因之一。

字符串''实际上已知的。 了解'' 这不是null ,也不在元组上设置了null位

出于这个原因,查询行,其中一列IS NULL 不会的值返回行''也不会为行查询,其中一栏是''返回空值。 它们是完全不同的两件事。

实际上有一些例外。 例如,在Oracle中,对''任何引用都将隐式转换NULL 此行为早在80年代就已在真正的SQL标准之前实现,因此Oracle出于向后兼容的原因不得不对其进行维护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM