ITPub博客

首页 > 数据库 > > 12.3 操作符

12.3 操作符

作者:飘絮絮絮丶 时间:2020-05-12 10:29:13 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma



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模式:


  • 默认情况下,|| 是一个逻辑OR运算符。 启用PIPES_AS_CONCAT后,|| 是字符串连接,优先级在^和一元运算符之间。
  • 默认, ! 具有比NOT更高的优先级。 启用HIGH_NOT_PRECEDENCE后,! 和not 具有相同的优先权。


运算符的优先级决定了表达式中条件的评估顺序。 要显式覆盖此顺序和组术语,请使用括号。 例如:


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))




  • IS boolean_value

根据布尔值测试值,其中boolean_value可以为TRUE,FALSE或UNKNOWN。

mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;

-> 1, 1, 1



  • IS NOT boolean_value


根据布尔值测试值,其中boolean_value可以为TRUE,FALSE或UNKNOWN。


mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;

-> 1, 1, 0


  • IS NULL

测试值是否为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()函数时相同。 有关详细信息(包括多行插入后的返回值),请参见第12.14节“信息函数”。 如果未成功插入AUTO_INCREMENT值,则SELECT语句不返回任何行。


通过设置sql_auto_is_null = 0,可以禁用通过使用IS NULL比较来检索AUTO_INCREMENT值的行为。

sql_auto_is_null的默认值是0。



  • 对于声明为NOT NULL的DATE和DATETIME列,可以使用类似下面的语句找到特殊日期'0000-00-00':


SELECT * FROM tbl_name WHERE date_column IS NULL


由于ODBC不支持'0000-00-00'日期值,所以需要这样才能使某些ODBC应用程序正常工作。


  • IS NOT NULL



测试 值是否是 not NULL


mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;

-> 1, 1, 0



  • expr BETWEEN min AND max

如果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。


  • 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);

-> NULL


  • GREATEST(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'


如果任何参数为NULL,GREATEST()将返回NULL。

  • expr IN (value,...)

如果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()语法也可用于编写某些类型的子查询。


  • expr NOT IN (value,...)


这个类似于 NOT (expr NOT IN (value,...))


  • ISNULL(expr)

如果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的说明。


  • INTERVAL(N,N1,N2,N3,...)


如果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(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'


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,!

逻辑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,&&

逻辑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

  • OR,||

逻辑或。 当两个操作数都是非空值时,如果任何操作数不为零,则结果为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

逻辑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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42295