表格 14.4 比較運算子
| 名稱 | 說明 |
|---|---|
> |
大於運算子 |
>= |
大於或等於運算子 |
< |
小於運算子 |
<>, != |
不等於運算子 |
<= |
小於或等於運算子 |
<=> |
NULL 安全等於運算子 |
= |
等於運算子 |
BETWEEN ... AND ... |
判斷值是否在值的範圍內 |
COALESCE() |
傳回第一個非 NULL 引數 |
GREATEST() |
傳回最大的引數 |
IN() |
判斷值是否在值的集合內 |
INTERVAL() |
傳回小於第一個引數的引數索引 |
IS |
測試值是否為布林值 |
IS NOT |
測試值是否為布林值 |
IS NOT NULL |
NOT NULL 值測試 |
IS NULL |
NULL 值測試 |
ISNULL() |
測試引數是否為 NULL |
LEAST() |
傳回最小的引數 |
LIKE |
簡單模式比對 |
NOT BETWEEN ... AND ... |
判斷值是否不在值的範圍內 |
NOT IN() |
判斷值是否不在值的集合內 |
NOT LIKE |
簡單模式比對的否定 |
STRCMP() |
比較兩個字串 |
比較運算的結果為 1 (TRUE)、0 (FALSE) 或 NULL。這些運算適用於數字和字串。字串會自動轉換為數字,而數字會視需要自動轉換為字串。
下列關係比較運算子不僅可用於比較純量運算元,還可用於比較列運算元
= > < >= <= <> !=本節稍後將詳述這些運算子如何與列運算元搭配使用。如需列子查詢環境中列比較的其他範例,請參閱第 15.2.15.5 節「列子查詢」。
本節中的某些函數會傳回 1 (TRUE)、0 (FALSE) 或 NULL 以外的值。LEAST() 和 GREATEST() 就是這類函數的範例;第 14.3 節「表達式評估中的類型轉換」說明這些和類似函數為判斷其傳回值而執行的比較運算規則。
在舊版的 MySQL 中,評估包含 LEAST() 或 GREATEST() 的表達式時,伺服器會嘗試猜測函數的使用環境,並將函數的引數強制轉換為整個表達式的資料類型。例如,LEAST("11", "45", "2") 的引數會評估並排序為字串,因此此表達式會傳回 "11"。
函數會使用所提供的引數執行,如果引數的類型不完全相同,才會對一或多個引數執行資料類型轉換。現在,強制轉換表達式所要求的任何類型,以使用傳回值,都將在函數執行後執行。這表示 LEAST("11", "45", "2") + 0 會評估為 "11" + 0,因此會評估為整數 11。
若要將值轉換為特定類型以進行比較,您可以使用 CAST() 函數。字串值可以使用 CONVERT() 轉換為不同的字元集。請參閱第 14.10 節「轉換函數和運算子」。
依預設,字串比較不區分大小寫,並使用目前的字元集。預設值為 utf8mb4。
等於
mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 1對於列比較,
(a, b) = (x, y)等於(a = x) AND (b = y)NULL安全等於。此運算子會執行與=運算子類似的相等比較,但如果兩個運算元都是NULL,則會傳回1,而不是NULL,如果其中一個運算元是NULL,則會傳回0,而不是NULL。<=>運算子等於標準 SQLIS NOT DISTINCT FROM運算子。mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL對於列比較,
(a, b) <=> (x, y)等於(a <=> x) AND (b <=> y)不等於
mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1對於列比較,
(a, b) <> (x, y)和(a, b) != (x, y)等於(a <> x) OR (b <> y)小於或等於
mysql> SELECT 0.1 <= 2; -> 1對於列比較,
(a, b) <= (x, y)等於(a < x) OR ((a = x) AND (b <= y))小於
mysql> SELECT 2 < 2; -> 0對於列比較,
(a, b) < (x, y)等於(a < x) OR ((a = x) AND (b < y))大於或等於
mysql> SELECT 2 >= 2; -> 1對於列比較,
(a, b) >= (x, y)等於(a > x) OR ((a = x) AND (b >= y))大於
mysql> SELECT 2 > 2; -> 0對於列比較,
(a, b) > (x, y)等於(a > x) OR ((a = x) AND (b > y))如果
expr大於或等於min,且expr小於或等於max,BETWEEN會傳回1,否則傳回0。這等同於運算式(,如果所有引數的類型都相同。否則,會根據 第 14.3 節「運算式求值中的類型轉換」中描述的規則進行類型轉換,但會套用到所有三個引數。min<=exprANDexpr<=max)mysql> SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1; -> 1, 0 mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0為了在使用日期或時間值時獲得最佳效果,請使用
BETWEEN,並使用CAST()將值明確轉換為所需的資料類型。範例:如果您將DATETIME與兩個DATE值進行比較,請將DATE值轉換為DATETIME值。如果您在與DATE的比較中使用字串常數(例如'2001-1-1'),請將該字串轉換為DATE。這與
NOT (相同。exprBETWEENminANDmax)傳回清單中第一個非
NULL值,如果沒有非NULL值,則傳回NULL。COALESCE()的傳回類型是引數類型的聚合類型。mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL使用兩個或多個引數時,傳回最大的(最大值)引數。引數的比較規則與
LEAST()相同。mysql> SELECT GREATEST(2,0); -> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0); -> 767.0 mysql> SELECT GREATEST('B','A','C'); -> 'C'如果任何引數為
NULL,GREATEST()會傳回NULL。如果
expr等於IN()清單中的任何值,則傳回1(true),否則傳回0(false)。類型轉換會根據 第 14.3 節「運算式求值中的類型轉換」中描述的規則進行,並套用到所有引數。
IN()清單中的值如果不需要進行類型轉換,它們都是相同類型的非JSON常數,並且expr可以作為相同類型的值與它們中的每一個進行比較(可能在類型轉換之後),則會進行最佳化。清單中的值會經過排序,並且使用二元搜尋來搜尋expr,這使得IN()操作非常快速。mysql> SELECT 2 IN (0,3,5,7); -> 0 mysql> SELECT 'wefwf' IN ('wee','wefwf','weg'); -> 1IN()可以用來比較列建構函式mysql> SELECT (3,4) IN ((1,2), (3,4)); -> 1 mysql> SELECT (3,4) IN ((1,2), (3,5)); -> 0您絕不應在
IN()清單中混合使用帶引號和不帶引號的值,因為帶引號的值(例如字串)和不帶引號的值(例如數字)的比較規則不同。因此,混合類型可能會導致不一致的結果。例如,請勿撰寫像這樣的IN()運算式SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');而是這樣撰寫
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');隱式類型轉換可能會產生不直觀的結果
mysql> SELECT 'a' IN (0), 0 IN ('b'); -> 1, 1在這兩種情況下,比較值都會轉換為浮點數值,在每種情況下都產生 0.0,比較結果為 1(true)。
IN()清單中的值數量僅受限於max_allowed_packet值。為了符合 SQL 標準,
IN()不僅在左側運算式為NULL時傳回NULL,而且在清單中沒有找到相符項且清單中的其中一個運算式為NULL時也會傳回NULL。IN()語法也可用於撰寫特定類型的子查詢。請參閱 第 15.2.15.3 節「使用 ANY、IN 或 SOME 的子查詢」。這與
NOT (相同。exprIN (value,...))如果
N≤N1,則傳回0;如果N≤N2,則傳回1,依此類推,如果N為NULL,則傳回-1。所有引數都會被視為整數。此函數要正確運作,必須滿足N1≤N2≤N3≤...≤Nn。這是因為會使用二元搜尋(速度非常快)。mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0根據布林值測試值,其中
boolean_value可以是TRUE、FALSE或UNKNOWN。mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1根據布林值測試值,其中
boolean_value可以是TRUE、FALSE或UNKNOWN。mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; -> 1, 1, 0測試值是否為
NULL。mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0, 0, 1為了與 ODBC 程式良好搭配運作,MySQL 在使用
IS NULL時支援以下額外功能如果
sql_auto_is_null變數設定為 1,則在成功插入自動產生的AUTO_INCREMENT值之後,您可以透過發出以下形式的陳述式來找到該值SELECT * FROM tbl_name WHERE auto_col IS NULL如果該陳述式傳回一列,則傳回的值與您呼叫
LAST_INSERT_ID()函數時的值相同。如需詳細資訊(包括多列插入後的傳回值),請參閱 第 14.15 節「資訊函數」。如果沒有成功插入AUTO_INCREMENT值,則SELECT陳述式不會傳回任何列。透過使用
IS NULL比較來擷取AUTO_INCREMENT值的行為可以透過設定sql_auto_is_null = 0來停用。請參閱 第 7.1.8 節「伺服器系統變數」。sql_auto_is_null的預設值為 0。對於宣告為
NOT NULL的DATE和DATETIME資料行,您可以使用如下的陳述式找到特殊日期'0000-00-00'SELECT * FROM tbl_name WHERE date_column IS NULL這是為了讓某些 ODBC 應用程式能夠運作,因為 ODBC 不支援
'0000-00-00'日期值。請參閱 取得自動遞增值,以及 Connector/ODBC 連線參數 中
FLAG_AUTO_IS_NULL選項的描述。
測試值是否不是
NULL。mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0如果
expr為NULL,ISNULL()會傳回1,否則傳回0。mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1ISNULL()可以用來取代=來測試值是否為NULL。(使用=將值與NULL比較總是會產生NULL。)使用兩個或多個引數時,傳回最小的(最小值)引數。引數的比較規則如下
LEAST()的回傳型別是比較引數型別的彙總型別。mysql> SELECT LEAST(2,0); -> 0 mysql> SELECT LEAST(34.0,3.0,5.0,767.0); -> 3.0 mysql> SELECT LEAST('B','A','C'); -> 'A'