国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL查詢NULL值處理函數(shù)詳解

2024-07-24 12:37:23
字體:
供稿:網(wǎng)友

我們已經(jīng)看到使用WHERE子句的SQL SELECT命令來從MySQL表獲取數(shù)據(jù),但是,當(dāng)我們試圖給的條件比較字段或列的值為NULL,它不能正常工作.

為了處理這種情況,MySQL提供了三大運(yùn)算符.

IS NULL:此運(yùn)算符返回true,當(dāng)列的值是NULL.

IS NOT NULL:運(yùn)算符返回true,當(dāng)列的值不是NULL.

<=> 操作符比較值(不同于=運(yùn)算符)為ture,即使兩個NULL值.

涉及NULL條件是特殊的,不能使用 =NULL 或 !=NULL 尋找NULL值的列,這種比較總是告訴他們是否是真正的失敗,因?yàn)檫@是不可能的,即使是NULL=NULL失敗.

如果要查找是或不是NULL的列,請使用IS NULL或IS NOT NULL.

如果你想要尋找值是NULL的列,你不能使用=NULL測試,下列語句不返回任何行,因?yàn)閷θ魏伪磉_(dá)式.expr = NULL是假的,代碼如下:

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想尋找NULL值,你必須使用IS NULL測試,下例顯示如何找出NULL電話號碼和空的電話號碼,代碼如下:

mysql> SELECT * FROM my_table WHERE phone IS NULL;

mysql> SELECT * FROM my_table WHERE phone = "";

為了有助于NULL的處理,你能使用IS NULL和IS NOT NULL運(yùn)算符和IFNULL()函數(shù).

試試下面的例子,代碼如下:

  1. root@host# mysql -u root -p password
  2. Enter password:******* 
  3. mysql> use TUTORIALS; 
  4. Database changed 
  5. mysql> create table tcount_tbl 
  6.     -> ( 
  7.     -> tutorial_author varchar(40) NOT NULL
  8.     -> tutorial_count  INT 
  9.     -> ); 
  10. Query OK, 0 rows affected (0.05 sec) 
  11. mysql> INSERT INTO tcount_tbl 
  12.     -> (tutorial_author, tutorial_count) values ('mahran', 20); 
  13. mysql> INSERT INTO tcount_tbl 
  14.     -> (tutorial_author, tutorial_count) values ('mahnaz'NULL); 
  15. mysql> INSERT INTO tcount_tbl 
  16.     -> (tutorial_author, tutorial_count) values ('Jen'NULL); 
  17. mysql> INSERT INTO tcount_tbl 
  18.     -> (tutorial_author, tutorial_count) values ('Gill', 20); 
  19.  
  20. mysql> SELECT * from tcount_tbl; 
  21. +-----------------+----------------+ 
  22. | tutorial_author | tutorial_count | 
  23. +-----------------+----------------+ 
  24. | mahran          |             20 | 
  25. | mahnaz          |           NULL | 
  26. | Jen             |           NULL | 
  27. | Gill            |             20 | 
  28. +-----------------+----------------+ 
  29. rows in set (0.00 sec) 
  30.  
  31. mysql> 

可以看到=和!=不使用NULL值,如下所示:

  1. mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL
  2. Empty set (0.00 sec) 
  3. mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL
  4. Empty set (0.01 sec) 

要找到,其中tutorial_count列是或不是NULL的記錄,查詢應(yīng)該這樣寫:

  1. mysql> SELECT * FROM tcount_tbl  
  2.     -> WHERE tutorial_count IS NULL
  3. +-----------------+----------------+ 
  4. | tutorial_author | tutorial_count | 
  5. +-----------------+----------------+ 
  6. | mahnaz          |           NULL | 
  7. | Jen             |           NULL | 
  8. +-----------------+----------------+ 
  9. rows in set (0.00 sec) 
  10. mysql> SELECT * from tcount_tbl  
  11.     -> WHERE tutorial_count IS NOT NULL
  12. +-----------------+----------------+ 
  13. | tutorial_author | tutorial_count | 
  14. +-----------------+----------------+ 
  15. | mahran          |             20 | 
  16. | Gill            |             20 | 
  17. +-----------------+----------------+ 
  18. rows in set (0.00 sec) 

