文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (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 非 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) 或 NULLLEAST()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'

    GREATEST() 如果任何参数为 NULL,则返回 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 语句不返回任何行。

      可以通过设置 sql_auto_is_null = 0 来禁用使用 IS NULL 比较检索 AUTO_INCREMENT 值的行为。请参阅 第 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)

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