12.3.2 比较函数和运算符

table12.3 比较运算符

NameDescription
>大于运算符
>=大于或等于运算符
<少于运算符
<>, !=不等于运算符
<=小于或等于运算符
<=>NULL 安全等于运算符
=Equal operator
之间 ...值是否在值范围内
COALESCE()返回第一个非 NULL 参数
GREATEST()返回最大参数
IN()一个值是否在一组值内
INTERVAL()返回小于第一个参数的参数的索引
IS针对布尔值测试值
IS NOT针对布尔值测试值
不为空非空值测试
IS NULL空值测试
ISNULL()测试参数是否为 NULL
LEAST()返回最小的参数
LIKE简单模式匹配
...之间和...之间值是否不在值范围内
NOT IN()一个值是否不在一组值内
NOT LIKE否定简单模式匹配
STRCMP()比较两个字符串

比较操作得出的值为1(TRUE),0(FALSE)或NULL。这些操作适用于数字和字符串。字符串会自动转换为数字,数字会根据需要转换为字符串。

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

=  >  <  >=  <=  <>  !=

本节稍后对这些运算符的描述将详细介绍它们如何与行操作数一起使用。有关行子查询上下文中行比较的其他示例,请参见第 13.2.10.5 节“行子查询”

本节中的某些函数返回的值不是1(TRUE),0(FALSE)或NULLLEAST()GREATEST()是此类功能的示例; 第 12.2 节“table 达式评估中的类型转换”描述了由这些和类似功能执行的比较操作的规则,以确定它们的返回值。

要将值转换为特定类型以进行比较,可以使用CAST()函数。可以使用CONVERT()将字符串值转换为其他字符集。参见第 12.10 节“Broadcast 函数和运算符”

默认情况下,字符串比较不区分大小写,并使用当前字符集。默认值为latin1(cp1252 西欧),它也适用于英语。

=

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而不是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)

<>, !=

Not equal:

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

<

Less than:

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

>

Greater than:

mysql> SELECT 2 > 2;
        -> 0

对于行比较,(a, b) > (x, y)等效于:

(a > x) OR ((a = x) AND (b > y))

最小值和最大值之间的 table 达式

如果* expr 大于或等于 min 并且 expr 小于或等于 max *,则BETWEEN返回1,否则返回0。如果所有参数均为相同类型,则等效于 table 达式(min <= expr AND expr <= max)。否则,类型转换将根据第 12.2 节“table 达式评估中的类型转换”中描述的规则进行,但将应用于所有三个参数。

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

最大值和最小值之间的 table 达式

这与NOT (expr BETWEEN min AND max)相同。

COALESCE(value,...)

返回列 table 中的第一个非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'

如果任何参数为NULL,则GREATEST()返回NULL

expr IN(值,...)

如果* expr *等于IN()列 table 中的任何值,则返回1(真),否则返回0(假)。

类型转换根据应用于所有参数的第 12.2 节“table 达式评估中的类型转换”中描述的规则进行。如果IN()列 table 中的值不需要类型转换,则它们都是相同类型的常量,并且* expr 可以与它们中的每个作为相同类型的值进行比较(可能在类型转换之后),这是一种优化发生。将对列 table 中的值进行排序,并使用二进制搜索完成对 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()列 table 中混合带引号和不带引号的值,因为带引号的值(例如字符串)和未带引号的值(例如数字)的比较规则不同。因此,混合类型可能导致不一致的结果。例如,请勿编写这样的IN()table 达式:

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()列 table 中的值数仅受max_allowed_packet值限制。

为了符合 SQL 标准,IN()不仅在左侧 table 达式为NULL时返回NULL,而且在列 table 中未找到匹配项并且列 table 中的一个 table 达式为NULL时返回NULL

IN()语法也可以用于编写某些类型的子查询。参见第 13.2.10.3 节“带有 ANY,IN 或 SOME 的子查询”

expr NOT IN(值,...)

这与NOT (expr IN (value,...))相同。

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

如果** N * <* N1 则返回0,如果 N * <* N2 则返回1,以此类推;如果 N NULL则返回-1。所有参数均视为整数。为了使此功能正常工作,需要 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

IS boolean_value

针对布尔值(其中* boolean_value *可以是TRUEFALSEUNKNOWN)测试值。

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

不是 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()函数的值相同。有关详细信息,包括多行插入后的返回值,请参见第 12.15 节“信息功能”。如果没有成功插入AUTO_INCREMENT值,则SELECT语句不返回任何行。

可以通过设置sql_auto_is_null = 0来禁用通过使用IS NULL比较来检索AUTO_INCREMENT值的行为。参见第 5.1.7 节“服务器系统变量”

sql_auto_is_null的默认值为 0.

  • 对于声明为NOT NULLDATEDATETIME列,您可以使用以下语句找到特殊日期'0000-00-00'
SELECT * FROM tbl_name WHERE date_column IS NULL

这是使某些 ODBC 应用程序正常工作所必需的,因为 ODBC 不支持'0000-00-00'日期值。

请参阅获取自动增量值,以及连接器/ ODBC 连接参数处有关FLAG_AUTO_IS_NULL选项的说明。

不为空

测试值是否不是NULL

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

ISNULL(expr)

如果* expr *是NULL,则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'