版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章
運(yùn)算符、表達(dá)式和系統(tǒng)函數(shù)——常量和變量MySQL+實(shí)用教程(第4版)01常
量1.?dāng)?shù)值常量2.字符串常量3.日期時(shí)間常量4.布爾值5.NULL值常
量1.?dāng)?shù)值常量(1)十進(jìn)制數(shù)常量十進(jìn)制數(shù)常量分為整數(shù)常量和浮點(diǎn)數(shù)常量,整數(shù)常量即不帶小數(shù)點(diǎn)的十進(jìn)制數(shù),浮點(diǎn)數(shù)常量是使用小數(shù)點(diǎn)的數(shù)值常量。(2)非十進(jìn)制數(shù)常量非十進(jìn)制數(shù)常量包括b(B)二進(jìn)制表示和x(X)十六進(jìn)制表示,它們只能表示整數(shù)。有兩種表示方式,一種是以0打頭,在進(jìn)制表示符后跟進(jìn)制數(shù);另一種以進(jìn)制表示符打頭后跟進(jìn)制數(shù)字符串,但十六進(jìn)制數(shù)字需要雙數(shù)。常
量【例7.1】十進(jìn)制數(shù)常量表示和顯示。SELECT1894,-2,+145345234,-2147483648; #(a)整數(shù)常量SELECT5.26,1.39,101.5E5,0.5E-2; #(b)小數(shù)常量、浮點(diǎn)數(shù)常量SELECT152+5.26,78+0.5E-2; #(c)浮點(diǎn)數(shù)常量運(yùn)算SELECT0b1000001,b'1000011',0x4142,x'4344’; #(d)二進(jìn)制十六進(jìn)制常量運(yùn)行結(jié)果如圖7.1所示。
常
量2.字符串常量字符串常量可以用引號(hào)括起來(lái),也可以通過(guò)十六進(jìn)制表達(dá)。(1)一般字符串常量一般字符串常量用單引號(hào)括起來(lái),例如:'你好,Howareyou!'。其中,ASCII字符用一個(gè)字節(jié)存儲(chǔ),中文用2個(gè)字節(jié)存儲(chǔ)。(2)Unicode字符串常量Unicode字符串常量前面有一個(gè)N標(biāo)志符,代表SQL-92標(biāo)準(zhǔn)的國(guó)際語(yǔ)言(NationalLanguage),用單引號(hào)括起字符串。例如:N'你好,Howareyou!'。其中,每個(gè)字符(中文或者英文)用兩個(gè)字節(jié)存儲(chǔ)。常
量(3)字符串中特殊的字符表示在字符串中不僅可以使用普通的字符,也可使用幾個(gè)轉(zhuǎn)義序列來(lái)表示特殊的字符,見(jiàn)表7.1。每個(gè)轉(zhuǎn)義序列以一個(gè)反斜杠(“\”)開(kāi)始。序
列含
義\0一個(gè)ASCII零值字節(jié)(NUL)字符\n一個(gè)回車(chē)符\r一個(gè)換行符(Windows中使用\r\n作為新行標(biāo)志)\t一個(gè)定位符\b一個(gè)退格符\Z一個(gè)ASCII為26字符(Ctrl+Z)\'一個(gè)單引號(hào)(“'”)\"一個(gè)雙引號(hào)(“"”)\\一個(gè)反斜線(“\”)\%一個(gè)“%”符,用于在正文中搜索包含“%”字符,否則“%”將解釋為一個(gè)通配符。\_一個(gè)“_”符,用于在正文中搜索包含“_”字符,否則“_”將解釋為一個(gè)通配符。常
量(4)字符串中包含引號(hào)字符字符串內(nèi)包含單引號(hào)('),字符串需要用雙引號(hào)("),否則需要用轉(zhuǎn)義字符(\')表示單引號(hào);字符串內(nèi)包含雙引號(hào)("),字符串需要用單引號(hào)('),否則需要用轉(zhuǎn)義字符(\")表示雙引號(hào)。(5)十六進(jìn)制、二進(jìn)制表示字符串每對(duì)(即2個(gè))十六進(jìn)制數(shù)字被轉(zhuǎn)換為一個(gè)字符,不區(qū)分大小寫(xiě)。例如:0x4142和x'4142'表示字符串“AB”,x'4D7953514C'表示字符串“MySQL”。每8位(1個(gè)字節(jié))二進(jìn)制數(shù)字被轉(zhuǎn)換為一個(gè)字符。例如:0b01000001表示字符“A”,b'0100000101000010'表示字符串“AB”。在輸出顯示時(shí),十六進(jìn)制和二進(jìn)制表示被默認(rèn)為表達(dá)字符,而在參與算術(shù)運(yùn)算時(shí)則被認(rèn)為是表達(dá)數(shù)值。常
量【例7.2】字符串常量表示和顯示。SELECT'hello','"hello','hel""lo','hel''lo','\'hello'; #(a)SELECT"'hello","'hel''lo","\"hello\n""hello"; #(b)SELECT-0b1000011,b'1000011'+0,0x1F0+1,-x'01F0'; #(c)SELECT0b01000001,x'4D7953514C'; #(d)運(yùn)行結(jié)果如圖7.2所示。
常
量3.日期時(shí)間常量滿足日期時(shí)間要求的字符串它當(dāng)然本身就是字符串,但當(dāng)用于日期時(shí)間位置、符合日期時(shí)間格式要求并且有效時(shí),就會(huì)被看成是日期時(shí)間常量。日期型常量包括年、月、日,如“2021-06-17”格式。時(shí)間型常量包括小時(shí)數(shù)、分鐘數(shù)、秒數(shù)及微秒數(shù),如“12:30:43.00013”格式。日期時(shí)間型常量是日期時(shí)間組合,如“2021-06-1712:30:43”。注意,MySQL是按“年-月-日”的順序表示日期的,中間的間隔符“-”也可以使用如“\”、“@”或“%”等特殊符號(hào)。此外,日期時(shí)間常量必須有效,如'2021-02-31'的字符串就是錯(cuò)誤的日期時(shí)間常量。【例7.3】日期、時(shí)間常量的表達(dá)顯示與當(dāng)前日期、時(shí)間獲得和顯示。SELECT'2021-06-17',CURDATE(); #(a)日期和當(dāng)前日期SELECT'12:30:43.00013',CURTIME(); #(b)時(shí)間和當(dāng)前時(shí)間SELECT'2021-06-1712:30:43',NOW(); #(c)日期時(shí)間和當(dāng)前日期時(shí)間運(yùn)行結(jié)果如圖7.3所示。
常
量4.布爾值布爾值只包含兩個(gè)可能的值:TRUE和FALSE。TRUE的數(shù)字值為1,F(xiàn)ALSE的數(shù)字值為0。5.NULL值NULL值可適用于各種列類(lèi)型,它通常用來(lái)表示“沒(méi)有值”、“無(wú)數(shù)據(jù)”等含義,并且不同于數(shù)字類(lèi)型(0),或字符串類(lèi)型的空字符串('')。02變
量1.系統(tǒng)變量2.用戶(hù)變量變
量1.系統(tǒng)變量MySQL有一些特定的設(shè)置,例如,有些定義數(shù)據(jù)如何被存儲(chǔ),有些影響到處理速度,還有些與日期有關(guān),這些設(shè)置就是系統(tǒng)變量。1)系統(tǒng)變量獲取和設(shè)置系統(tǒng)變量在MySQL服務(wù)器啟動(dòng)時(shí)就被引入并初始化為默認(rèn)值。例如:@@VERSION可獲得當(dāng)前使用的MySQL版本,像這樣的系統(tǒng)變量的值是不可以改變的。大多數(shù)的系統(tǒng)變量應(yīng)用于SQL語(yǔ)句中必須在名稱(chēng)前加兩個(gè)@符號(hào),而為了與其他SQL產(chǎn)品保持一致,某些特定的系統(tǒng)變量是要省略這@@符號(hào)的。如CURRENT_DATE(系統(tǒng)日期)、CURRENT_TIME(系統(tǒng)時(shí)間)、CURRENT_TIMESTAMP(系統(tǒng)時(shí)間戳)和CURRENT_USER(SQL用戶(hù)名)。例如:SELECT@@VERSION,CURRENT_TIME;顯示結(jié)果如圖7.4所示。變
量有些系統(tǒng)變量是可以通過(guò)SET語(yǔ)句來(lái)修改的:SET[GLOBAL|SESSION]系統(tǒng)變量名=表達(dá)式或者SET @@GLOBAL.|@@SESSION.系統(tǒng)變量名=表達(dá)式說(shuō)明:(1)系統(tǒng)變量名稱(chēng)前加GLOBAL關(guān)鍵字或“@@global.”前綴是全局系統(tǒng)變量;而指定了SESSION關(guān)鍵字或“@@session.”前綴的則為會(huì)話系統(tǒng)變量。SESSION還有一個(gè)同義詞LOCAL。如果在使用系統(tǒng)變量時(shí)不指定關(guān)鍵字,則默認(rèn)為會(huì)話系統(tǒng)變量。(2)表達(dá)式:要給變量賦的值,可以是常量、變量或它們通過(guò)運(yùn)算符組成的式子。(3)如果指定表達(dá)式為“DEFAULT”,則恢復(fù)為默認(rèn)值。(4)如果只能使用會(huì)話系統(tǒng)變量時(shí)設(shè)置為全局系統(tǒng)變量,或者只能使用全局系統(tǒng)變量時(shí)設(shè)置為會(huì)話系統(tǒng)變量,均會(huì)顯示出錯(cuò)信息。MySQL8新增了SETPERSIST命令:SET
PERSIST系統(tǒng)變量名=值;MySQL會(huì)將該命令的配置保存到數(shù)據(jù)目錄下的配置文件(f)中,下次啟動(dòng)時(shí)會(huì)讀取該文件,用其中的配置來(lái)覆蓋缺省的配置文件。變
量2)全局系統(tǒng)變量和會(huì)話系統(tǒng)變量(1)全局系統(tǒng)變量(指定GLOBAL):當(dāng)MySQL啟動(dòng)的時(shí)候,全局系統(tǒng)變量就被初始化了,并且應(yīng)用于此后每一個(gè)啟動(dòng)的會(huì)話。如果設(shè)置GLOBAL來(lái)系統(tǒng)變量(需要超級(jí)用戶(hù)權(quán)限),則該值被記住,并被用于新的連接,直到服務(wù)器重新啟動(dòng)為止。(2)會(huì)話系統(tǒng)變量只適用于當(dāng)前的會(huì)話。大多數(shù)會(huì)話系統(tǒng)變量的名字和全局系統(tǒng)變量的名字相同。當(dāng)啟動(dòng)會(huì)話的時(shí)候,默認(rèn)情況下每個(gè)會(huì)話系統(tǒng)變量都和同名的全局系統(tǒng)變量的值相同。一個(gè)會(huì)話系統(tǒng)變量的值是可以改變的,但是這個(gè)新的值僅適用于當(dāng)前正在運(yùn)行的會(huì)話。(3)若改變了全局系統(tǒng)變量的值,同名的會(huì)話系統(tǒng)變量的值也保持不變。變
量3)系統(tǒng)變量清單SHOWVARIABLES[LIKE條件] #顯示系統(tǒng)變量清單。SHOWGLOBALVARIABLES[LIKE條件] #顯示所有全局系統(tǒng)變量SHOWSESSIONVARIABLES[LIKE條件] #顯示所有會(huì)話系統(tǒng)變量例如:SHOWVARIABLES; #(a)SHOWGLOBALVARIABLESLIKE'table_%'; #(b)SHOWSESSIONVARIABLESLIKE'character_%’; #(c)說(shuō)明:(a)獲得所有系統(tǒng)變量清單,共601個(gè)。(b)獲得與特定模式匹配的系統(tǒng)變量清單,需使用LIKE子句,通配符為“%”。(c)獲得字符集會(huì)話系統(tǒng)變量清單。變
量2.用戶(hù)變量用戶(hù)自己定義的變量叫用戶(hù)變量,可在其中保存值,以后再引用它,這樣在一個(gè)會(huì)話中可以將值從一個(gè)語(yǔ)句傳遞到另一個(gè)語(yǔ)句。用戶(hù)變量可用下列語(yǔ)句定義和賦值:SET @變量名=表達(dá)式,...說(shuō)明:(1)變量名由當(dāng)前字符集的文字和數(shù)字字符、“.”、“_”和“$”組成。當(dāng)變量名中需要包含一些特殊符號(hào)(如空格、#等)時(shí),可以使用雙引號(hào)或單引號(hào)將整個(gè)變量括起來(lái)。@必須放在一個(gè)用戶(hù)變量的前面,以便將它和列名區(qū)分開(kāi)。(2)用戶(hù)變量的數(shù)據(jù)類(lèi)型取決于賦予它的表達(dá)式值。表達(dá)式可以是常量、已經(jīng)賦值的用戶(hù)變量或它們通過(guò)運(yùn)算符組成的式子,也可以是NULL值。(3)沒(méi)有初始化的用戶(hù)變量的值為NULL。變
量【例7.4】創(chuàng)建用戶(hù)變量及其表達(dá)式。SET@user1=1,@user2=@user1+1;SELECT@user1,@user2,@user3; #(a)SET@user2=@user1+1;SELECT@user1,@user2; #(b)運(yùn)行結(jié)果如圖7.5所示。
變
量(4)只有當(dāng)一個(gè)用戶(hù)變量已經(jīng)被創(chuàng)建并初始化后,它才可以用于其他SQL語(yǔ)句中,變量名前必須加上@符號(hào)。【例7.5】以“商品名稱(chēng)”作為中間變量查詢(xún)指定編號(hào)的商品信息。USEemarket;SET@cid='1A0101';SET@cname=(SELECT商品名稱(chēng)FROMcommodityWHERE商品編號(hào)=@cid);SELECT@cid,@cname; #(a)SELECT商品名稱(chēng),價(jià)格FROMcommodityWHERE商品編號(hào)=@cidINTO@cname,@cprice;SELECT@cid,@cname,@cprice; #(b)運(yùn)行結(jié)果如圖7.6所示。
說(shuō)明:(a)先查詢(xún)“商品編號(hào)等于用戶(hù)變量@cid('1A0101')值的“商品名稱(chēng)”存于用戶(hù)變量@cname中并顯示。這種方式SELECT的輸出項(xiàng)只能一個(gè),并且,查詢(xún)出的記錄最多只能一個(gè),因?yàn)樗荒艽娣乓粋€(gè)值。注意,SELECT語(yǔ)句需要括起來(lái)。(b)這種方式查詢(xún)的輸出項(xiàng)可以有多個(gè),但I(xiàn)NTO后面的項(xiàng)需要一一對(duì)應(yīng)。同時(shí),查詢(xún)出的記錄最多只能一個(gè),因?yàn)槊恳粋€(gè)用戶(hù)變量只能存放一個(gè)值。變
量(5)用其他語(yǔ)句代替SET語(yǔ)句來(lái)為用戶(hù)變量分配一個(gè)值,分配符必須為“:=”,而不能用“=”,因?yàn)樵诜荢ET語(yǔ)句中“=”被視為比較操作符。例如:SELECT@t2:=(@t2:=2)+5ASt2;(6)用戶(hù)變量可以用于存放數(shù)據(jù)庫(kù)的查詢(xún)結(jié)果。第7章
運(yùn)算符、表達(dá)式和系統(tǒng)函數(shù)——運(yùn)算符與表達(dá)式01賦值運(yùn)算符賦值運(yùn)算符因“=”只有在SET語(yǔ)句中才被作為賦值運(yùn)算符使用,其他上下文情形下都被視作等于比較運(yùn)算符,而“:=”則在任何合法的SQL語(yǔ)句中都是賦值運(yùn)算符,故實(shí)際應(yīng)用中要進(jìn)行賦值運(yùn)算,建議優(yōu)先采用“:=”形式?!纠?.6】賦值運(yùn)算符修改數(shù)據(jù)庫(kù)表列值。USEmydb;CREATETABLEtest(t1int);INSERTINTOtestVALUES(3),(5),(7);SELECT*FROMtest;SET@var1:=5;UPDATEtestSETt1=2WHEREt1=@var1;SELECT*FROMtest;02算術(shù)運(yùn)算符算術(shù)運(yùn)算符算術(shù)運(yùn)算符是用于數(shù)值型數(shù)據(jù)運(yùn)算的,常用的算術(shù)運(yùn)算符見(jiàn)表7.2。運(yùn)算符作用實(shí)例運(yùn)算符作用實(shí)例DIV整數(shù)除法7DIV2=3*乘法7*2=14/除法7/2=3.5-減法或負(fù)號(hào)-7-2=-9%,MOD取模運(yùn)算7%2=1+加法-7+2=-5(1)算術(shù)運(yùn)算符優(yōu)先級(jí):先算括號(hào)里面的;先負(fù)號(hào)(-),再*、/、DIV,然后%,最后+和-;同級(jí)從左到右。(2)DIV與/的區(qū)別是它會(huì)丟棄運(yùn)算結(jié)果的小數(shù)部分。(3)自動(dòng)將除法運(yùn)算結(jié)果規(guī)格化為固定位數(shù)的小數(shù),除數(shù)為零時(shí)會(huì)產(chǎn)生NULL結(jié)果。(4)不同進(jìn)制進(jìn)行算術(shù)運(yùn)算均轉(zhuǎn)換為十進(jìn)制。(5)數(shù)值字符串被當(dāng)成數(shù)值進(jìn)行運(yùn)算,字符串中含非數(shù)字字符,其前面部分?jǐn)?shù)字字符當(dāng)成數(shù)值。首字符為非數(shù)字,則作為0。例如:SELECT-7/2+1,7DIV2,7MOD2,(7%-2)+0.5*(-0.1),1/(7MOD2-1);#(a)SELECT0b01101+b'11',0x1E+'11',-b'01101'+21+x'1E',21-'3A'-'C3';#(b)算術(shù)運(yùn)算符運(yùn)行結(jié)果如圖7.7所示。說(shuō)明:(a)-7/2+1=-2.5:顯示-2.5000。如果顯示小數(shù)點(diǎn)后面2位數(shù)(-2.50),可以進(jìn)行格式控制。SELECTFORMAT(-7/2+1,2);(7%-2)+0.5*(-0.1):-2→(7%-2)=1,-0.1→0.5*(-0.1)=-0.05,1-0.05=0.95。1/(7MOD2-1):7MOD2=1,1-1=0,1/0=NULL。(b)0b01101+b'11':二進(jìn)制數(shù)值+二進(jìn)制串,作為二進(jìn)制數(shù)值計(jì)算。0x1E+'11':十六進(jìn)制數(shù)值+十進(jìn)制串,作為十進(jìn)制數(shù)值計(jì)算。-b'01101'+21+x'1E':二進(jìn)制串+十進(jìn)制數(shù)值+十六進(jìn)制串,作為十進(jìn)制數(shù)值計(jì)算。21-'3A'-'C3':十進(jìn)制數(shù)值-打頭含數(shù)字字符串-打頭不含數(shù)字字符串,按21-3-0=18。03比較運(yùn)算符1.等于(=)2.安全等于(<=>)3.不等于(<>或!=)4.小于等于(<=)5.小于(<)6.大于等于(>=)7.大于(>)比較運(yùn)算符比較運(yùn)算符用于操作數(shù)間的比較運(yùn)算,運(yùn)算的結(jié)果總是1、0或NULL。它經(jīng)常用在SELECT語(yǔ)句的WHERE子句中表達(dá)査詢(xún)條件。MySQL中的比較運(yùn)算符如表7.3所示。運(yùn)
算
符作
用運(yùn)
算
符作
用=等于<
小于<=>安全等于>=大于等于<>,!=不等于>
大于<=小于等于
1.等于(=)等于運(yùn)算符(=)用來(lái)判斷數(shù)字、字符串和表達(dá)式是否相等,如果相等返回值為1;否則返回值為0。等于運(yùn)算符比較時(shí)遵循如下規(guī)則:1)若兩個(gè)參數(shù)均為數(shù)值或者數(shù)值表達(dá)式,則按照數(shù)值進(jìn)行比較。例如:SET@t=5.001;SELECT1.0=1,@t=5+1e-3,0=1e-90;運(yùn)行結(jié)果如圖7.8所示。比較運(yùn)算符2)若用數(shù)值字符串和數(shù)字進(jìn)行比較,則自動(dòng)將字符串轉(zhuǎn)換為數(shù)字后用數(shù)值進(jìn)行比較。例如:SELECT'3'=3,'0.0'=0,'0.05'=5e-2,0.05='5e-2','0.05'='5e-2';運(yùn)行結(jié)果如圖7.9所示。其中,因?yàn)閮蛇叾际亲址?,科學(xué)計(jì)數(shù)法表示的數(shù)值5e-2就不會(huì)轉(zhuǎn)換為數(shù)值,而是直接進(jìn)行字符串比較。用全角數(shù)值字符串和數(shù)字進(jìn)行比較,也會(huì)先轉(zhuǎn)換成對(duì)應(yīng)數(shù)值然后比較。例如:SET@4=3.14159;SELECT3.1416<'4',3.1416<@4;運(yùn)行結(jié)果如圖7.10所示。比較運(yùn)算符3)用非數(shù)值字符串和數(shù)字進(jìn)行比較,字符串轉(zhuǎn)換為0,然后進(jìn)行比較。例如:SET@π=3.14159;SELECT3.14<'π',3.14<@π,'A'=0;運(yùn)行結(jié)果如圖7.11所示。4)若兩個(gè)都是(單引號(hào)或雙引號(hào)括起)字符串,則按照字符串進(jìn)行比較。只有字符串順序和個(gè)數(shù)完全相同,字符串才相等。注意,空格也是字符。例如:SELECT"he"='he','he'=LEFT('he',1)+'e','H'='h','he'='h','h'='h';運(yùn)行結(jié)果如圖7.12所示。比較運(yùn)算符5)ASCII碼字符在不同的字符集中存儲(chǔ)的代碼是相同的,中文在不同的中文字符集中存儲(chǔ)的代碼是相同的,但在中文字符集和其他非中文字符集代碼是不同的。例如:SELECT_utf8'he'=_gbk'he',_utf8'漢'=_gbk'漢';SELECT'he'=N'he',_gbk'漢'=N'漢';運(yùn)行結(jié)果如圖7.13所示。
比較運(yùn)算符6)大小寫(xiě)字符是否相等取決于當(dāng)前字符排序規(guī)則?!纠?.7】大小寫(xiě)字符串比較和字符排序規(guī)則。(1)顯示當(dāng)前字符排序規(guī)則SHOWVARIABLESLIKE'COLLATION_%';運(yùn)行結(jié)果如圖7.14所示。其中,collation打頭描述各種排序規(guī)則,Value中的“ci”表示不區(qū)分大小寫(xiě)。(2)字符比較SELECT'ABC'='abc','ABC'=_utf8mb4'abc'COLLATEutf8mb4_0900_as_cs;運(yùn)行結(jié)果如圖7.15所示。比較運(yùn)算符7)元組比較兩項(xiàng)對(duì)應(yīng)列的數(shù)據(jù)項(xiàng)是否相等?!纠?.8】元組相等比較。SELECT('1A','蘋(píng)果')=('1B','梨'), ('1A','蘋(píng)果')=('1A','梨'),('1A','蘋(píng)果')=('1A','蘋(píng)果');運(yùn)行結(jié)果如圖7.16所示。說(shuō)明:第1項(xiàng):第1列'1A'與'1B'不等,結(jié)果為假。第2項(xiàng):因?yàn)榈?列相等,單第2列'蘋(píng)果'和'梨'不等,結(jié)果為假。第3項(xiàng):因?yàn)榈?列和第2列均相等,結(jié)果為真。比較運(yùn)算符8)若有一個(gè)或兩個(gè)參數(shù)為NULL,則比較運(yùn)算的結(jié)果為NULL。例如:SELECT''=NULL,NULL=NULL;運(yùn)行結(jié)果如圖7.17所示。9)半角字符和全角字符是不相等的。在GB2312-80編碼中鍵盤(pán)上出現(xiàn)的可以打印的字符均有編碼,這些字符就跟漢字一樣。GB2312內(nèi)碼兼容ASCII碼,因?yàn)锳SCII每一個(gè)字節(jié)的最高位為0,稱(chēng)為半角字符;漢字每一個(gè)字節(jié)的最高位為1,不是真正的漢字的符號(hào)稱(chēng)為全角字符。所以半角字符和全角字符是不相等的,而且半角字符<全角字符。GBK編碼是GB2312-80的擴(kuò)展。比較運(yùn)算符【例7.9】半角字符和全角字符比較。SETcharacter_set_client=utf8;SELECT'a'='A','a'<_gbk'A'; #(a)SETcharacter_set_client=gbk;SELECT@@character_set_system; #(b)SELECT'a'='A','a'<'A'; #(c)運(yùn)行結(jié)果如圖7.18所示。
說(shuō)明:(a)客戶(hù)端字符集character_set_client為utf8,對(duì)應(yīng)默認(rèn)排序規(guī)則不區(qū)分大小寫(xiě)。全角字符'A'轉(zhuǎn)換為半角字符'A'后與半角字符'a'相等。而gbk'A'就是全角字符'A',與半角字符'a'當(dāng)然不等,而且全角字符'A'編碼大于半角字符'a'。(b)設(shè)置客戶(hù)端字符集character_set_client為gbk,對(duì)應(yīng)默認(rèn)排序規(guī)則區(qū)分大小寫(xiě),當(dāng)前默認(rèn)的character_set_system字符集為utf8。(c)字符集gbk區(qū)分大小寫(xiě),'A'是全角字符與半角字符'a'當(dāng)然不等,而且全角字符'A'編碼大于半角字符'a'。比較運(yùn)算符2.安全等于(<=>)在兩個(gè)操作數(shù)均為NULL時(shí),其返回值為1,否則返回值為0。除此之外,它與普通等于運(yùn)算符(=)作用完全相同。例如:SELECT3<=>ABS(-3),''<=>NULL,NULL<=>NULL,0<=>NULL;運(yùn)行結(jié)果如圖7.19所示。3.不等于(<>或!=)不等于運(yùn)算符(<>或!=)用于數(shù)字、字符串、表達(dá)式不相等的判斷,如果不相等就返回值1,否則返回0。對(duì)于元組(a,b)<=(x,y)比較,只要有一個(gè)數(shù)據(jù)項(xiàng)不同,結(jié)果就為1。比較運(yùn)算符4.小于等于(<=)如果左邊的操作數(shù)小于等于右邊的操作數(shù),返回值為1;否則返回值為0。對(duì)于元組(a,b)<=(x,y)比較,等效于:(a<x)OR((a=x)AND(b<=y))例如:SELECT('1A','orange')<=('1C','apple'),('1C','orange')<=('1C','apple');運(yùn)行結(jié)果如圖7.20所示。說(shuō)明:第一項(xiàng):因?yàn)榈?列'1A'<'1C',故無(wú)須看第2列,直接返回1。第二項(xiàng):第1列相等(都是“'1C'”),因'orange'>'apple'(字符o大于a),故返回0。比較運(yùn)算符5.小于(<)小于運(yùn)算符(<)用來(lái)判斷左邊的操作數(shù)是否小于右邊的操作數(shù):如果小于,返回值為1;否則返回值為0。對(duì)于元組(a,b)<(x,y)等效于:(a<x)OR((a=x)AND(b<y))6.大于等于(>=)大于等于運(yùn)算符(>=)用來(lái)判斷左邊的操作數(shù)是否大于等于右邊的操作數(shù):如果大于等于,返回值為1;否則返回值為0。該運(yùn)算符不能用于判斷空值。對(duì)于元組(a,b)>=(x,y)等效于:(a>x)OR((a=x)AND(b>=y))7.大于(>)大于運(yùn)算符(>)用來(lái)判斷左邊的操作數(shù)是否大于右邊的操作數(shù):如果大于,返回值為1;否則返回值為0。該運(yùn)算符不能用于判斷空值。對(duì)于元組(a,b)>(x,y)等效于:(a>x)OR((a=x)AND(b>y))04判斷運(yùn)算符1.ISNULL(ISNULL)和ISNOTNULL2.值是否在范圍內(nèi):BETWEEN...AND...3.值是否在其中:IN、NOTIN判斷運(yùn)算符1.ISNULL(ISNULL)和ISNOTNULL表達(dá)式ISNULL表達(dá)式ISNULL表達(dá)式ISNOTNULL“表達(dá)式ISNULL”或者“表達(dá)式ISNULL”中表達(dá)式的值為NULL,返回值為1,否則返回值為0?!氨磉_(dá)式ISNOTNULL”中表達(dá)式的值非空,返回值為1,否則返回值為0。ISNULL(表達(dá)式):系統(tǒng)函數(shù)ISNULL(表達(dá)式)與“表達(dá)式ISNULL”功能相同。例如:SELECTNULLISNULL,ISNULL(100/(2-2)), (''=NULL)ISNOTNULL,(NULL=NULL)ISNOTNULL;運(yùn)行結(jié)果如圖7.21所示。說(shuō)明:(1)表達(dá)式“100/(2-2)”除數(shù)為0,結(jié)果為NULL。(2)“(''=NULL)”和“(NULL=NULL)”皆為空值。(3)ISNULL和ISNULL的作用相同,而ISNULL和ISNOTNULL的返回值正好相反。判斷運(yùn)算符2.值是否在范圍內(nèi):BETWEEN...AND...表達(dá)式BETWEEN最小值A(chǔ)ND最大值作用等同于:最小值<=
表達(dá)式AND
表達(dá)式<=
最大值即,如果表達(dá)式值大于或等于最小值且小于或等于最大值,則返回1;否則返回0?!纠?.10】表達(dá)式值范圍判斷。(1)數(shù)值表達(dá)式范圍判斷SET@x=-1;SELECT@xBETWEEN-2AND0,@x+1BETWEEN0AND2,ABS(@x)BETWEEN-2AND0;運(yùn)行結(jié)果如圖7.22所示。判斷運(yùn)算符(2)字符串范圍判斷SET@x='hello';SELECT @xBETWEEN'A'AND'Z', #(a) @xBETWEEN'hel'AND'help', #(b) @xBETWEEN'good'AND'你好', #(c) @xBETWEEN'HELLO'AND'hello', #(d) @xBETWEEN'z'AND'a'; #(e)運(yùn)行結(jié)果如圖7.23所示。說(shuō)明:(a)不區(qū)分大小寫(xiě)。(b)''<'lo','l'<'p'。(c)'g'<'h','h'<'你'。(d)'H'<='h','h'>''。(e)'z'>'h','h'>'a'。判斷運(yùn)算符3.值是否在其中:IN、NOTIN值IN(值1,值2,...,值n)值NOTIN(值1,值2,...,值n)IN運(yùn)算符用來(lái)判斷操作數(shù)是否為IN列表中的其中一個(gè)值:如果是,返回值為1;否則返回值為0。NOTIN運(yùn)算符則正好相反。(1)數(shù)值和字符串符合等于比較(=)條件,IN條件才為真。例如:SET@x=-3;SELECT3.14IN(ABS(@x)+0.14),3.14IN(3,3.14159,'π'),'fruit'NOTIN('fish','fruit','apple','orange');運(yùn)行結(jié)果如圖7.24所示。判斷運(yùn)算符(2)在“值IN(…)”值為NULL的情況下,即使(…)中存在NULL值,IN的返回值均為NULL。例如:SELECTNULLIN(2,3,5,NULL);運(yùn)行結(jié)果如圖7.25所示。值非NULL,但(…)中找不到匹配項(xiàng)并且包含NULL,IN的返回值均為NULL。但是,在已經(jīng)找到匹配項(xiàng)的情況下,即使(…)中存在NULL值,也能正常返回1。SELECT'3.14'IN(0,3.14159,NULL),3.14IN(3,3.14,NULL);運(yùn)行結(jié)果如圖7.26所示。判斷運(yùn)算符(3)“值IN(…)”值盡量避免依賴(lài)IN列表中值的隱式類(lèi)型轉(zhuǎn)換,因?yàn)榭赡軙?huì)產(chǎn)生非直觀的結(jié)果而給實(shí)際使用帶來(lái)麻煩。SELECT'a'IN(0),0IN('b');運(yùn)行結(jié)果如圖7.27所示。(4)IN、NOTIN還可以用于元組比較。例如:SELECT(7,5)IN((2,3),(5,7)),('1A','蘋(píng)果','洛川')NOTIN(('1B','梨','碭山'),('1A','蘋(píng)果','煙臺(tái)'));運(yùn)行結(jié)果如圖7.28所示。05字符串匹配1.字符串通配符匹配:LIKE2字符串是否匹配正則表達(dá)式規(guī)范:REGEXP字符串匹配1.字符串通配符匹配:LIKE表達(dá)式LIKE匹配條件如果表達(dá)式滿足匹配條件,返回值為1;如果不匹配,則返回0。表達(dá)式或匹配條件中任何一個(gè)為空,則結(jié)果為NULL??梢允褂孟旅鎯煞N通配符。'%':匹配任何數(shù)目的字符,甚至包括''字符。'_':只能匹配一個(gè)字符。例如:SELECT'Tyson/泰森雞胸肉'LIKE'Tyson______', #(a)結(jié)果:1'Tyson/泰森雞胸肉'LIKE'Tyson%'; #(b)結(jié)果:1說(shuō)明:(a)'Tyson______'(6個(gè)'_'連)表示匹配以'Tyson'開(kāi)頭后跟6個(gè)字符長(zhǎng)度的字符串,而“/泰森雞胸肉”正好是6個(gè)字符,滿足匹配條件,匹配成功返回1。(b)'Tyson%'表示匹配以字符串'Tyson'開(kāi)頭的字符串,“Tyson/泰森雞胸肉”滿足匹配條件,也返回1。只要以“Tyson”打頭后面有沒(méi)有字符有多少字符均滿足條件。字符串匹配【例7.11】字符串通配符匹配測(cè)試。SELECT'character_set_client'LIKE'%set_client’; #(a)結(jié)果:1SELECT'character_set_client'LIKE'%set\_client’; #(b)結(jié)果:1SELECT'character_set\_client'LIKE'%set\_client’; #(c)結(jié)果:0SELECT'Tyson/泰森雞胸肉'LIKE'%__雞胸肉'; #(d)結(jié)果:1說(shuō)明:(a)'character_set_client'中“_”均為字符串內(nèi)容,'%set_client'中的“%”和“_”均為匹配描述字符。(b)'%set\_client'中的“\_”為1個(gè)內(nèi)容描述字符“_”轉(zhuǎn)義字符。(c)'character_set\_client'中的“\_”為2個(gè)內(nèi)容描述字符,'%set\_client'的“\_”中的“\”是內(nèi)容描述字符,而“_”是匹配描述字符。(d)'%__雞胸肉'中是1個(gè)“%”匹配描述字符和2個(gè)“_”匹配描述字符。字符串匹配2.字符串是否匹配正則表達(dá)式規(guī)范:REGEXP通過(guò)正則表達(dá)式可實(shí)現(xiàn)更復(fù)雜的字符串匹配。表達(dá)式REGEXP匹配條件如果表達(dá)式滿足匹配條件,返回1;如果不滿足,則返回0。若表達(dá)式或匹配條件任意一個(gè)為空,則結(jié)果為NULL。REGEXP運(yùn)算符在進(jìn)行匹配時(shí),常用的有下面幾種通配符:(1)'^':匹配以該字符后面的字符開(kāi)頭的字符串。(2)'$':匹配以該字符后面的字符結(jié)尾的字符串。(3)'.':匹配任何一個(gè)單字符。(4)'[...]':匹配在方括號(hào)內(nèi)的任何字符,例如,[abc]匹配'a'、'b'或'c'。為了命名字符的范圍,使用一個(gè)“-'”,例如,[a-z]匹配任何字母,而[0-9]匹配任何數(shù)字。字符串匹配(5)'*':匹配零個(gè)或多個(gè)在它前面的字符,例如,'x*'匹配任何數(shù)量的'x'字符,'[0-9]*'匹配任何數(shù)量的數(shù)字,而'*'匹配任何數(shù)量的任何字符。例如:ELECT'mysql'REGEXP'^m','mysql'REGEXP'l$','mysql'REGEXP'm.sql'; #(a)SELECT'mysql'REGEXP'[a-k]','mysql'REGEXP'[l-z]'; #(b)運(yùn)行結(jié)果如圖7.29所示。06邏輯運(yùn)算符和位運(yùn)算符1.邏輯運(yùn)算符2.位邏輯運(yùn)算符和位移動(dòng)運(yùn)算符邏輯運(yùn)算符和位運(yùn)算符1.邏輯運(yùn)算符邏輯運(yùn)算符用于對(duì)操作數(shù)整體進(jìn)行邏輯操作,如表7.4所示。運(yùn)算符作
用邏輯運(yùn)算表(真:1或者TRUE,假:0或者FALSE)NOT,!邏輯非NOT0=1,NOT1=0,NOTNULL=NULLAND,&&邏輯與0AND0=0,0AND1=0,1AND0=0,1AND1=1,xANDNULL=NULLOR,||邏輯或0OR0=0,0OR1=1,1OR0=1,1OR1=1,1ORNULL=1,0ORNULL=NULLXOR邏輯異或0XOR0=0,0XOR1=1,1XOR0=1,1XOR1=0,xXORNULL=NULL說(shuō)明:(1)將所有非零數(shù)值(例如-98)、數(shù)字打頭的字符串都看作是1(TRUE),而非數(shù)字(例如'Apple蘋(píng)果')的字符串則看作是0(FALSE)。(2)從MySQL8.0.17開(kāi)始,不推薦使用!、&&、||符號(hào),因它們均為軟件開(kāi)發(fā)商定義擴(kuò)展的邏輯運(yùn)算符,在將來(lái)的MySQL版本中將刪除對(duì)它們的支持。故應(yīng)將應(yīng)用程序中使用的!、&&、||符號(hào)調(diào)整為標(biāo)準(zhǔn)SQL的NOT、AND和OR符號(hào)。例如:SELECTNOT-98,NOT0,!NULL,!'Apple蘋(píng)果',!FALSE,NOT'1';運(yùn)行結(jié)果如圖7.30所示。邏輯運(yùn)算符和位運(yùn)算符【例7.12】邏輯運(yùn)算符測(cè)試。SET@x=0;SELECT@x+1ANDTRUE,'@x-0.98'AND@x+1,1&&NULL; #(a)SELECT@xORTRUE,@x=1OR'@x',1ORNULL; #(b)SELECT@x-1XORFALSE,'-0.98+x'XORTRUE,1XORNULL; #(c)運(yùn)行結(jié)果如圖7.31所示。
邏輯運(yùn)算符和位運(yùn)算符2.位邏輯運(yùn)算符和位移動(dòng)運(yùn)算符位運(yùn)算符是在二進(jìn)制數(shù)上進(jìn)行計(jì)算的運(yùn)算符,它先將操作數(shù)變成二進(jìn)制數(shù),然后進(jìn)行位運(yùn)算,最后將計(jì)算結(jié)果從二進(jìn)制變回十進(jìn)制。MySQL的位運(yùn)算符見(jiàn)表7.5。運(yùn)算符作
用實(shí)例:x=0b01010011=83y=0b00001111=15~按位取反~x=0b10101100=&按位與x&y=0b00000011=3|按位或x|y=0b01011111=95^按位異或x^y=0b01011100=92<<
左移y<<2=ob00111100=60>>
右移y>>2=0b00000011=3邏輯運(yùn)算符和位運(yùn)算符【例7.13】位邏輯運(yùn)算符和位移動(dòng)運(yùn)算符測(cè)試。SET@x=83;SET@y=15;SELECT~0-~@x,@x&@y,@x|@y,@x^@y,@y<<2,@y>>2;運(yùn)行結(jié)果如圖7.32所示。07表達(dá)式和運(yùn)算符的優(yōu)先級(jí)1.表達(dá)式2.運(yùn)算符的優(yōu)先級(jí)表達(dá)式和運(yùn)算符的優(yōu)先級(jí)1.表達(dá)式所謂“表達(dá)式”就是操作數(shù)(包括常量和變量)、列名函數(shù)通過(guò)運(yùn)算符進(jìn)行有機(jī)組合的式子。例如,下列SELECT語(yǔ)句顯示項(xiàng)均為表達(dá)式:SET@x=7; #(a)SELECT(@x%-2)+0.5*(-0.1); #(b)SELECT3.14IN(ABS(@x)+0.14); #(c)SELECT'mysql'REGEXP'[a-k]'; #(d)說(shuō)明:(a)賦值表達(dá)式。(b)算術(shù)表達(dá)式。(c)算術(shù)表達(dá)式。(d)字符串匹配邏輯表達(dá)式。表達(dá)式和運(yùn)算符的優(yōu)先級(jí)又例如,操作數(shù)據(jù)庫(kù)表SQL語(yǔ)句表達(dá)式:USEemarket;CREATETABLEuser( ...
手機(jī)號(hào) char(11) NOTNULL UNIQUECHECK(LENGTH(TRIM(手機(jī)號(hào)))=11ANDLEFT(手機(jī)號(hào),1)='1'), #(a) ... CHECK(YEAR(有效期)-CONVERT(SUBSTR(身份證號(hào),7,4),UNSIGNED)>=20) #(b));SELECT...FROMcommodityWHERE商品編號(hào)<'3'AND價(jià)格>=100; #(c)UPDATE... SETcommodity_new.價(jià)格=commodity_new.價(jià)格-10 #(d) WHEREcommodity_temp.原價(jià)-commodity_new.價(jià)格<15ANDcommodity_new.商品編號(hào)=commodity_temp.商品編號(hào); #(e)說(shuō)明:(a)字符串表達(dá)式、比較表達(dá)式、邏輯表達(dá)式。(b)字符串表達(dá)式、算術(shù)表達(dá)式、比較表達(dá)式。(c)比較表達(dá)式、邏輯表達(dá)式。(d)算術(shù)表達(dá)式、賦值表達(dá)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 艾滋病預(yù)防知識(shí)調(diào)查報(bào)告
- 特應(yīng)性皮炎治療指南2024
- 膽道蛔蟲(chóng)病護(hù)理查房
- 小班防疫安全消息
- 大班科學(xué)活動(dòng)找種子
- 青春期畢業(yè)晚會(huì)
- 別說(shuō)我小教案及反思
- 化學(xué)反應(yīng)速率與限度說(shuō)課稿
- 紅綠燈說(shuō)課稿中班
- 汽車(chē)4S店元旦活動(dòng)
- 變頻電機(jī)參數(shù)規(guī)格-YP2
- 廈門(mén)廚余垃圾現(xiàn)狀
- 煤礦建設(shè)工程施工技術(shù)資料
- 科技創(chuàng)新政策解讀PPT課件
- 面試信息登記表
- 讀秀學(xué)術(shù)搜索平臺(tái)PPT課件
- 市質(zhì)量獎(jiǎng)中層領(lǐng)導(dǎo)座談會(huì)準(zhǔn)備的問(wèn)題
- 優(yōu)秀學(xué)生寢室獎(jiǎng)勵(lì)制度
- 動(dòng)畫(huà)運(yùn)動(dòng)規(guī)律自然現(xiàn)象
- 液壓設(shè)計(jì)常用資料密封溝槽尺寸
- AQL抽樣檢驗(yàn)表(最新版本)
評(píng)論
0/150
提交評(píng)論