MySQL基礎(chǔ)教程5 —— 操作符
以下列表顯示了操作符優(yōu)先級(jí)的由低到高的順序。排列在同一行的操作符具有相同的優(yōu)先級(jí)。
:=
||, OR, XOR
&&, AND
NOT
BETWEEN, CASE, WHEN, THEN, ELSE
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
|
&
<<, >>
-, +
*, /, DIV, %, MOD
^
- (一元減號(hào)), ~ (一元比特反轉(zhuǎn))
!
BINARY, COLLATE
注釋:假如HIGH_NOT_PRECEDENCE SQL模式被激活,則NOT的優(yōu)先級(jí)同the !操作符相同。
2.圓括號(hào)( ... )使用括弧來(lái)規(guī)定表達(dá)式的運(yùn)算順序,例如:mysql> SELECT 1+2*3;-> 7mysql> SELECT (1+2)*3;-> 93.比較函數(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ì)英語(yǔ)也適合)。
為了進(jìn)行比較,可使用CAST()函數(shù)將某個(gè)值轉(zhuǎn)為另外一種類型。 使用CONVERT()將字符串值轉(zhuǎn)為不同的字符集。
以下例子說(shuō)明了比較運(yùn)算中將字符串轉(zhuǎn)為數(shù)字的過(guò)程:
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è)編入索引的字符串列,則在以下語(yǔ)句中,索引不能執(zhí)行查找功能:
SELECT * FROMtbl_nameWHEREstr_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í)行相同的比較操作,不過(guò)在兩個(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 <= 2;
-> 1
<小于:
mysql>SELECT 2 < 2;
-> 0
>=大于或等于:
mysql>SELECT 2 >= 2;
-> 1
>大于:
mysql>SELECT 2 > 2;
-> 0
ISboolean_valueIS NOTboolean_value根據(jù)一個(gè)布爾值來(lái)檢驗(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è)以下格式的語(yǔ)句,從而找到最新AUTO_INCREMENT值的所在行:oSELECT * FROMtbl_nameWHEREauto_colIS NULL
當(dāng)設(shè)置SQL_AUTO_IS_NULL=0時(shí),這項(xiàng)操作無(wú)法運(yùn)行。
對(duì)于命名為NOT NULL的DATE和DATETIME列,可通過(guò)使用如下的 語(yǔ)句找到特定日期’0000-00-00’:oSELECT * FROMtbl_nameWHEREdate_columnIS NULL
運(yùn)行這一步需要使用一些ODBC應(yīng)用軟件,因?yàn)镺DBC本身不支持 一個(gè)’0000-00-00’的時(shí)間值。
exprBETWEENminANDmax假如expr大于或等于min且expr小于或等于max,則BETWEEN的返回值為1,或是0。若所有參數(shù)都是同一類型,則上述關(guān)系相當(dāng)于表達(dá)式 (min<=exprANDexpr<=max)。其它類型的轉(zhuǎn)換根據(jù)本章開(kāi)篇所述規(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
exprNOT BETWEENminANDmax這相當(dāng)于NOT(exprBETWEENminANDmax)。
· COALESCE(value,...)
返回值為列表當(dāng)中的第一個(gè)非NULL值,在沒(méi)有非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’
在沒(méi)有自變量為NULL的情況下,GREATEST()的返回值為NULL。
·exprIN(value,...)
若expr為IN列表中的任意一個(gè)值,則其返回值為1 ,否則返回值為0。假如所有的值都是常數(shù),則其計(jì)算和分類根據(jù)expr的類型進(jìn)行。這時(shí),使用二分搜索來(lái)搜索信息。如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()語(yǔ)構(gòu)也可用書(shū)寫某些類型的子查詢。
·exprNOT IN (value,...)
這與NOT (exprIN (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)參見(jiàn)有關(guān)IS NULL的說(shuō)明。
· 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語(yǔ)境中,或是所有參數(shù)均為整數(shù)值,則將其作為整數(shù)值進(jìn)行比較。假如返回值被用在一個(gè)REAL語(yǔ)境中,或所有參數(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ù)語(yǔ)境中讀取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ù)庫(kù)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)。
相關(guān)文章:
1. sql語(yǔ)句LEFT JOIN拼接表詳解2. C# 連接Access數(shù)據(jù)時(shí)總報(bào)找不到dbo.mdb的問(wèn)題3. Mysql優(yōu)化方法詳細(xì)介紹4. SQLServer創(chuàng)建索引的5種方法小結(jié)5. MySQL字段為 NULL的5大坑6. SQLite3 命令行操作指南7. MySQL實(shí)現(xiàn)批量推送數(shù)據(jù)到Mongo8. SQLite 性能優(yōu)化實(shí)例分享9. SQLite教程(二):C/C++接口簡(jiǎn)介10. SQLite中的WAL機(jī)制詳細(xì)介紹
