目录
名称 | 描述 |
---|---|
AND , && | 逻辑与 |
= | 分配值(作为SET 语句的一部分 ,或作为UPDATE 语句的SET 子句的 一部分) |
:= | 赋值 |
BETWEEN ... AND ... | 值是否在值范围内 |
BINARY | 将字符串转换为二进制字符串 |
& | 按位与 |
~ | 按位反转 |
| | 按位或 |
^ | 按位异或 |
CASE | 案例运算符 |
DIV | 整数除法 |
/ | 部门运营商 |
= | 平等算子 |
<=> | NULL安全等于运算符 |
> | 大于运算符 |
>= | 大于或等于运算符 |
IN() | 一个值是否在一组值内 |
IS | 针对布尔值测试值 |
IS NOT | 针对布尔值测试值 |
IS NOT NULL | 非空值测试 |
IS NULL | 空值测试 |
-> | 评估路径后从JSON列返回值;等效于JSON_EXTRACT()。 |
->> | 在评估路径并取消引用结果后,从JSON列返回值;等效于JSON_UNQUOTE(JSON_EXTRACT())。 |
<< | 左移 |
< | 少于运算符 |
<= | 小于或等于运算符 |
LIKE | 简单模式匹配 |
- | 减号 |
% , MOD | 模运算符 |
NOT , ! | 取反值 |
NOT BETWEEN ... AND ... | 值是否不在值范围内 |
!= , <> | 不等于运算符 |
NOT IN() | 一个值是否不在一组值内 |
NOT LIKE | 否定简单模式匹配 |
NOT REGEXP | 否REGEXP |
OR , || | 逻辑或 |
+ | 加法运算符 |
REGEXP | 字符串是否匹配正则表达式 |
>> | 右移 |
RLIKE | 字符串是否匹配正则表达式 |
SOUNDS LIKE | 比较声音 |
* | 乘法运算符 |
- | 更改参数的符号 |
XOR | 逻辑异或 |
运算符优先级
运算符优先级从最高优先级到最低优先级显示在以下列表中。一起显示在一行上的运算符具有相同的优先级。
INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
AND, &&
XOR
OR, ||
= (assignment), :=
=的优先级取决于它是用作比较运算符(=
)还是用作赋值运算符(=
)。当作为比较操作符使用,它具有优先级相同的<=>
, >=
, >
, <=
, <
, <>
, !=
, IS
, LIKE
, REGEXP
,和 IN()
。当用作赋值运算符时,它的优先级与 :=
相同。
对于在表达式中以相同优先级出现的运算符,评估从左至右进行,例外情况是赋值从右至左进行评估。
一些运算符的优先级和含义取决于SQL模式:
- 默认情况下,
||
是逻辑OR
运算符。PIPES_AS_CONCAT
启用,||
是字符串连接,优先于^和一元运算符。 - 默认情况下,
!
优先级高于NOT
。随着HIGH_NOT_PRECEDENCE
启用,!
和NOT
具有相同的优先级。
运算符的优先级确定表达式中项的求值顺序。要显式覆盖此顺序并分组术语,请使用括号。例如:
mysql> SELECT 1+2*3;
-> 7
mysql> SELECT (1+2)*3;
-> 9
比较函数和运算符
名称 | 描述 |
---|---|
BETWEEN ... AND ... | 值是否在值范围内 |
COALESCE() | 返回第一个非NULL参数 |
= | 平等算子 |
<=> | 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
。这些操作适用于数字和字符串。字符串会自动转换为数字,数字会根据需要转换为字符串。
以下关系比较运算符不仅可以用于比较标量操作数,还可以用于比较行操作数:
= > < >= <= <> !=
本节稍后对这些运算符的描述将详细介绍它们如何与行操作数一起使用。有关行子查询上下文中行比较的其他示例,请参见 第13.2.10.5节“行子查询”。
本节中的某些函数返回的值不是 1
(TRUE
), 0
(FALSE
)或 NULL
。LEAST()
并且GREATEST()
是此类功能的示例;第12.2节“表达式评估中的类型转换”描述了由这些函数和类似函数执行的比较操作的规则,以确定它们的返回值。
要将值转换为特定类型以进行比较,可以使用该CAST()
函数。可以使用将字符串值转换为其他字符集CONVERT()
。请参见 第12.10节“广播函数和运算符”。
默认情况下,字符串比较不区分大小写,并使用当前字符集。默认值为 latin1
(cp1252西欧),它也适用于英语。
逻辑运算符
名称 | 描述 |
---|---|
AND , && | 逻辑与 |
NOT , ! | 取反值 |
OR , || | 逻辑或 |
XOR | 逻辑异或 |
在SQL中,所有逻辑运算符来评估 TRUE
,FALSE
或 NULL
(UNKNOWN
)。在MySQL中,这些实现为1(TRUE
),0(FALSE
)和NULL
。尽管其中有些服务器可能返回的任何非零值来表示TRUE
,但大多数情况对于不同的SQL数据库服务器来说是通用的 。
MySQL将所有非零,非NULL
值都评估为TRUE
。例如,以下语句均评估为TRUE
:
mysql> SELECT 10 IS TRUE;
-> 1
mysql> SELECT -10 IS TRUE;
-> 1
mysql> SELECT 'string' IS NOT NULL;
-> 1
逻辑非。如果操作数是0
,则评估为1
,如果操作数非零,则评估为0
,NOT NULL
返回NULL
。
mysql> SELECT NOT 10;
-> 0
mysql> SELECT NOT 0;
-> 1
mysql> SELECT NOT NULL;
-> NULL
mysql> SELECT ! (1+1);
-> 0
mysql> SELECT ! 1+1;
-> 1
最后一个例子产生1
,因为表达式的计算方式与(!1)+1
相同。
逻辑与。如果所有操作数都非零且不是NULL
,则计算为1
,如果一个或多个操作数为0
,则计算为0
,否则返回NULL
。
mysql> SELECT 1 AND 1;
-> 1
mysql> SELECT 1 AND 0;
-> 0
mysql> SELECT 1 AND NULL;
-> NULL
mysql> SELECT 0 AND NULL;
-> 0
mysql> SELECT NULL AND 0;
-> 0
逻辑或。当两个操作数都是非NULL
时,如果任何操作数非零,则结果为1
,否则为0
。使用NULL
操作数,如果另一个操作数非零,则结果为1
,否则为NULL
。如果两个操作数均为NULL
,则结果为NULL
。
mysql> SELECT 1 OR 1;
-> 1
mysql> SELECT 1 OR 0;
-> 1
mysql> SELECT 0 OR 0;
-> 0
mysql> SELECT 0 OR NULL;
-> NULL
mysql> SELECT 1 OR NULL;
-> 1
注意如果 启用了
PIPES_AS_CONCAT
SQL模式,则||
表示SQL标准的字符串连接运算符(如CONCAT()
)。
逻辑异或。如果任一操作数为NULL
,则返回NULL
。对于非NULL
操作数,如果奇数个操作数非零,则求值为1
,否则返回0
。
mysql> SELECT 1 XOR 1;
-> 0
mysql> SELECT 1 XOR 0;
-> 1
mysql> SELECT 1 XOR NULL;
-> NULL
mysql> SELECT 1 XOR 1 XOR 1;
-> 1
a XOR b
在数学上等于(a AND (NOT b)) OR ((NOT a) and b)
。
赋值运算符
名称 | 描述 |
---|---|
= | 分配值(作为SET 语句的一部分 ,或作为UPDATE 语句的SET 子句的 一部分) |
:= | 赋值 |
赋值运算符。使操作员左侧的用户变量采用其右侧的值。右侧的值可以是文字值,另一个存储值的变量或任何产生标量值的合法表达式,包括查询结果(假设该值是标量值)。您可以在同 一条语句中执行多个SET
分配 。您可以在同一条语句中执行多个分配。
不同于 =
, :=
运算符永远不会被解释为比较运算符。这意味着您可以在任何有效的SQL语句中(不仅在 SET
语句中)使用 :=
来为变量分配值。
mysql> SELECT @var1, @var2;
-> NULL, NULL
mysql> SELECT @var1 := 1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2 := @var1;
-> 1, 1
mysql> SELECT @var1, @var2;
-> 1, 1
mysql> SELECT @var1:=COUNT(*) FROM t1;
-> 4
mysql> SELECT @var1;
-> 4
您可以在 SELECT
之外的其他语句中使用:=
进行值分配,例如 UPDATE
,如下所示:
mysql> SELECT @var1;
-> 4
mysql> SELECT * FROM t1;
-> 1, 3, 5, 7
mysql> UPDATE t1 SET c1 = 2 WHERE c1 = @var1:= 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT @var1;
-> 1
mysql> SELECT * FROM t1;
-> 2, 3, 5, 7
尽管也可以使用:=
运算符在单个SQL语句中设置和读取同一变量的值 ,但是不建议这样做。 第9.4节“用户定义的变量”解释了为什么应避免这样做。
该操作符用于在两种情况下执行值分配,以下两段将进行介绍。
在一条 SET
语句中,=
被视为赋值运算符,它使运算符左侧的用户变量采用其右侧的值。(换句话说,在SET
语句中使用时 ,=
与:=
。相同 。)右侧的值可以是文字值,存储该值的另一个变量或产生标量值的任何合法表达式,包括查询(前提是该值是标量值)。您可以在同一条语句中执行多个SET
分配 。
在 UPDATE
语句的SET
子句中, =
还充当赋值运算符;但是,在这种情况下,如果符合UPDATE
的任何WHERE
条件,它就会使操作符左侧命名的列采用右侧的值。您可以在 UPDATE
语句的同一SET
子句中 进行多个分配。
在任何其他上下文中,=
被视为 比较运算符。
mysql> SELECT @var1, @var2;
-> NULL, NULL
mysql> SELECT @var1 := 1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2 := @var1;
-> 1, 1
mysql> SELECT @var1, @var2;
-> 1, 1
有关更多信息,请参见第13.7.4.1节“变量分配的SET语法”, 第13.2.11节“ UPDATE语句”和第13.2.10 节“子查询”。