簡體   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