2014-02-27 76 views
2

这不适用于我,使用Toad代替MySQL。我在Windows上使用XAMPP 1.83MySQL 5.5MySQL SELECT列FROM表WHERE列IS NULL

我有一个表InstitutionState定义为VARCHAR(20)。有些行看起来有这个列“空”,意思是LENGTH(InstitutionState) = 0

If I 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 | 
+1

呃,因为'NULL'和'''不一样!'! – Strawberry

+0

除非你使用Oracle ..叹气。 –

+0

因为您的空字符串(“”)作为列值不为NULL,NULL表示没有值全部在(值未定义) – avisheks

回答

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 | 
+-----------+---------------+ 

不能使用算术比较操作符,如=,<,或者<>测试空。为了证明自己这一点,请尝试以下查询:

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

> IFNULL(InstitutionState,'')='' 这就是我正在寻找的。谢谢。 –

0

NULL值不是在SQL的实际值,但缺乏一个值。人们可以把它想象成未知的。出于这个原因,甚至没有NULL等于另一个空

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

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

为此,查询行,其中一列IS NULL返回行与''值也不会查询行,其中一列是''返回空值。他们是两个完全不同的东西。

实际上有一个几个例外。例如,在Oracle中,对''的任何引用将是隐式地将转换为NULL。这个行为在真正的SQL标准出现之前就已经在80年代实现了,所以Oracle为了向后兼容的原因必须维护它。

+0

(也不等于!) – Strawberry

+0

@Strawberry - 我认为'NULL == NULL'解析为'NULL',这很有道理。 “这个未知数与未知数相等吗?” - “我不知道!” –

+0

迈克,我不得不重新考虑我以Oracle为中心的立场,即null和空字符串应该意味着同样的事情。如果您的数字列包含数量,则NULL应该表示未知,而0表示零。我认为一个空字符串是数字零的字符等价物。例如,一个中间名字段(我没有中间名)如果NULL表示中间名是未知的,而设置为空字符串,则表示没有(因此数字为0)。但是,我不知道当数据来自网页上的字段时,如何区分NULL和NULL。 –

相关问题