MySQL基础教程5 —— 操作符

2018-07-13 08:46:34来源:编程学习网 阅读 ()

新老客户大回馈,云服务器低至5折

1.?操作符优先级

以下列表显示了操作符优先级的由低到高的顺序。排列在同一行的操作符具有相同的优先级。

:=

||, OR, XOR

&&, AND

NOT

BETWEEN, CASE, WHEN, THEN, ELSE

=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN

|

&

<<, >>

-, +

*, /, DIV, %, MOD

^

- (一元减号), ~ (一元比特反转)

!

BINARY, COLLATE

注释:假如?HIGH_NOT_PRECEDENCE SQL?模式被激活,则?NOT?的优先级同?the? !?操作符相同。

2.?圆括号

  • ( ... )使用括弧来规定表达式的运算顺序,例如:
    mysql> SELECT 1+2*3;
            -> 7
    mysql> SELECT (1+2)*3;
            -> 9

3.?比较函数和操作符

比较运算产生的结果为1(TRUE)、0 (FALSE)或?NULL。这些运算可用于数字和字符串。根据需要,字符串可自动转换为数字,而数字也可自动转换为字符串。

本章中的一些函数?(如LEAST()和GREATEST())?的所得值不包括?1 (TRUE)、?0 (FALSE)和?NULL。然而,其所得值乃是基于按照下述规则运行的比较运算:

MySQL按照以下规则进行数值比较:

  • 若有一个或两个参数为?NULL,除非NULL-safe <=>?等算符,则比较运算的结果为NULL。
  • 若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
  • 若两个参数均为整数,则按照整数进行比较。
  • 十六进制值在不需要作为数字进行比较时,则按照二进制字符串进行处理。
  • 假如参数中的一个为?TIMESTAMP?或?DATETIME?列,而其它参数均为常数, 则在进行比较前将常数转为?timestamp。这样做的目的是为了使ODBC的进行更加顺利。?注意,这不适合IN()中的参数!为了更加可靠,在进行对比时通常使用完整的?datetime/date/time字符串。
  • 在其它情况下,参数作为浮点数进行比较。

在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252 Latin1,同时对英语也适合)。

为了进行比较,可使用CAST()函数将某个值转为另外一种类型。 使用CONVERT()将字符串值转为不同的字符集。

以下例子说明了比较运算中将字符串转为数字的过程:

mysql>?SELECT 1 > '6x';

-> 0

mysql>?SELECT 7 > '6x';

-> 1

mysql>?SELECT 0 > 'x6';

-> 0

mysql>?SELECT 0 = 'x6';

-> 1

注意,在将一个字符串列同一个数字进行比较时,?MySQL?不能使用列中的索引进行快速查找。假如str_col?是一个编入索引的字符串列,则在以下语句中,索引不能执行查找功能:

SELECT * FROM?tbl_name?WHERE?str_col=1;

其原因是许多不同的字符串都可被转换为数值?1: '1'、?' 1'、?'1a'、 ……

  • =

等于:

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

  • <=>

NULL-safe equal.这个操作符和=操作符执行相同的比较操作,不过在两个操作码均为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

  • <> !=

不等于:

mysql>?SELECT '.01' <> '0.01';

-> 1

mysql>?SELECT .01 <> '0.01';

-> 0

mysql>?SELECT 'zapp' <> 'zappp';

-> 1

  • <=

小于或等于:

mysql>?SELECT 0.1 <= 2;

-> 1

  • <

小于:

mysql>?SELECT 2 < 2;

-> 0

  • >=

大于或等于:

mysql>?SELECT 2 >= 2;

-> 1

  • >

大于:

mysql>?SELECT 2 > 2;

-> 0

  • IS?boolean_value?IS NOT?boolean_value

根据一个布尔值来检验一个值,在这里,布尔值可以是TRUE、FALSE或UNKNOWN。

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

-> 1, 1, 1

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

-> 1, 1, 0

  • IS NULL IS NOT NULL

检验一个值是否为?NULL。

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

-> 0, 0, 1

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

-> 1, 1, 0

为了能够顺利的使用ODBC?程序工作,在使用IS NULL时,MySQL支持一下额外特性:

    • 在一个值产生后,立即运行一个以下格式的语句,从而找到最新AUTO_INCREMENT?值的所在行:

o?????????????????????SELECT * FROM?tbl_name?WHERE?auto_col?IS NULL

当设置SQL_AUTO_IS_NULL=0时,这项操作无法运行。

    • 对于命名为NOT NULL?的DATE?和DATETIME列,可通过使用如下的 语句找到特定日期?'0000-00-00':

