MySQL SELECT列FROM表WHERE列IS NULL

时间:2014-02-27 16:39:00

标签: mysql null

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

我有一个列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 |

2 个答案:

答案 0 :(得分:3)

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

OR

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值,第二个插入一个空字符串。第一个的含义可以被视为“机构状态未知”,第二个的含义可以被视为“已知机构没有状态,因此没有机构状态。”

要搜索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 |
+----------+-----------+----------+----------+

此外,

获取''NULL s,

我们会使用:

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

如果字段NULL假装它是空字符串,即'',则说明。

答案 1 :(得分:0)

NULL值不是SQL中的实际值,而是缺少值。人们可以将其视为 unknown 。出于这个原因,即使NULL等于另一个空

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

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

出于这个原因,查询列IS NULL的行返回值为''的行,也不会查询列为{{1}的行返回空值。它们是两个完全不同的东西。

实际上有几个例外。例如,在Oracle中,对''的任何引用都将隐式转换为''。这种行为是在真正的SQL标准之前的80年代实现的,因此Oracle出于向后兼容性的原因不得不维护它。