14.4.2 比较函数和运算符
表 14.4 比较操作符
Name | Description |
---|---|
> |
大于运算符 |
>= |
大于等运算符 |
< |
小于运算符 |
<> , != |
不等运算符 |
<= |
小于等运算符 |
<=> |
安全等运算符 |
= |
等运算符 |
BETWEEN ... AND ... |
是否在某个值范围内 |
COALESCE() |
返回第一个非空参数 |
GREATEST() |
返回最大的参数 |
IN() |
是否在值集中 |
INTERVAL() |
返回第一个参数小于的索引 |
IS |
测试值是否为布尔值 |
IS NOT |
测试值是否为布尔值 |
IS NOT NULL |
NOT NULL 值测试 |
IS NULL |
NULL 值测试 |
ISNULL() |
判断参数是否为 NULL |
LIKE |
Return the smallest argument |
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节,“Cast Functions and Operators”。
默认情况下,字符串比较不区分大小写,并使用当前字符集。默认值为 utf8mb4
。
-
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
,否则返回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
<=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
值。如果你使用字符串常量如'2001-1-1'
与DATE
进行比较,转换字符串为DATE
。 -
这与
NOT (
相同。expr
在min
和max
) -
返回列表中的第一个非
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
(真),否则返回0
(假)。表达式求值时的类型转换遵循第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
时。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
语句返回无行记录。使用
IS NULL
比较来检索AUTO_INCREMENT
值的行为可以通过设置sql_auto_is_null = 0
来禁用。请参见第7.1.8节,“服务器系统变量”。sql_auto_is_null
的默认值是0。 -
对于
DATE
和DATETIME
列,如果它们被声明为NOT NULL
'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'