# 12.4.2 比较函数和运算符

表 12.4 比较运算符

姓名 描述
> 大于运算符
>= 大于或等于运算符
< 小于运算符
<>, != 不等于运算符
<= 小于或等于运算符
<=> NULL 安全等于运算符
= 等号运算符
之间 ... 一个值是否在一个值范围内
合并() 返回第一个非 NULL 参数
最伟大的() 返回最大的参数
在() 一个值是否在一组值内
间隔() 返回小于第一个参数的参数的索引
根据布尔值测试值
不是 根据布尔值测试值
不为空 NOT NULL 值测试
一片空白 空值测试
一片空白() 测试参数是否为 NULL
至少() 返回最小的参数
喜欢 简单的模式匹配
不在……和……之间 值是否不在值范围内
不在() 一个值是否不在一组值内
不喜欢 简单模式匹配的否定
STRCMP() 比较两个字符串

比较运算的结果为1 (真的), 0 (错误的), 要么空值.这些操作适用于数字和字符串。必要时,字符串会自动转换为数字,数字会自动转换为字符串。

以下关系比较运算符不仅可用于比较标量操作数,还可用于比较行操作数:

=  >  <  >=  <=  <>  !=

本节后面对这些运算符的描述详细说明了它们如何处理行操作数。有关行子查询上下文中行比较的其他示例,请参阅第 13.2.11.5 节,“行子查询”.

本节中的某些函数返回的值不是1(真的),0(错误的), 要么空值.至少()最伟大的()是此类功能的示例;第 12.3 节,“表达式求值中的类型转换”,描述了由这些和类似函数执行的比较操作的规则,以确定它们的返回值。

笔记

在以前版本的 MySQL 中,当评估一个包含至少()要么最伟大的(),服务器试图猜测使用函数的上下文,并将函数的参数强制转换为整个表达式的数据类型。例如,参数最少(“11”、“45”、“2”)作为字符串进行计算和排序,以便此表达式返回"11".在MySQL 8.0.3及更早版本中,当计算表达式时最小值(“11”、“45”、“2”)+0,服务器在对参数进行排序之前将其转换为整数(预期结果中会添加整数0),从而返回2。

