表 14.4 比较操作符
| Name | Description |
|---|---|
| > | 大于操作符 |
| >= | 大于或等于操作符 |
| < | 小于操作符 |
| <>, != | 不等于操作符 |
| <= | 小于或等于操作符 |
| <=> | NULL 安全等于操作符 |
| = | 等于操作符 |
| BETWEEN ... AND ... | 是否在某个值范围内 |
| COALESCE() | 返回第一个非 NULL 参数 |
| GREATEST() | 返回最大的参数 |
| IN() | 是否在某个值集合中 |
| INTERVAL() | 返回第一个参数小于的索引 |
| IS | 测试值是否为布尔值 |
| IS NOT | 测试值是否为布尔值 |
| IS NOT NULL | 非 NULL 值测试 |
| IS NULL | NULL 值测试 |
| ISNULL() | 测试参数是否为 NULL |
| 最小值() | 返回最小的参数 |
| LIKE | 简单模式匹配 |
| NOT BETWEEN ... AND ... | 判断一个值是否不在某个值范围内 |
| NOT IN() | 判断一个值是否不在某个值集合中 |
| NOT LIKE | 简单模式匹配的否定 |
| STRCMP() | 比较两个字符串 |
比较操作的结果是一个值为 1 (TRUE), 0 (FALSE) 或 NULL。这些操作适用于数字和字符串。字符串将自动转换为数字,数字将自动转换为字符串,如有必要。
以下关系比较运算符可以用于比较不仅是标量操作数,还可以比较行操作数:
= > < >= <= <> !=
本节后面的运算符描述将详细介绍它们如何与行操作数一起工作。有关行比较在行子查询中的更多示例,请参阅 第 15.2.15.5 节,“行子查询”。
本节的一些函数返回的值不是 1 (TRUE), 0 (FALSE) 或 NULL。最小值() 和 最大值() 是这种函数的示例;第 14.3 节,“表达式评估中的类型转换”,描述了这些函数和类似函数确定返回值的规则。
在 MySQL 的早期版本中,当评估包含 最小值() 或 最大值() 的表达式时,服务器尝试猜测函数的使用上下文,并将函数的参数强制转换为整个表达式的数据类型。例如,最小值("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,则返回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大于或等于min且expr小于或等于max,BETWEEN返回1,否则返回0。这等同于表达式(,如果所有参数都是同一类型的。否则,根据 第 14.3 节,“类型转换在表达式评估中” 中的规则进行类型转换,但应用于所有三个参数。min<=exprANDexpr<=max)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。 -
这与
NOT (相同。exprBETWEENminANDmax) -
返回列表中的第一个非
NULL值,如果没有非NULL值,则返回NULL。COALESCE()的返回类型是参数类型的聚合类型。mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL -
具有两个或多个参数时,返回最大(最大值)参数。参数的比较规则与
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()列表中的任何值,则返回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'); -> 1IN()可以用于比较行构造器: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 的子查询”。 -
这与
NOT (相同。exprIN (value,...)) -
如果
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 -
测试一个值是否与布尔值匹配,其中
boolean_value可以是TRUE、FALSE或UNKNOWN。mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1 -
测试一个值是否与布尔值匹配,其中
boolean_value可以是TRUE、FALSE或UNKNOWN。mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; -> 1, 1, 0 -
测试值是否为
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 NULL的DATE和DATETIME列,可以使用以下语句来找到特殊日期'0000-00-00':SELECT * FROM tbl_name WHERE date_column IS NULL这对于使某些 ODBC 应用程序工作是必要的,因为 ODBC 不支持
'0000-00-00'日期值。请参阅 获取自动递增值,以及 Connector/ODBC 连接参数 中的
FLAG_AUTO_IS_NULL选项的描述。
-
-
测试值是否不为
NULL。mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0 -
如果
expr是NULL,ISNULL()返回1,否则返回0。mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1 -
具有两个或多个参数时,返回最小(最小值)参数。参数按照以下规则进行比较:
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'