表格 14.4 比較運算子
| 名稱 | 描述 |
|---|---|
> |
大於運算子 |
>= |
大於或等於運算子 |
< |
小於運算子 |
<>, != |
不等於運算子 |
<= |
小於或等於運算子 |
<=> |
NULL 安全等於運算子 |
= |
等於運算子 |
BETWEEN ... AND ... |
值是否在值範圍內 |
COALESCE() |
傳回第一個非 NULL 引數 |
GREATEST() |
傳回最大的引數 |
IN() |
值是否在一組值內 |
INTERVAL() |
傳回小於第一個引數的引數索引 |
IS |
針對布林值測試值 |
IS NOT |
針對布林值測試值 |
IS NOT NULL |
非 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。<=>運算子等同於標準 SQL 的IS 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(真),否則返回0(假)。根據 第 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(真)。
IN()列表中值的數量僅受max_allowed_packet值的限制。為了符合 SQL 標準,如果左側的表達式為
NULL,則IN()會返回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陳述式將不返回任何列。可以使用設定
sql_auto_is_null = 0來停用透過使用IS NULL比較來檢索AUTO_INCREMENT值的行為。請參閱 第 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'日期值。請參閱 Obtaining Auto-Increment Values 和 Connector/ODBC Connection Parameters 中
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); -> 1可以使用
ISNULL()而不是=來測試值是否為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'