从MySQL 8.0.4开始,服务器不再试图以这种方式推断上下文。相反,该函数是使用提供的参数执行的,当且仅当一个或多个参数不是同一类型时,才对它们执行数据类型转换。现在,由使用返回值的表达式强制执行的任何类型强制都将在函数执行后执行。这意味着,在MySQl 8.0.4及更高版本中,最小值(“11”、“45”、“2”)+0评估为"11" + 0也就是整数11。(臭虫#83895,臭虫#25123839)

要将值转换为特定类型以进行比较,可以使用演员阵容作用可以使用以下命令将字符串值转换为不同的字符集:CONVERT()看见第12.11节,“转换函数和运算符”.

默认情况下,字符串比较不区分大小写,并使用当前字符集。默认值是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)
    
  • <=>

    无效的-安全平等。此运算符执行与=接线员,但返回1.而不是无效的如果两个操作数都是无效的0而不是无效的如果一个操作数是无效的.

    这个<=>运算符相当于标准SQL与…没有区别操作人员

    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*中间**及*最大值*

    如果*expr大于或等于expr小于或等于最大值*, 之间返回1.,否则它会返回0.这相当于(** <= *expr*及*expr* <= *最大值*)如果所有参数的类型相同。否则,将根据中描述的规则进行类型转换第12.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
    

    为了在使用时获得最佳效果之间对于日期或时间值,使用演员阵容将值显式转换为所需的数据类型。例子:如果你比较约会时间两个日期值,将日期价值观约会时间价值观如果使用字符串常量,例如'2001-1-1'日期,将弦抛向日期.

  • *expr*不在中间**及*最大值*

    这和不是(*expr*中间**及*最大值*).

  • 结合(*价值*,...)

    返回第一个非-无效的列表中的值,或无效的如果没有非-无效的价值观

    返回类型聚结是参数类型的聚合类型。

    mysql> SELECT COALESCE(NULL,1);
            -> 1
    mysql> SELECT COALESCE(NULL,NULL,NULL);
            -> NULL
    
  • 伟大的(*价值1*,*价值2*,...)

    对于两个或多个参数,返回最大(最大值)参数。参数的比较使用的规则与至少.

    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'
    

    最伟大的返回无效的如果有任何论据无效的.

  • *expr*在(*价值*,...)

    退换商品1.(正确)如果*expr*等于在()列表,否则返回0(错)。

    类型转换根据中描述的规则进行第12.3节,“表达式计算中的类型转换”,适用于所有论点。如果中的值不需要类型转换在()名单上,他们都不是-JSON相同类型的常量,以及*expr如果可以将它们作为同一类型的值(可能在类型转换后)进行比较,则会进行优化。列表中的值已排序,搜索expr*使用二进制搜索完成,这使得在()行动很快。

    mysql> SELECT 2 IN (0,3,5,7);
            -> 0
    mysql> SELECT 'wefwf' IN ('wee','wefwf','weg');
            -> 1
    

    在()可用于比较行构造函数:

    mysql> SELECT (3,4) IN ((1,2), (3,4));
            -> 1
    mysql> SELECT (3,4) IN ((1,2), (3,5));
            -> 0
    

    千万不要在一个表中混用引号和未引号的值在()列表,因为带引号的值(如字符串)和不带引号的值(如数字)的比较规则不同。因此,混合类型可能会导致不一致的结果。例如,不要写在()表达方式如下:

    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)。

    表中的值数在()名单仅限于最大允许包数价值

    为了符合SQL标准,在()返回无效的如果左边的表达式是无效的,但如果在列表中找不到匹配项且列表中的一个表达式为无效的.

    在()语法也可用于编写某些类型的子查询。看见第13.2.11.3节,“带有任意、IN或部分的子查询”.

  • *expr*不在(*价值*,...)

    这和不是(*expr*在(*价值*,...)).

  • 间歇(*N*,*N1*,*N2*,*N3*,...)

    退换商品0如果*N* \< N1, 1.如果*N* \< N2等等-1如果N无效的.所有参数都被视为整数。要求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
    
  • 是吗*布尔值*

    根据布尔值测试值,其中*布尔值*可以是符合事实的, 错误的未知的.

    mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
            -> 1, 1, 1
    
  • 不是*布尔值*

    根据布尔值测试值,其中*布尔值*可以是符合事实的, 错误的未知的.

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

    测试某个值是否正确无效的.

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

    为了更好地使用ODBC程序,MySQL在使用是空的:

  • 不是空的

    测试值是否为空无效的.

    mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
            -> 1, 1, 0
    
  • 一片空白(*表达式*)

    如果*表达式*是空值,一片空白()返回1, 否则返回0.

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

    一片空白()可以用来代替=测试一个值是否是空值.(比较一个值空值使用=总是产生空值.)

    一片空白()函数与一片空白比较运算符。见描述一片空白.

  • 至少(*价值1*,*价值2*,...)

    使用两个或多个参数,返回最小(最小值)参数。使用以下规则比较参数:

    • 如果有任何论据空值,结果是空值.不需要比较。

    • 如果所有参数都是整数值,则将它们作为整数进行比较。

    • 如果至少一个参数是双精度的,则将它们作为双精度值进行比较。否则,如果至少一个参数是十进制值,它们被比较为十进制价值观。

    • 如果参数包含数字和字符串的混合,则将它们作为字符串进行比较。

    • 如果任何参数是非二进制(字符)字符串,则将参数作为非二进制字符串进行比较。

    • 在所有其他情况下,参数作为二进制字符串进行比较。

      的返回类型至少()是比较参数类型的聚合类型。

    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'