文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  比較函數和運算子

14.4.2 比較函數和運算子

表格 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

    <=> 運算子等於標準 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 大於或等於 min,且 expr 小於或等於 maxBETWEEN 會傳回 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(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 的子查詢」

  • 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 時支援以下額外功能

    • 如果 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 NULLDATEDATETIME 資料行,您可以使用如下的陳述式找到特殊日期 '0000-00-00'

      SELECT * FROM tbl_name WHERE date_column IS NULL

      這是為了讓某些 ODBC 應用程式能夠運作,因為 ODBC 不支援 '0000-00-00' 日期值。

      請參閱 取得自動遞增值,以及 Connector/ODBC 連線參數FLAG_AUTO_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)

    如果 exprNULLISNULL() 會傳回 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'