操作符_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2002 | 回复: 1   主题: 操作符        下一篇 
wlcbhrss
注册用户
等级:新兵
经验:68
发帖:65
精华:0
注册:2011-8-21
状态:离线
发送短消息息给wlcbhrss 加好友    发送短消息息给wlcbhrss 发消息
发表于: IP:您无权察看 2015-6-23 10:44:53 | [全部帖] [楼主帖] 楼主

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

            --转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
superstar
注册用户
等级:上尉
经验:525
发帖:2
精华:0
注册:2015-6-3
状态:离线
发送短消息息给superstar 加好友    发送短消息息给superstar 发消息
发表于: IP:您无权察看 2015-6-24 10:24:56 | [全部帖] [楼主帖] 2  楼

逻辑XOR这个有点意思啊



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论