文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  比較函式和運算子

14.4.2 比較函式和運算子

表格 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 BETWEEN min AND max

    如果 expr 大於或等於 minexpr 小於或等於 max,則 BETWEEN 返回 1,否則返回 0。如果所有引數類型相同,這等同於表達式 (min <= expr AND expr <= max)。否則,將根據 第 14.3 節,「表達式求值中的類型轉換」 中描述的規則進行類型轉換,但會應用於所有三個引數。

    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

  • expr NOT BETWEEN min AND max

    這與 NOT (expr BETWEEN min AND max) 相同。

  • COALESCE(value,...)

    返回列表中第一個非 NULL 值,如果沒有非 NULL 值,則返回 NULL

    COALESCE() 的返回類型是引數類型的聚合類型。

    mysql> SELECT COALESCE(NULL,1);
            -> 1
    mysql> SELECT COALESCE(NULL,NULL,NULL);
            -> NULL
  • GREATEST(value1,value2,...)

    使用兩個或多個引數,返回最大的(最大值)引數。引數的比較使用與 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'

    如果任何引數為 NULLGREATEST() 返回 NULL

  • expr IN (value,...)

    如果 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 的子查詢」

  • expr NOT IN (value,...)

    這與 NOT (expr IN (value,...)) 相同。

  • INTERVAL(N,N1,N2,N3,...)

    如果 NN1,則返回 0;如果 NN2,則返回 1,依此類推;如果 NNULL,則返回 -1。所有引數都視為整數。為了使此函數正常工作,必須 N1N2N3...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
  • IS boolean_value

    針對布林值測試值,其中 boolean_value 可以是 TRUEFALSEUNKNOWN

    mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
            -> 1, 1, 1
  • IS NOT boolean_value

    針對布林值測試值,其中 boolean_value 可以是 TRUEFALSEUNKNOWN

    mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
            -> 1, 1, 0
  • IS NULL

    測試值是否為 NULL

    mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
            -> 0, 0, 1

    為了與 ODBC 程式良好配合,MySQL 在使用 IS NULL 時支援以下額外功能

  • IS NOT NULL

    測試值是否不為 NULL

    mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
            -> 1, 1, 0
  • ISNULL(expr)

    如果 exprNULL,則 ISNULL() 返回 1,否則返回 0

    mysql> SELECT ISNULL(1+1);
            -> 0
    mysql> SELECT ISNULL(1/0);
            -> 1

    可以使用 ISNULL() 而不是 = 來測試值是否為 NULL。(使用 = 將值與 NULL 比較始終會產生 NULL。)

    ISNULL() 函數與 IS NULL 比較運算子共享一些特殊行為。請參閱 IS NULL 的描述。

  • LEAST(value1,value2,...)

    使用兩個或多個引數時,會傳回最小(最小值)的引數。引數會使用以下規則進行比較:

    • 如果任何引數為 NULL,則結果為 NULL。不需要進行比較。

    • 如果所有引數都是整數值,則會將它們作為整數進行比較。

    • 如果至少有一個引數是雙精度浮點數,則會將它們作為雙精度浮點數值進行比較。否則,如果至少有一個引數是 DECIMAL 值,則會將它們作為 DECIMAL 值進行比較。

    • 如果引數包含數字和字串的混合,則會將它們作為字串進行比較。

    • 如果任何引數是非二進制(字元)字串,則會將引數作為非二進制字串進行比較。

    • 在所有其他情況下,引數會作為二進制字串進行比較。

    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'