MySQL基礎(chǔ)教程5 — 操作符

1.?操作符優(yōu)先級(jí)

以下列表顯示了操作符優(yōu)先級(jí)的由低到高的順序。排列在同一行的操作符具有相同的優(yōu)先級(jí)。

:=

||, OR, XOR

&&, AND

NOT

BETWEEN, CASE, WHEN, THEN, ELSE

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

|

&

>

-, +

*, /, p, %, MOD

^

– (一元減號(hào)), ~ (一元比特反轉(zhuǎn))

!

BINARY, COLLATE

注釋:假如?HIGH_NOT_PRECEDENCE SQL?模式被激活,則?NOT?的優(yōu)先級(jí)同?the? !?操作符相同。

2.?圓括號(hào)

  • ( … )使用括弧來規(guī)定表達(dá)式的運(yùn)算順序,例如:

    mysql>?SELECT?1+2*3;  ????????->?7  mysql>?SELECT?(1+2)*3;  ????????->?9

3.?比較函數(shù)和操作符

比較運(yùn)算產(chǎn)生的結(jié)果為1(TRUE)、0 (FALSE)或?NULL。這些運(yùn)算可用于數(shù)字和字符串。根據(jù)需要,字符串可自動(dòng)轉(zhuǎn)換為數(shù)字,而數(shù)字也可自動(dòng)轉(zhuǎn)換為字符串。

本章中的一些函數(shù)?(如LEAST()和GREATEST())?的所得值不包括?1 (TRUE)、?0 (FALSE)和?NULL。然而,其所得值乃是基于按照下述規(guī)則運(yùn)行的比較運(yùn)算:

MySQL按照以下規(guī)則進(jìn)行數(shù)值比較:

  • 若有一個(gè)或兩個(gè)參數(shù)為?NULL,除非NULL-safe ?等算符,則比較運(yùn)算的結(jié)果為NULL。

  • 若同一個(gè)比較運(yùn)算中的兩個(gè)參數(shù)都是字符串,則按照字符串進(jìn)行比較。

  • 若兩個(gè)參數(shù)均為整數(shù),則按照整數(shù)進(jìn)行比較。

  • 十六進(jìn)制值在不需要作為數(shù)字進(jìn)行比較時(shí),則按照二進(jìn)制字符串進(jìn)行處理。

  • 假如參數(shù)中的一個(gè)為?timestamp?或?DATETIME?列,而其它參數(shù)均為常數(shù), 則在進(jìn)行比較前將常數(shù)轉(zhuǎn)為?timestamp。這樣做的目的是為了使ODBC的進(jìn)行更加順利。?注意,這不適合IN()中的參數(shù)!為了更加可靠,在進(jìn)行對(duì)比時(shí)通常使用完整的?datetime/date/time字符串。

  • 在其它情況下,參數(shù)作為浮點(diǎn)數(shù)進(jìn)行比較。

在默認(rèn)狀態(tài)下,字符串比較不區(qū)分大小寫,并使用現(xiàn)有字符集(默認(rèn)為cp1252 Latin1,同時(shí)對(duì)英語也適合)。

為了進(jìn)行比較,可使用CAST()函數(shù)將某個(gè)值轉(zhuǎn)為另外一種類型。 使用CONVERT()將字符串值轉(zhuǎn)為不同的字符集。

以下例子說明了比較運(yùn)算中將字符串轉(zhuǎn)為數(shù)字的過程:

mysql>?SELECT?1?>?'6x';  ->?0  mysql>?SELECT?7?>?'6x';  ->?1  mysql>?SELECT?0?>?'x6';  ->?0  mysql>?SELECT?0?=?'x6';  ->?1

注意,在將一個(gè)字符串列同一個(gè)數(shù)字進(jìn)行比較時(shí),?MySQL?不能使用列中的索引進(jìn)行快速查找。假如str_col?是一個(gè)編入索引的字符串列,則在以下語句中,索引不能執(zhí)行查找功能:

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

其原因是許多不同的字符串都可被轉(zhuǎn)換為數(shù)值?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.這個(gè)操作符和=操作符執(zhí)行相同的比較操作,不過在兩個(gè)操作碼均為NULL時(shí),其所得值為1而不為NULL,而當(dāng)一個(gè)操作碼為NULL時(shí),其所得值為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??1

小于:

mysql>?SELECT?2??0
  • >=

大于或等于:

mysql>?SELECT?2?>=?2;  ->?1
  • >

大于:

mysql>?SELECT?2?>?2;  ->?0
  • IS?boolean_value?IS NOT?boolean_value

根據(jù)一個(gè)布爾值來檢驗(yàn)一個(gè)值,在這里,布爾值可以是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

檢驗(yàn)一個(gè)值是否為?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時(shí),MySQL支持一下額外特性:

    • 在一個(gè)值產(chǎn)生后,立即運(yùn)行一個(gè)以下格式的語句,從而找到最新AUTO_INCREMENT?值的所在行:

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

當(dāng)設(shè)置SQL_AUTO_IS_NULL=0時(shí),這項(xiàng)操作無法運(yùn)行。

    • 對(duì)于命名為NOT NULL?的DATE?和DATETIME列,可通過使用如下的 語句找到特定日期?‘0000-00-00’:

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

運(yùn)行這一步需要使用一些?ODBC?應(yīng)用軟件,因?yàn)?ODBC本身不支持 一個(gè)?‘0000-00-00’的時(shí)間值。

  • expr?BETWEEN?min?AND?max

