参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html
12.3.1 操作符优先级
运算符优先级显示在以下列表中,从最高优先级到最低优先级。 一起显示在一行上的运算符具有相同的优先级。
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相同的优先级。 当用作赋值运算符时,它具有与:=相同的优先级。 第13.7.4.1节“变量赋值的SET语法”和第9.4节“用户定义的变量”解释了MySQL如何确定应该应用哪种解释。
对于在表达式中出现在相同优先级别的运算符,评估从左到右进行,除了赋值从右向左评估。
一些运算符的含义取决于SQL模式:
运算符的优先级决定了表达式中条件的评估顺序。 要显式覆盖此顺序和组术语,请使用括号。 例如:
mysql> SELECT 1+2*3;
-> 7
mysql>
SELECT (1+2)*3;
-> 9
12.3.2 比较函数和操作符
比较运算的结果为1(TRUE),0(FALSE)或NULL。 这些操作适用于数字和字符串。 必要时,字符串会自动转换为数字和数字。
以下关系比较运算符不仅可用于比较标量操作数,还可用于比较行操作数:
= > < >= <= <> !=
要将值转换为特定类型以进行比较,可以使用CAST()函数。 可以使用CONVERT()将字符串值转换为不同的字符集。
默认情况下,字符串比较不区分大小写,并使用当前字符集。 缺省值是latin1(cp1252 West European),对英语适用。
相等:
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。
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))
根据布尔值测试值,其中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时支持以下额外功能:
SELECT * FROM tbl_name WHERE auto_col IS NULL
如果语句返回一行,则返回的值与调用LAST_INSERT_ID()函数时相同。 有关详细信息(包括多行插入后的返回值),请参见第12.14节“信息函数”。 如果未成功插入AUTO_INCREMENT值,则SELECT语句不返回任何行。
通过设置sql_auto_is_null = 0,可以禁用通过使用IS NULL比较来检索AUTO_INCREMENT值的行为。
sql_auto_is_null的默认值是0。
SELECT * FROM tbl_name WHERE date_column IS NULL
由于ODBC不支持'0000-00-00'日期值,所以需要这样才能使某些ODBC应用程序正常工作。
测试 值是否是 not NULL
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1, 1, 0
如果expr大于或等于min,并且expr小于或等于max,则BETWEEN返回1,否则返回0.如果所有参数都是,则等于表达式(min <= expr AND expr <= max) 属于同一类型。 否则,根据第12.2节“表达式评估中的类型转换”中描述的规则进行类型转换,但将其应用于所有三个参数。
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 BETWEEN min AND 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'
如果任何参数为NULL,GREATEST()将返回NULL。
如果expr等于IN列表中的任何值,则返回1,否则返回0.如果所有值都是常量,则根据expr的类型对其进行求值并对其进行排序。 然后搜索该项目是使用二进制搜索完成的。 这意味着IN值非常快,如果IN值列表完全由常量组成。 否则,根据第12.2节“表达式评估中的类型转换”中描述的规则进行类型转换,但应用于所有参数。
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');
IN列表中的值数量仅受max_allowed_packet值的限制。
为了符合SQL标准,IN不仅在左侧的表达式为NULL时返回NULL,而且在列表中未找到匹配项且列表中的一个表达式为NULL时,IN返回NULL。
IN()语法也可用于编写某些类型的子查询。
这个类似于 NOT (expr NOT IN (value,...))
如果expr为NULL,则ISNULL()返回1,否则返回0。
mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
ISNULL()可以用来代替=来测试一个值是否为NULL。 (使用=将值与NULL比较,总是得到NULL。)
ISNULL()函数与IS NULL比较运算符共享一些特殊行为。 请参阅IS NULL的说明。
如果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
使用两个或更多参数,返回最小(最小值)参数。 使用以下规则比较参数:
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'
12.3.3 逻辑操作符
在SQL中,所有逻辑运算符的计算结果为TRUE,FALSE或NULL(UNKNOWN)。 在MySQL中,这些作为1(TRUE),0(FALSE)和NULL 实现。 大多数情况下,对于不同的SQL数据库服务器来说是很常见的,尽管有些服务器可能会返回任何非零值作为TRUE。
MySQL会将任何非零非NULL值评估为TRUE。 例如,以下声明都评估为TRUE:
mysql> SELECT 10 IS TRUE;
-> 1
mysql> SELECT -10 IS TRUE;
-> 1
mysql> SELECT 'string' IS NOT NULL;
-> 1
逻辑NOT。 如果操作数为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相同。
逻辑AND。 如果所有操作数都为非零且不为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
逻辑或。 当两个操作数都是非空值时,如果任何操作数不为零,则结果为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
逻辑XOR。 如果任一操作数为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)和b)。
12.3.4 赋值运算符
赋值运算符。 使操作左侧的用户变量取其右侧的值。 右侧的值可能是一个字面值,另一个存储值的变量,或者是产生标量值(包括查询结果)的任何合法表达式(假设该值为标量值)。 您可以在同一个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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3169725/ ,如需转载,请注明出处,否则将追究法律责任。