表格 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
<=expr
ANDexpr
<=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 (
相同。expr
BETWEENmin
ANDmax
)返回列表中第一個非
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'); -> 1
IN()
可用於比較列建構子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 (
相同。expr
IN (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'