o?????????????????????SELECT * FROM?tbl_name?WHERE?date_column?IS NULL

运行这一步需要使用一些?ODBC?应用软件,因为?ODBC本身不支持 一个?'0000-00-00'的时间值。

  • expr?BETWEEN?min?AND?max

假如expr大于或等于?min?且expr?小于或等于max,?则BETWEEN?的返回值为1,或是0。若所有参数都是同一类型,则上述关系相当于表达式?? (min?<=?expr?AND?expr?<=?max)。其它类型的转换根据本章开篇所述规律进行,且适用于3种参数中任意一种。

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

  • expr?NOT BETWEEN?min?AND?max

这相当于NOT(expr?BETWEEN?min?AND?max)。

· COALESCE(value,...)

返回值为列表当中的第一个非?NULL值,在没有非NULL?值得情况下返回值为?NULL?。

mysql>?SELECT COALESCE(NULL,1);

-> 1

mysql>?SELECT COALESCE(NULL,NULL,NULL);

-> NULL

· GREATEST(value1,value2,...)

当有2或多个参数时,返回值为最大(最大值的)参数。比较参数所依据的规律同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?的速度非常之快。如expr?是一个区分大小写的字符串表达式,则字符串比较也按照区分大小写的方式进行。

mysql>?SELECT 2 IN (0,3,5,'wefwf');

-> 0

mysql>?SELECT 'wefwf' IN (0,3,5,'wefwf');

-> 1

IN?列表中所列值的个数仅受限于?max_allowed_packet?值。

为了同SQL?标准相一致,在左侧表达式为NULL的情况下,或是表中找不到匹配项或是表中一个表达式为NULL?的情况下,IN的返回值均为NULL。

IN()?语构也可用书写某些类型的子查询。

·?expr?NOT IN (value,...)

这与NOT (expr?IN (value,...))相同。

  • ISNULL(expr)

expr?为NULL,那么ISNULL()?的返回值为?1,否则返回值为?0。

mysql>?SELECT ISNULL(1+1);

-> 0

mysql>?SELECT ISNULL(1/0);

-> 1

使用=?的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,...)

在有两个或多个参数的情况下, 返回值为最小?(最小值)?参数。用一下规则将自变量进行对比:

    • 假如返回值被用在一个?INTEGER?语境中,或是所有参数均为整数值,则将其作为整数值进行比较。
    • 假如返回值被用在一个?REAL语境中,或所有参数均为实值,则 将其作为实值进行比较。
    • 假如任意一个参数是一个区分大小写的字符串,则将参数按照区分大小写的字符串进行比较。
    • 在其它情况下,将参数作为区分大小写的字符串进行比较。

假如任意一个自变量为NULL,则?LEAST()的返回值为NULL?。

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'

注意,上面的转换规则在一些边界情形中会产生一些奇特的结果:

mysql>?SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);

-> -9223372036854775808

发生这种情况的原因是MySQL在整数语境中读取9223372036854775808.0。整数表示法不利于保存数值,因此它包括一个带符号整数。

4.?逻辑操作符

在SQL中,所有逻辑 操作符的求值所得结果均为?TRUE、FALSE或?NULL (UNKNOWN)。在?MySQL中,它们体现为? 1 (TRUE)、?0 (FALSE)和?NULL。其大多数都与不同的数据库SQL通用,然而一些服务器对TRUE的返回值可能是任意一个非零值。

  • 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 && 1;

-> 1

mysql>?SELECT 1 && 0;

-> 0

mysql>?SELECT 1 && NULL;

-> NULL

mysql>?SELECT 0 && NULL;

-> 0

mysql>?SELECT NULL && 0;

-> 0

  • OR ||

逻辑?OR。当两个操作数均为非?NULL值时,如有任意一个操作数为非零值,则结果为1,否则结果为0。当有一个操作数为NULL时,如另一个操作数为非零值,则结果为1,否则结果为?NULL?。假如两个操作数均为? NULL,则所得结果为NULL。

mysql>?SELECT 1 || 1;

-> 1

mysql>?SELECT 1 || 0;

-> 1

mysql>?SELECT 0 || 0;

-> 0

mysql>?SELECT 0 || NULL;

-> NULL

mysql>?SELECT 1 || 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)。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:MySQL入门教程3 —— 创建、选择并使用数据库

下一篇:MySQL入门教程2 —— 输入查询及退出查询命令

热门词条
热门标签