表12.4比较运算符
的名字 | 描述 |
---|---|
> |
大于操作符 |
>= |
大于等于运算符 |
< |
小于操作符 |
<> ,! = |
不等于操作符 |
<= |
小于等于运算符 |
< = > |
空安全的等于操作符 |
= |
相等操作符 |
之间……和… |
值是否在一个值范围内 |
合并() |
返回第一个非null参数 |
最大的() |
返回最大参数 |
在() |
一个值是否在一组值中 |
时间间隔() |
返回小于第一个参数的参数的索引 |
是 |
对一个布尔值进行测试 |
不是 |
对一个布尔值进行测试 |
不是零 |
NOT NULL值测试 |
为空 |
NULL值测试 |
ISNULL () |
测试参数是否为NULL |
至少() |
返回最小参数 |
就像 |
简单的模式匹配 |
不是之间……和… |
值是否不在一个值范围内 |
不() |
一个值是否不在一组值中 |
不喜欢 |
简单模式匹配的否定 |
STRCMP () |
比较两个字符串 |
比较操作的结果是1
(真正的
),0
(假
),或零
.这些操作对数字和字符串都有效。字符串会自动转换为数字,数字也会根据需要自动转换为字符串。
以下关系比较操作符不仅可以用于比较标量操作数,还可以用于比较行操作数:
= > <> = <= <> !=
本节后面对这些操作符的描述详细介绍了它们如何处理行操作数。有关行子查询上下文中的行比较的其他示例,请参见第13.2.11.5节,“行子查询”.
本节中的一些函数返回的值不是1
(真正的
),0
(假
),或零
.至少()
和最大的()
是这些函数的例子;第12.3节,“表达式求值中的类型转换”,描述由这些函数和类似函数执行的用于确定其返回值的比较操作的规则。
在MySQL的早期版本中,当计算包含至少()
或最大的()
,服务器试图猜测使用该函数的上下文,并将函数的参数强制为整个表达式的数据类型。例如,参数(“十一”、“45”、“2”)
作为字符串计算和排序,因此这个表达式返回“十一”
.在MySQL 8.0.3和更早的版本中,当求值表达式时最小值("11","45","2")+ 0
,服务器在对参数进行排序之前将它们转换为整数(预计将整数0加到结果中),从而返回2。
从MySQL 8.0.4开始,服务器不再尝试以这种方式推断上下文。相反,函数使用提供的参数执行,当且仅当一个或多个参数的类型不完全相同时,执行到它们的数据类型转换。使用返回值的表达式所要求的任何类型强制现在都在函数执行之后执行。这意味着,在MySQl 8.0.4及更高版本中,最小值("11","45","2")+ 0
计算结果为“十一”+ 0
因此取整数11。(Bug #83895, Bug #25123839)
要将值转换为特定类型以进行比较,可以使用把()
函数。字符串值可以转换为不同的字符集使用将()
.看到第12.11节,“转换函数和操作符”.
默认情况下,字符串比较不区分大小写,使用当前字符集。默认值是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)
零
安全的平等。的相等比较=
运营商,但回报1
而不是零
如果两个操作数都是零
,0
而不是零
如果一个操作数是零
.的
< = >
操作符相当于标准SQL不是截然不同的
操作符。mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;-> 1, null, null
行比较,
(a, b) <=> (x, y)
等价于:(a <= x) AND (b <= y)
不等于:
mysql >选择”。01”< >“0.01”;-> 1 mysql> SELECT .01 <> '0.01';-> 0 mysql> SELECT 'zapp' <> 'zapp';- > 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)
等价于:OR (a = x) AND (b = y)
比:
mysql> SELECT 2 > 2;- > 0
行比较,
(a, b) (x, y)
等价于:OR (a = x) AND (b > y))
如果
expr
是大于还是等于最小值
和expr
是小于还是等于马克斯
,之间的
返回1
,否则返回0
.这个等价于这个表达式(
如果所有参数都是相同类型的。否则,将根据中描述的规则进行类型转换第12.3节,“表达式求值中的类型转换”,但适用于所有三个论点。最小值
<=expr
和expr
<=马克斯
)mysql> SELECT 2 from 1 AND 3, 2 from 3 AND 1;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
以达到最佳使用效果
之间的
对于日期或时间值,使用把()
将值显式转换为所需的数据类型。例子:如果你比较DATETIME
两个日期
值,转换日期
值DATETIME
值。如果您使用字符串常量,如“2001-1-1”
与…相比日期
,将字符串转换为日期
.这个等于
(
.expr
之间的最小值
和马克斯
)返回第一个非-
零
值,或零
如果没有non-零
值。的返回类型
合并()
参数类型的聚合类型。mysql >选择合并(NULL, 1);-> 1 mysql> SELECT COALESCE(NULL,NULL,NULL);- >零
如果有两个或多个参数,则返回最大(最大值)参数。参数比较使用与for相同的规则
至少()
.mysql >选择最大(2,0);-> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);-> 767.0 mysql> SELECT GREATEST('B','A','C');- - - - - - >“C”
最大的()
返回零
如果有任何争论零
.返回
1
(真正的)如果expr
等于其中的任何值在()
列表,否则返回0
(假)。类型转换根据中描述的规则进行第12.3节,“表达式求值中的类型转换”,适用于所有的论点。类中的值不需要类型转换
在()
名单上,他们都是非JSON
相同类型的常量,和expr
可以将它们作为相同类型的值进行比较(可能在类型转换之后),则会发生优化。对列表中的值进行排序和搜索expr
是用二分法完成的,这就产生了在()
操作非常快。mysql> SELECT 2 IN (0,3,5,7);- > 0 mysql >选择“wefwf”(“小”、“wefwf”,“其”);- > 1
在()
可以用于比较行构造函数:mysql> SELECT (3,4) IN ((1,2), (3,4));- mysql> SELECT (3,4) IN ((1,2), (3,5));- > 0
控件中不应该混合使用引号和非引号的值
在()
列表,因为带引号的值(如字符串)和未带引号的值(如数字)的比较规则不同。因此,混合类型可能导致不一致的结果。例如,不要写在()
表达式如下: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)。
中值的个数
在()
列表仅受max_allowed_packet
价值。为了符合SQL标准,
在()
返回零
不仅仅是如果左边的表达式是零
,但如果在列表中没有找到匹配,且列表中的一个表达式是零
.在()
语法还可以用于编写某些类型的子查询。看到第13.2.11.3节," ANY、IN或SOME子查询".这个等于
(
.expr
在(价值
,……)返回
0
如果N
<N1
,1
如果N
<N2
等等-1
如果N
是零
.所有参数都被视为整数。它要求N1
<N2
<N3
<...
<神经网络
让这个函数正常工作。这是因为使用了二分搜索(非常快)。mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);-> 3 mysql> SELECT INTERVAL(10,10,100, 1000);-> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200);- > 0
用布尔值测试值,其中
boolean_value
可以真正的
,假
,或未知的
.mysql> SELECT 1为真,0为假,NULL为未知;-> 1,1,1
用布尔值测试值,其中
boolean_value
可以真正的
,假
,或未知的
.mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;-> 1,1,0
测试值是否为
零
.mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;-> 0 0 1
为了更好地使用ODBC程序,MySQL在使用时支持以下额外特性
为空
:如果
sql_auto_is_null
变量设置为1,然后在一条语句后成功插入一个自动生成的AUTO_INCREMENT
值,你可以通过发出如下形式的声明来找到这个值:SELECT * FROMtbl_name在哪里auto_col为空
如果语句返回一行,则返回的值与调用
LAST_INSERT_ID ()
函数。详细信息,包括多行插入后的返回值,请参见第12.16节,“信息功能”.如果没有AUTO_INCREMENT
值已成功插入,则选择
语句不返回行。检索
AUTO_INCREMENT
值。为空
可以通过设置来禁用比较sql_auto_is_null = 0
.看到第5.1.8节,“服务器系统变量”.的默认值
sql_auto_is_null
是0。为
日期
和DATETIME
声明为的列非空
,你可以找到特殊的日期“0000-00-00”
通过使用这样的语句:SELECT * FROMtbl_name在哪里date_column为空
这是让一些ODBC应用程序工作所必需的,因为ODBC不支持
“0000-00-00”
日期值。看到获取自动递增值的描述
FLAG_AUTO_IS_NULL
选择在连接器/ ODBC连接参数.
测试值是否为空值
零
.mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;-> 1,1,0
如果
expr
是零
,ISNULL ()
返回1
,否则返回0
.mysql >选择ISNULL (1 + 1);-> 0 mysql> SELECT ISNULL(1/0)- > 1
如果有两个或多个参数,则返回最小(最小值)参数。参数比较的规则如下:
的返回类型
至少()
比较参数类型的聚合类型。mysql >选择至少(2,0);-> 0 mysql> SELECT LEAST(34.0,3.0,5.0,767.0);-> 3.0 mysql> SELECT LEAST('B','A','C');- - - - - - >“A”