首頁 > 資料庫 > mysql教程 > MySQL基礎教學5 — 操作符

MySQL基礎教學5 — 操作符

黄舟
發布: 2017-02-24 11:07:55
原創
865 人瀏覽過


1. 運算子優先權

以下清單顯示了運算子優先權的由低到高的順序。排列在同一行的操作符具有相同的優先權。

:=

||, OR, XOR

&&, AND

NOT

BETWEEN, CASE, WHEN, THEN, ELSE

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

# |

&

<<, >>

#-, +

*, /, p, %, 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 > &#39;6x&#39;;
-> 0
mysql> SELECT 7 > &#39;6x&#39;;
-> 1
mysql> SELECT 0 > &#39;x6&#39;;
-> 0
mysql> SELECT 0 = &#39;x6&#39;;
-> 1
登入後複製

注意,在將一個字串列同一個數字進行比較時, MySQL 不能使用列中的索引進行快速尋找。假如

str_col 是編入索引的字串列,則在下列語句中,索引不能執行查找功能:

SELECT * FROM 

tbl_name WHERE  str_col=1;

原因是許多不同的字串都可以轉換成數值 1: '1'、 ' 1'、 '1a'、…

  • #=

等於:

mysql> SELECT 1 = 0;
-> 0
mysql> SELECT &#39;0&#39; = 0;
-> 1
mysql> SELECT &#39;0.0&#39; = 0;
-> 1
mysql> SELECT &#39;0.01&#39; = 0;
-> 0
mysql> SELECT &#39;.01&#39; = 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 &#39;.01&#39; <> &#39;0.01&#39;;
-> 1
mysql> SELECT .01 <> &#39;0.01&#39;;
-> 0
mysql> SELECT &#39;zapp&#39; <> &#39;zappp&#39;;
-> 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                 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大于或等于 minexpr 小于或等于max, 则BETWEEN 的返回值为1,或是0。若所有参数都是同一类型,则上述关系相当于表达式 (min <= expr AND expr <= max)。其它类型的转换根据本章开篇所述规律进行,且适用于3种参数中任意一种。

mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT &#39;b&#39; BETWEEN &#39;a&#39; AND &#39;c&#39;;
-> 1
mysql> SELECT 2 BETWEEN 2 AND &#39;3&#39;;
-> 1
mysql> SELECT 2 BETWEEN 2 AND &#39;x-3&#39;;
-> 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(&#39;B&#39;,&#39;A&#39;,&#39;C&#39;);
-> &#39;C&#39;
登入後複製

在没有自变量为NULL的情况下,GREATEST()的返回值为NULL。

· expr IN (value,...)

  • expr 为IN列表中的任意一个值,则其返回值为 1 , 否则返回值为0。假如所有的值都是常数,则其计算和分类根据 expr 的类型进行。这时,使用二分搜索来搜索信息。如IN值列表全部由常数组成,则意味着IN 的速度非常之快。如expr 是一个区分大小写的字符串表达式,则字符串比较也按照区分大小写的方式进行。

mysql> SELECT 2 IN (0,3,5,&#39;wefwf&#39;);
-> 0
mysql> SELECT &#39;wefwf&#39; IN (0,3,5,&#39;wefwf&#39;);
-> 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(&#39;B&#39;,&#39;A&#39;,&#39;C&#39;);
-> &#39;A&#39;
登入後複製

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

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

 以上就是MySQL基础教程5 —— 操作符的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板