比较函数和运算符
表比较运算符
| 名称 | 描述 |
|---|---|
> | 大于运算符 |
>= | 大于或等于运算符 |
< | 少于运算符 |
<>,!= | 不等于运算符 |
<= | 小于或等于运算符 |
<=> | NULL安全等于运算符 |
= | 平等算子 |
BETWEEN ... AND ... | 值是否在值范围内 |
COALESCE() | 返回第一个非NULL参数 |
GREATEST() | 返回最大参数 |
IN() | 一个值是否在一组值内 |
INTERVAL() | 返回小于第一个参数的参数的索引 |
IS | 针对布尔值测试值 |
IS NOT | 针对布尔值测试值 |
IS NOT NULL | 非空值测试 |
IS NULL | 空值测试 |
ISNULL() | 测试参数是否为NULL |
LEAST() | 返回最小的参数 |
LIKE | 简单模式匹配 |
NOT BETWEEN ... AND ... | 值是否不在值范围内 |
NOT IN() | 一个值是否不在一组值内 |
NOT LIKE | 否定简单模式匹配 |
STRCMP() | 比较两个字符串 |
比较运算的结果是1(TRUE),0(FALSE)或NULL。这些操作适用于数字和字符串。字符串会自动转换为数字,数字会根据需要转换为字符串。
以下关系比较运算符不仅可以用于比较标量操作数,还可以用于比较行操作数:
= > < >= <= <> !=
本节稍后对这些运算符的描述将详细介绍它们如何与行操作数一起使用。有关行子查询上下文中行比较的其他示例,请参见“ROW子查询”。
本节中的某些函数返回的值不是1(TRUE),0(FALSE)或NULL。LEAST()并且GREATEST()是此类功能的示例;“表达式评估中的类型转换”描述了由这些函数和类似函数执行的比较操作的规则,以确定它们的返回值。
注意在MySQL的早期版本中,当评估包含
LEAST()或的表达式时GREATEST(),服务器试图猜测使用该函数的上下文,并将该函数的参数强制为整个表达式的数据类型。例如,对的参数进行LEAST("11","45","2")求值并按字符串排序,以便此表达式返回"11"。在MySQL 8.0.3和更早版本中,在对表达式求值时LEAST("11","45","2")+ 0,服务器会在对参数进行排序之前将参数转换为整数(预计结果将添加整数0),从而返回2。从MySQL 8.0.4开始,服务器不再尝试以此方式推断上下文。而是使用所提供的参数执行该函数,并且当且仅当它们不是相同类型时才将数据类型转换为一个或多个参数。现在,在执行函数之后执行由表达式使用返回值进行强制的任何类型强制转换。这意味着,在MySQl 8.0.4及更高版本中,其
LEAST("11","45","2")+ 0计算结果为"11"+ 011。(错误#83895,错误#25123839)
要将值转换为特定类型以进行比较,可以使用该CAST()函数。可以使用将字符串值转换为其他字符集CONVERT()。请参见“信息函数”。
默认情况下,字符串比较不区分大小写,并使用当前字符集。默认值为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-安全相等。此运算符执行类似的相等比较=运算符,但回报1,而不是NULL如果两个操作数NULL,而0不是NULL如果一个操作数是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 BETWEEN min AND max如果
expr大于或等于min且expr小于或等于max,则BETWEEN返回1,否则返回0。如果所有参数均为同一类型,则此表达式等效于表达式。否则,类型转换将根据“表达式评估中的类型转换”中所述的规则进行,但将应用于所有三个参数。(min<=expr AND expr<=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()以获得最佳结果,请使用来将值显式转换为所需的数据类型。示例:如果将aDATETIME与两个DATE值进行比较,请将这些DATE值转换为DATETIME值。如果您使用字符串常量(例如与'2001-1-1'a进行比较)DATE,请将字符串转换为aDATE。expr NOT BETWEEN min AND max这与相同。
NOT(expr BETWEEN min AND max)COALESCE(value,...)返回
NULL列表中的第一个非值,或者NULL如果没有非NULL值,则返回。返回类型
COALESCE()是参数类型的集合类型。mysql>
SELECT COALESCE(NULL,1); -> 1 mysql>SELECT COALESCE(NULL,NULL,NULL); -> NULLGREATEST(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'GREATEST()返回NULL是否有任何参数NULL。expr IN(value,...)返回
1(真),如果expr等于任何的值的IN()列表,否则返回0(假)。类型转换根据适用于所有参数的“表达式评估中的类型转换”中所述的规则进行。如果
IN()列表中的值不需要类型转换,则它们都是JSON相同类型的非常量,expr可以将它们与每个相同类型的值进行比较(可能在类型转换之后),从而进行优化。列表中的值被排序,并且expr使用二进制搜索来完成搜索,这使得IN()操作非常快。mysql>
SELECT 2IN (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 val1FROM tbl1WHERE val1IN (1,2,'a');而是这样写:
SELECT val1FROM tbl1WHERE val1IN ('1','2','a');隐式类型转换可能会产生非直观的结果:
mysql>
SELECT 'a'IN (0), 0IN ('b'); -> 1, 1在这两种情况下,比较值都将转换为浮点值,在每种情况下均得出0.0,比较结果为1(真)。
IN()列表中值的数量仅受该max_allowed_packet值限制。为了符合SQL标准,不仅在左侧的表达式
IN()为时返回,而且在列表中未找到匹配项并且列表中的表达式之一为时返回。NULLNULLNULLIN()语法也可以用于编写某些类型的子查询。请参见“带有ANY,IN或SOME的子查询”。expr NOT IN(value,...)这与相同。
NOT(expr IN(value,...))INTERVAL(N,N1,N2,N3,...)0如果N<N1,<等等,如果是,1则返回。所有参数均视为整数。它要求<<<<此功能工作正常。这是因为使用了二进制搜索(非常快)。NN2-1NNULLN1N2N3...Nnmysql>
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); -> 0IS boolean_value测试针对一个布尔值,其中值
boolean_value可以是TRUE,FALSE,或UNKNOWN。mysql>
SELECT 1 IS TRUE, 0 IS FALSE, NULL ISUNKNOWN ; -> 1, 1, 1IS NOT boolean_value测试针对一个布尔值,其中值
boolean_value可以是TRUE,FALSE,或UNKNOWN。mysql>
SELECT 1 IS NOTUNKNOWN , 0 IS NOTUNKNOWN , NULL IS NOTUNKNOWN ; -> 1, 1, 0IS NULL测试值是否为
NULL。mysql>
SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0, 0, 1为了与ODBC程序配合使用,MySQL在使用时支持以下额外功能
IS NULL:如果将
sql_auto_is_nullvariable设置为1,则在成功插入自动生成的AUTO_INCREMENT值的语句之后,可以通过发出以下形式的语句来找到该值:SELECT *FROM tbl_nameWHERE auto_col IS NULL如果该语句返回一行,则返回的值与调用该
LAST_INSERT_ID()函数的值相同。有关详细信息,包括在多行插入之后的返回值,请参见“信息函数”。如果没有AUTO_INCREMENT成功插入任何值,则该SELECT语句不返回任何行。可以通过设置禁用
AUTO_INCREMENT使用IS NULL比较检索值的行为sql_auto_is_null = 0。请参见“服务器系统变量”。默认值为
sql_auto_is_null0。对于
DATE和DATETIME声明为的列NOT NULL,您可以'0000-00-00'使用类似以下的语句来查找特殊日期:SELECT *FROM tbl_nameWHERE date_column IS NULL这是使某些ODBC应用程序正常工作所必需的,因为ODBC不支持
'0000-00-00'日期值。请参阅获取自动增量值,以及连接器/ ODBC连接参数中有关
FLAG_AUTO_IS_NULL选项的说明。
IS NOT NULL测试值是否不是
NULL。mysql>
SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0ISNULL(expr)如果
expr是NULL,则ISNULL()返回1,否则返回0。mysql>
SELECT ISNULL(1+1); -> 0 mysql>SELECT ISNULL(1/0); -> 1ISNULL()可以用来代替=测试值是否为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'- 如果有任何参数
上一
