Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Comparison Functions and Operators

14.4.2 比较函数和运算符

表 14.4 比较操作符

Name Description
> 大于运算符
>= 大于等运算符
< 小于运算符
<>, != 不等运算符
<= 小于等运算符
<=> 安全等运算符
= 等运算符
BETWEEN ... AND ... 是否在某个值范围内
COALESCE() 返回第一个非空参数
GREATEST() 返回最大的参数
IN() 是否在值集中
INTERVAL() 返回第一个参数小于的索引
IS 测试值是否为布尔值
IS NOT 测试值是否为布尔值
IS NOT NULL NOT NULL 值测试
IS NULL NULL 值测试
ISNULL() 判断参数是否为 NULL
LIKE Return the smallest argument
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节,“表达式求值中的类型转换”,描述了这些函数和类似函数在比较操作中确定返回值的规则。

Note

MySQL 的前版本中,当评估包含 LEAST()GREATEST() 表达式时,服务器尝试猜测函数的上下文,并将函数参数转换为整个表达式的数据类型。例如,LEAST("11", "45", "2") 的参数被评估和排序为字符串,因此该表达式返回 "11"

函数使用提供的参数执行,并在必要时将一个或多个参数转换为同一类型。任何使用返回值的表达式强制类型转换现在都在函数执行后进行。这意味着 LEAST("11", "45", "2") + 0 评估到 "11" + 0 并且结果为整数 11。

为了将值转换为比较用途,可以使用CAST() 函数。字符串值可以使用CONVERT() 将字符集转换。见第14.10节,“Cast Functions and Operators”

默认情况下,字符串比较不区分大小写,并使用当前字符集。默认值为 utf8mb4

  • =

    Equal:

    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,否则返回0

    <=>操作符等同于标准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 BETWEEN min AND max

    如果expr大于或等于min,且expr小于或等于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值。如果你使用字符串常量如'2001-1-1'DATE进行比较,转换字符串为DATE

  • expr 不在 minmax 之间

    这与NOT (exprminmax)相同。

  • 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'

    GREATEST() 如果任何参数为NULL,返回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(true)。

    IN()列表中的值数量只受max_allowed_packet值限制。

    为了遵守SQL标准,IN() 不仅返回左侧表达式为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)

    如果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'