假如expr大于或等于?min?且expr?小于或等于max,?則BETWEEN?的返回值為1,或是0。若所有參數(shù)都是同一類型,則上述關(guān)系相當(dāng)于表達(dá)式?? (min?expr?AND?expr?max)。其它類型的轉(zhuǎn)換根據(jù)本章開篇所述規(guī)律進(jìn)行,且適用于3種參數(shù)中任意一種。

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

這相當(dāng)于NOT(expr?BETWEEN?min?AND?max)。

· COALESCE(value,…)

返回值為列表當(dāng)中的第一個(gè)非?NULL值,在沒有非NULL?值得情況下返回值為?NULL?。

mysql>?SELECT?COALESCE(NULL,1);  ->?1  mysql>?SELECT?COALESCE(NULL,NULL,NULL);  ->?NULL  ·?GREATEST(value1,value2,...)

當(dāng)有2或多個(gè)參數(shù)時(shí),返回值為最大(最大值的)參數(shù)。比較參數(shù)所依據(jù)的規(guī)律同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列表中的任意一個(gè)值,則其返回值為?1 ,?否則返回值為0。假如所有的值都是常數(shù),則其計(jì)算和分類根據(jù)?expr?的類型進(jìn)行。這時(shí),使用二分搜索來搜索信息。如IN值列表全部由常數(shù)組成,則意味著IN?的速度非常之快。如expr?是一個(gè)區(qū)分大小寫的字符串表達(dá)式,則字符串比較也按照區(qū)分大小寫的方式進(jìn)行。

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

IN?列表中所列值的個(gè)數(shù)僅受限于?max_allowed_packet?值。

為了同SQL?標(biāo)準(zhǔn)相一致,在左側(cè)表達(dá)式為NULL的情況下,或是表中找不到匹配項(xiàng)或是表中一個(gè)表達(dá)式為NULL?的情況下,IN的返回值均為NULL。

IN()?語構(gòu)也可用書寫某些類型的子查詢。

·?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?值對(duì)比通常是錯(cuò)誤的。

ISNULL()?函數(shù)同?IS NULL比較操作符具有一些相同的特性。請(qǐng)參見有關(guān)IS NULL?的說明。

· INTERVAL(N,N1,N2,N3,…)

假如N?N1則返回值為0;假如N?N2?等等,則返回值為1;假如N?為NULL,則返回值為?-1?。所有的參數(shù)均按照整數(shù)處理。為了這個(gè)函數(shù)的正確運(yùn)行,必須滿足?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,...)

在有兩個(gè)或多個(gè)參數(shù)的情況下, 返回值為最小?(最小值)?參數(shù)。用一下規(guī)則將自變量進(jìn)行對(duì)比:

    • 假如返回值被用在一個(gè)?INTEGER?語境中,或是所有參數(shù)均為整數(shù)值,則將其作為整數(shù)值進(jìn)行比較。

    • 假如返回值被用在一個(gè)?REAL語境中,或所有參數(shù)均為實(shí)值,則 將其作為實(shí)值進(jìn)行比較。

    • 假如任意一個(gè)參數(shù)是一個(gè)區(qū)分大小寫的字符串,則將參數(shù)按照區(qū)分大小寫的字符串進(jìn)行比較。

    • 在其它情況下,將參數(shù)作為區(qū)分大小寫的字符串進(jìn)行比較。

假如任意一個(gè)自變量為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'

注意,上面的轉(zhuǎn)換規(guī)則在一些邊界情形中會(huì)產(chǎn)生一些奇特的結(jié)果:

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

發(fā)生這種情況的原因是MySQL在整數(shù)語境中讀取9223372036854775808.0。整數(shù)表示法不利于保存數(shù)值,因此它包括一個(gè)帶符號(hào)整數(shù)。

4.?邏輯操作符

在SQL中,所有邏輯 操作符的求值所得結(jié)果均為?TRUE、FALSE或?NULL (UNKNOWN)。在?MySQL中,它們體現(xiàn)為? 1 (TRUE)、?0 (FALSE)和?NULL。其大多數(shù)都與不同的數(shù)據(jù)庫SQL通用,然而一些服務(wù)器對(duì)TRUE的返回值可能是任意一個(gè)非零值。

  • NOT !

邏輯?NOT。當(dāng)操作數(shù)為0?時(shí),所得值為?1?;當(dāng)操作數(shù)為非零值時(shí),所得值為? 0?,而當(dāng)操作數(shù)為NOT NULL時(shí),所得的返回值為?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

最后一個(gè)例子產(chǎn)生的結(jié)果為?1,原因是表達(dá)式的計(jì)算方式和(!1)+1相同。

  • AND &&

邏輯AND。當(dāng)所有操作數(shù)均為非零值、并且不為NULL時(shí),計(jì)算所得結(jié)果為? 1?,當(dāng)一個(gè)或多個(gè)操作數(shù)為0?時(shí),所得結(jié)果為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。當(dāng)兩個(gè)操作數(shù)均為非?NULL值時(shí),如有任意一個(gè)操作數(shù)為非零值,則結(jié)果為1,否則結(jié)果為0。當(dāng)有一個(gè)操作數(shù)為NULL時(shí),如另一個(gè)操作數(shù)為非零值,則結(jié)果為1,否則結(jié)果為?NULL?。假如兩個(gè)操作數(shù)均為? NULL,則所得結(jié)果為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。當(dāng)任意一個(gè)操作數(shù)為?NULL時(shí),返回值為NULL。對(duì)于非?? NULL?的操作數(shù),假如一個(gè)奇數(shù)操作數(shù)為非零值,則計(jì)算所得結(jié)果為? 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?的計(jì)算等同于? (a AND (NOT b)) OR ((NOT a)和?b)。

?以上就是MySQL基礎(chǔ)教程5 —— 操作符的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享