子查詢 NOT IN 與 NOT EXISTS 中的NULL,有些情況下 NOT IN 形式的子查詢返回空結(jié)果集,但是將其改寫為 NOT EXISTS 形式后則恢復(fù)正常,如下所示.

建表,代碼如下:

  1. mysql> CREATE TABLE t2 (col1 int default NULL, col2 int default NULL);    
  2.   Query OK, 0 rows affected (0.01 sec)    
  3.   mysql> CREATE TABLE t3 (col1 int default NULL, col2 int default NULL);    
  4.   Query OK, 0 rows affected (0.01 sec)   

加入數(shù)據(jù),代碼如下:

  1. mysql> INSERT INTO t2 VALUES (1,2),(1,3);    
  2. Query OK, 2 rows affected (0.00 sec)    
  3. Records: 2 Duplicates: 0 Warnings: 0    
  4. mysql> INSERT INTO t3 VALUES (1,2),(1,NULL);    
  5. Query OK, 2 rows affected (0.00 sec)    
  6. Records: 2 Duplicates: 0 Warnings: 0 

執(zhí)行如下查詢,代碼如下:

  1. mysql> SELECT * FROM t2 WHERE col2 NOT IN (SELECT col2 FROM t3);    
  2.  Empty set (0.00 sec)    
  3.  mysql> SELECT * FROM t2 WHERE NOT EXISTS (SELECT 1 FROM t3 WHERE t3.col2 = t2.col2);   //Vevb.com 
  4.  +------+------+    
  5.  | col1 | col2 |    
  6.  +------+------+    
  7.  | 1 | 3 |    
  8.  +------+------+    
  9.  1 row in set (0.00 sec) 

為什么會這樣呢?這要從MySQL數(shù)據(jù)庫NULL的特殊性說起:在MySQL中有三種狀態(tài):True、False、Unknown,任何NULL的比較操作都是Unknown狀態(tài),如下所示:

  1. mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;    
  2.     +----------+-----------+----------+----------+    
  3.     | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |    //Vevb.com
  4.     +----------+-----------+----------+----------+    
  5.     | NULL | NULL | NULL | NULL |    
  6.     +----------+-----------+----------+----------+    
  7.     1 row in set (0.00 sec)    

而且所有的查詢條件(ON, WHERE, HAVING)都是將Unknown狀態(tài)當(dāng)做False處理,所以第一條查詢的查詢田間等同于:col2 NOT IN (2, NULL) => col2 <> 2 AND col2 <> NULL => true AND Unknow => Unknow => False.

查詢條件永為False,故該查詢沒有返回結(jié)果,而 NOT EXISTS 是循環(huán)執(zhí)行的他首先執(zhí)行 SELECT 1 FROM t3 WHERE t3.col2 = 2,返回了結(jié)果,經(jīng) NOT EXISTS 操作后查詢條件為 False,故不做任何輸出,接下來執(zhí)行 SELECT 1 FROM t3 WHERE t3.col2 = 3

無返回結(jié)果,經(jīng) NOT EXISTS 操作后查詢條件為 True,于是輸出本次查詢結(jié)果.

所以,如果當(dāng)一個 NOT IN 子查詢沒有返回結(jié)果的時候,應(yīng)該特別注意內(nèi)層查詢的結(jié)果集是否包含空值,若包含的話,應(yīng)嘗試將查詢改寫為 NOT EXISTS 形式.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 枞阳县| 桃源县| 大竹县| 浏阳市| 兰考县| 龙岩市| 栖霞市| 咸宁市| 灵武市| 苗栗县| 永靖县| 句容市| 商洛市| 潜江市| 齐齐哈尔市| 伊通| 南岸区| 金昌市| 大田县| 凌海市| 津市市| 谢通门县| 赫章县| 丰镇市| 江西省| 梓潼县| 顺义区| 铜陵市| 德庆县| 汶川县| 成安县| 沁水县| 修武县| 株洲县| 隆安县| 谷城县| 西乌珠穆沁旗| 珲春市| 时尚| 邵武市| 资阳市|