首页 > MySQL > MySQL 那些你不知道的 运算符
2009四月15

MySQL 那些你不知道的 运算符

算术运算符:

像所有开发语言一样,MySQL也支持“+,-,*,/,%”这些运算符。

MySQL允许使用带有任意的由用户提供值的SELECT语句,这一点与Oracle不同。当选择一个不能从表中读取的值时,Oracle要求使用FROM DUAL语法。

现在想起Oracle还时常怀念,一天重装了五六遍Oracle数据库的惨痛经历。 :cry:

# 最基本的运算符操作举例
SELECT 1 + 2, 2 - 1, 1 * 2 , 1 / 2, 2 % 1;

所有涉及整数的数学去处都使用64位精度进行计算。在这个范围之外的数字可能产生一个预料不到的结果

用字符串表示的数字在任何可能便于计算的地方都被自动地转换为数字。

  • 如果第一位是数字的字符串被用于一个算术运算中,那么它被转换为这个数字的值。
  • 如果一个包含字符和数字混合的字符串不能被正确地转换为数字,那么它被转换成0。

SELECT '500' + '00002', '8.9' * 10, '90AA' + '0','AA9' + '0';
# 结果为502, 89, 90,0

比较运算符:

“>”,”<","BETWEEN","IN"这些就不再提了,主要说一下"IS NULL","LIKE"

MySQL比较运算符的潜规则:数字作为浮点值比较,而字符串以不区分小写的方式进行比较(除非使用BINARY关键字)

SELECT 'Simaopig' = 'simaopig', BINARY 'Simaopig' = 'simaopig';
# 第一个为真,返回1 第二个为假,返回0,因为是二进制数在比较

:oops: 说不讲了,又忍不住再举个例子,方便自己日后查阅。

当比较字符串时,MySQL忽略末尾空格、制表符和换行符
然后,前面的空格、制表符和换行符将在比较运算中保留和使用
通常包括一个NULL值的任何一个比较运算符往往产生一个NULL结果。

如何测试实际NULL值的存在和不存在呢?答案就是“IS NULL”和“IS NOT NULL”,以及”<=>“这个“NULL安全的等于”运算符。

SELECT 88 IS NULL, 0 IS NULL, NULL IS NULL, 1 = NULL IS NULL;
# 前两个返回假,后两个返回真,即在IS NULL判断中,只有NULL值返回真
SELECT 2 = NULL2 <=> NULLNULL=NULL;
# 第一个返回NULL,第二个返回0,第三个返回1

在PHP中我经常会想不明白“空值与NULL值是否相同,手册上面有可能写的很清楚。
但是在MySQL里,我可以很确定的告诉你,空值和NULL是不同的。

<?php
    if("" == NULL)
    {
        //这里将被执行
        var_dump("xxx");
    }
    //这里将返回FALSE,因为is_null判断的是否是NULL,而不是是否等于NULL
    var_dump(is_null(""));
?>
SELECT '' IS NULL;
# 返回的是0也就是假,这里很明确的说明了空与NULL是不一样的

关于LIKE真是没什么可说的了,继续摘录书中的话

很多人喜欢用LIKE运算符来解决他们所有的烦恼,因为使用通配符似乎可以充值简化复杂的搜索查询。这样的情形具有某种欺骗性:MySQL的LIKE运算符的确强大有力,并且通过使用几个字符串片断就可以查找记录,但是不过多地考虑查询的结构和数据库的索引来使用它,就会大大系统的性能(因为必须搜索整个表才能找到结果)。因此,当使用一个包含LIKE的运算符的查询时,建议我们保证在查询WHERE子句中命名的列是加索引的,并且WHERE子句应包含足够多的数据来限制在开始时搜索的记录数目。

逻辑运算符和位运算符:

懒了点,就把这两个写在一起吧, :???:

这里重点说一下异或吧,呵,因为“AND”,和“OR”实在是没啥说的,啥?你说“NOT”?晕。。你自己看一下吧,乖。

为什么说异或呢?“XOR”,很简单,因为大学考高数经常考它,

为什么又说“经常”呢。因为。。。。我补考来着,还不是一次。 :cry:

这么解释一下吧,“异或”就是“只有条件中的一个为真,另一个为假时才返回真,而两个都为真则返回假,即运算符两侧不能相同”

SELECT (1 = 1 ) XOR (2 = 4) ,( 1 < 2 ) XOR ( 2 < 4 );
# 第一个返回真,第二个返回假

位运算符,嗯。。我编程至今,没咋用到这个东东,忽略不计(毕竟我不是搞汇编的)。。。

运算符的优先级:

这个网上有很多,我去搜一下吧。。。呃,搜到的结果不满意,自己写吧。

下面内容仍然抄自书中,如下列出的运算符优先级从低到高,同行的优先级是一样,一样,一样滴 :wink:

  • ‘OR’
  • ‘AND’
  • ‘BETWEEN’,'CASE’,'WHEN’,'THIS’,'ELSE’
  • ‘=’,’<=>‘,’>=’,'>’,’<=','<','<>‘,’IS’,'LIKE’,'REGEXP’,'IN’
  • ‘|’
  • ‘&’
  • ‘<<','>>’
  • ‘-’,'+’
  • ‘*’,'/’,'%’
  • ‘~’
  • ‘NOT’
  • ‘BINARY’

告诉大家一个方法,上面的优先级我是真的记不住,为了避免“不明确性”导致的一些怪现象,你用括号’()’啊!~~

至于我为啥不说‘REGEXP’这个正则表达式这么强大的东东。。

嗯,好吧,我告诉你,因为那不属于本文讨论范畴 :shock: 啥?你还问? :oops: ,好吧,我说实话,我不会。。。 :sad:

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/04/15/163/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

3 Responses to “MySQL 那些你不知道的 运算符”

  1. #1 simaopig 回复 | 引用 Post:2009-04-15 23:10

    我感觉,字数统计不对呢?貌似引用的不算?可能吧。还是不是代码也不算?嗯。也有可能。

    [回复]

  2. #2 Washington 回复 | 引用 Post:2009-04-16 00:05

    哈哈,看你留言了,我准备换个域名空间弄博客,所以没管了,ps:你文章写的太尖端了!

    [回复]

  3. #3 simaopig 回复 | 引用 Post:2009-04-16 00:09

    @Washington
    呵呵。以为你不要了呢。呵。换好后告诉我,我改链接。没事常来玩。
    有了博客后才看的书,以前都是现用现翻,这回系统的看一下就记了下来。 :eek:

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)