MySQL SELECT列FROM表WHERE列为NULL



这对我不起作用,将Toad用于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值,第二个语句插入空字符串。第一个词的含义可以被视为"机构国家未知",第二个词的意思可以被视是"机构已知没有国家,因此没有机构国家">

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

mysql> SELECT ... WHERE InstitutionState = NULL;

要查找NULL值,必须使用IS NULL测试。以下语句显示如何查找NULLInstitutionState和空的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 |
+----------+-----------+----------+----------+

此外,

  • MyISAM MYSQL中,不使用NULL,每行保存一位
  • 虽然NULL本身不需要任何存储空间,但如果表定义包含任何定义为NULL的列,则NDBCLUSTER每行保留4个字节,最多32个NULL列。(如果MySQL Cluster表定义的NULL列超过32列,最多64列,则每行保留8个字节。)
  • 它还使数据库工作得更快

要获得''NULLs,

我们将使用:

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

它表示如果字段是NULL,则假定它是一个空字符串,即''

NULL值不是SQL中的实际值,而是缺少值。人们可以认为它是未知的。因此,即使NULL也不等于另一个null。

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

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

因此,查询列为IS NULL的行不会返回值为''的行,也不会查询列为''的行返回null值。它们是两种完全不同的东西。

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

相关内容

  • 没有找到相关文章

最新更新