MySQL查詢是我們經常會用到的操作,下面將為您分析MySQL查詢中的非空問題,希望對您學習MySQL查詢方面能夠有些許的幫助。
表的訂單狀態字段設計為varchar類型,有以下值:NULL,pending,pending refund,refund,cancel.我們知道查詢狀態為cancel的訂單,SQL語句可以這樣寫:
- SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status = 'cancel'
SQL語句能查詢出正確的數據,但是當我們想查詢狀態為非cancel的訂單時,可能會出麻煩, 因為status字段沒有設置NOT NULL,所以大部分訂單的status值都是NULL,這樣的話,用'<>'查詢出來的數據不正確,只有status除了cancel之外 的非空數據查詢出來了,而為NULL的沒有查詢出來。SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status <> 'cancel'原 因:NULL值操作
NULL值可能令人感 到奇怪直到你習慣它。概念上,NULL意味著“沒有值”或“未知值”,且它被看作與眾不同的值。為了測試NULL,你不能使用算術比較 操作符例如=、<或!=。為了說明它,試試下列查詢:
- mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
- +----------+-----------+----------+----------+
- | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
- +----------+-----------+----------+----------+
- | NULL | NULL | NULL | NULL |
- +----------+-----------+----------+----------+
很 顯然你不能通過這些比較得到有意義的結果。相反使用IS NULL和IS NOT NULL操作符:
- mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
- +-----------+---------------+
- | 1 IS NULL | 1 IS NOT NULL |
- +-----------+---------------+
- | 0 | 1 |
- +-----------+---------------+
請注意在MySQL中,0或 NULL意味著假而其它值意味著真。布爾運算的默認真值是1。根據以上的NULL值操作結果,最終使用此種方式解決:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE IFNULL(o.status,'pending') <> 'cancel'學習:IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個數字或字符串值,取決於它被使 用的上下文環境。
- mysql> select IFNULL(1,0); ->1
- mysql> select IFNULL(0,10); ->0
- mysql> select IFNULL(1/0,10); ->10.0000
- mysql> select IFNULL(1/0,'yes');
- ->'yes'IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>0且expr1<>NULL),那麼IF()返回 expr2,否則它返回expr3。IF()返回一個數字或字符串值,取決於它被使用的上下文。
- mysql> select IF(1>2,2,3); -> 3
- mysql> select IF(1<2,'yes','no'); -> 'yes'
- mysql> select IF(strcmp('test','test1'),'yes','no'); -> 'no'
expr1作為整數值被計算,它意味著如 果你正在測試浮點或字符串值,你應該使用一個比較操作來做。
- mysql> select IF(0.1,1,0); -> 0
- mysql> select IF(0.1<>0,1,0); -> 1
在上面的第一種情況中,IF(0.1)返回0,因為0.1被變換 到整數值, 導致測試IF(0)。這可能不是你期望的。在第二種情況中,比較測試原來的浮點值看它是否是非零,比較的結果被用作一個整數。
- CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
- CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
第一個版本返回 result,其中value=compare-value。第二個版本中如果第一個條件為真,返回result。如果沒有匹配的result值,那麼結 果在ELSE後的result被返回。如果沒有ELSE部分,那麼NULL被返回。
- mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END; -> "one"
- mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END; -> "true"
- mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END; -> NULL
MySQL查詢超時問題的解決
MySQL無重復查詢的實現
詳解mysql命令行給列起假名
MySQL查詢優化器的工作原理
MySQL日期函數和時間函數