表格 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
<=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
(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'); -> 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(true)。
IN()
清單中的值數量僅受限於max_allowed_packet
值。為了符合 SQL 標準,
IN()
不僅在左側運算式為NULL
時傳回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
陳述式不會傳回任何列。透過使用
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); -> 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'