表 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
) 或 NULL
。 LEAST()
和 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
。<=>
运算符等效于标准 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
<=expr
ANDexpr
<=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
值。如果您在与DATE
进行比较时使用字符串常量,例如'2001-1-1'
,请将字符串转换为DATE
。这与
NOT (
相同。expr
BETWEENmin
ANDmax
)返回列表中的第一个非
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'); -> 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 的子查询"。这与
NOT (
相同。expr
IN (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
ISNULL()
可用于代替=
来测试值是否为NULL
。(使用=
将值与NULL
进行比较总是会产生NULL
。)对于两个或更多个参数,返回最小的(值最小)参数。参数的比较使用以下规则
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'