MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第7-9章 運算符、表達式和系統(tǒng)函數(shù);查詢、視圖和索引;過程式對象程序設計_第1頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第7-9章 運算符、表達式和系統(tǒng)函數(shù);查詢、視圖和索引;過程式對象程序設計_第2頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第7-9章 運算符、表達式和系統(tǒng)函數(shù);查詢、視圖和索引;過程式對象程序設計_第3頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第7-9章 運算符、表達式和系統(tǒng)函數(shù);查詢、視圖和索引;過程式對象程序設計_第4頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第7-9章 運算符、表達式和系統(tǒng)函數(shù);查詢、視圖和索引;過程式對象程序設計_第5頁
已閱讀5頁,還剩368頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章

運算符、表達式和系統(tǒng)函數(shù)——常量和變量MySQL+實用教程(第4版)01常

量1.數(shù)值常量2.字符串常量3.日期時間常量4.布爾值5.NULL值常

量1.數(shù)值常量(1)十進制數(shù)常量十進制數(shù)常量分為整數(shù)常量和浮點數(shù)常量,整數(shù)常量即不帶小數(shù)點的十進制數(shù),浮點數(shù)常量是使用小數(shù)點的數(shù)值常量。(2)非十進制數(shù)常量非十進制數(shù)常量包括b(B)二進制表示和x(X)十六進制表示,它們只能表示整數(shù)。有兩種表示方式,一種是以0打頭,在進制表示符后跟進制數(shù);另一種以進制表示符打頭后跟進制數(shù)字符串,但十六進制數(shù)字需要雙數(shù)。常

量【例7.1】十進制數(shù)常量表示和顯示。SELECT1894,-2,+145345234,-2147483648; #(a)整數(shù)常量SELECT5.26,1.39,101.5E5,0.5E-2; #(b)小數(shù)常量、浮點數(shù)常量SELECT152+5.26,78+0.5E-2; #(c)浮點數(shù)常量運算SELECT0b1000001,b'1000011',0x4142,x'4344’; #(d)二進制十六進制常量運行結果如圖7.1所示。

量2.字符串常量字符串常量可以用引號括起來,也可以通過十六進制表達。(1)一般字符串常量一般字符串常量用單引號括起來,例如:'你好,Howareyou!'。其中,ASCII字符用一個字節(jié)存儲,中文用2個字節(jié)存儲。(2)Unicode字符串常量Unicode字符串常量前面有一個N標志符,代表SQL-92標準的國際語言(NationalLanguage),用單引號括起字符串。例如:N'你好,Howareyou!'。其中,每個字符(中文或者英文)用兩個字節(jié)存儲。常

量(3)字符串中特殊的字符表示在字符串中不僅可以使用普通的字符,也可使用幾個轉義序列來表示特殊的字符,見表7.1。每個轉義序列以一個反斜杠(“\”)開始。序

列含

義\0一個ASCII零值字節(jié)(NUL)字符\n一個回車符\r一個換行符(Windows中使用\r\n作為新行標志)\t一個定位符\b一個退格符\Z一個ASCII為26字符(Ctrl+Z)\'一個單引號(“'”)\"一個雙引號(“"”)\\一個反斜線(“\”)\%一個“%”符,用于在正文中搜索包含“%”字符,否則“%”將解釋為一個通配符。\_一個“_”符,用于在正文中搜索包含“_”字符,否則“_”將解釋為一個通配符。常

量(4)字符串中包含引號字符字符串內包含單引號('),字符串需要用雙引號("),否則需要用轉義字符(\')表示單引號;字符串內包含雙引號("),字符串需要用單引號('),否則需要用轉義字符(\")表示雙引號。(5)十六進制、二進制表示字符串每對(即2個)十六進制數(shù)字被轉換為一個字符,不區(qū)分大小寫。例如:0x4142和x'4142'表示字符串“AB”,x'4D7953514C'表示字符串“MySQL”。每8位(1個字節(jié))二進制數(shù)字被轉換為一個字符。例如:0b01000001表示字符“A”,b'0100000101000010'表示字符串“AB”。在輸出顯示時,十六進制和二進制表示被默認為表達字符,而在參與算術運算時則被認為是表達數(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)運行結果如圖7.2所示。

量3.日期時間常量滿足日期時間要求的字符串它當然本身就是字符串,但當用于日期時間位置、符合日期時間格式要求并且有效時,就會被看成是日期時間常量。日期型常量包括年、月、日,如“2021-06-17”格式。時間型常量包括小時數(shù)、分鐘數(shù)、秒數(shù)及微秒數(shù),如“12:30:43.00013”格式。日期時間型常量是日期時間組合,如“2021-06-1712:30:43”。注意,MySQL是按“年-月-日”的順序表示日期的,中間的間隔符“-”也可以使用如“\”、“@”或“%”等特殊符號。此外,日期時間常量必須有效,如'2021-02-31'的字符串就是錯誤的日期時間常量?!纠?.3】日期、時間常量的表達顯示與當前日期、時間獲得和顯示。SELECT'2021-06-17',CURDATE(); #(a)日期和當前日期SELECT'12:30:43.00013',CURTIME(); #(b)時間和當前時間SELECT'2021-06-1712:30:43',NOW(); #(c)日期時間和當前日期時間運行結果如圖7.3所示。

量4.布爾值布爾值只包含兩個可能的值:TRUE和FALSE。TRUE的數(shù)字值為1,F(xiàn)ALSE的數(shù)字值為0。5.NULL值NULL值可適用于各種列類型,它通常用來表示“沒有值”、“無數(shù)據(jù)”等含義,并且不同于數(shù)字類型(0),或字符串類型的空字符串('')。02變

量1.系統(tǒng)變量2.用戶變量變

量1.系統(tǒng)變量MySQL有一些特定的設置,例如,有些定義數(shù)據(jù)如何被存儲,有些影響到處理速度,還有些與日期有關,這些設置就是系統(tǒng)變量。1)系統(tǒng)變量獲取和設置系統(tǒng)變量在MySQL服務器啟動時就被引入并初始化為默認值。例如:@@VERSION可獲得當前使用的MySQL版本,像這樣的系統(tǒng)變量的值是不可以改變的。大多數(shù)的系統(tǒng)變量應用于SQL語句中必須在名稱前加兩個@符號,而為了與其他SQL產(chǎn)品保持一致,某些特定的系統(tǒng)變量是要省略這@@符號的。如CURRENT_DATE(系統(tǒng)日期)、CURRENT_TIME(系統(tǒng)時間)、CURRENT_TIMESTAMP(系統(tǒng)時間戳)和CURRENT_USER(SQL用戶名)。例如:SELECT@@VERSION,CURRENT_TIME;顯示結果如圖7.4所示。變

量有些系統(tǒng)變量是可以通過SET語句來修改的:SET[GLOBAL|SESSION]系統(tǒng)變量名=表達式或者SET @@GLOBAL.|@@SESSION.系統(tǒng)變量名=表達式說明:(1)系統(tǒng)變量名稱前加GLOBAL關鍵字或“@@global.”前綴是全局系統(tǒng)變量;而指定了SESSION關鍵字或“@@session.”前綴的則為會話系統(tǒng)變量。SESSION還有一個同義詞LOCAL。如果在使用系統(tǒng)變量時不指定關鍵字,則默認為會話系統(tǒng)變量。(2)表達式:要給變量賦的值,可以是常量、變量或它們通過運算符組成的式子。(3)如果指定表達式為“DEFAULT”,則恢復為默認值。(4)如果只能使用會話系統(tǒng)變量時設置為全局系統(tǒng)變量,或者只能使用全局系統(tǒng)變量時設置為會話系統(tǒng)變量,均會顯示出錯信息。MySQL8新增了SETPERSIST命令:SET

PERSIST系統(tǒng)變量名=值;MySQL會將該命令的配置保存到數(shù)據(jù)目錄下的配置文件(f)中,下次啟動時會讀取該文件,用其中的配置來覆蓋缺省的配置文件。變

量2)全局系統(tǒng)變量和會話系統(tǒng)變量(1)全局系統(tǒng)變量(指定GLOBAL):當MySQL啟動的時候,全局系統(tǒng)變量就被初始化了,并且應用于此后每一個啟動的會話。如果設置GLOBAL來系統(tǒng)變量(需要超級用戶權限),則該值被記住,并被用于新的連接,直到服務器重新啟動為止。(2)會話系統(tǒng)變量只適用于當前的會話。大多數(shù)會話系統(tǒng)變量的名字和全局系統(tǒng)變量的名字相同。當啟動會話的時候,默認情況下每個會話系統(tǒng)變量都和同名的全局系統(tǒng)變量的值相同。一個會話系統(tǒng)變量的值是可以改變的,但是這個新的值僅適用于當前正在運行的會話。(3)若改變了全局系統(tǒng)變量的值,同名的會話系統(tǒng)變量的值也保持不變。變

量3)系統(tǒng)變量清單SHOWVARIABLES[LIKE條件] #顯示系統(tǒng)變量清單。SHOWGLOBALVARIABLES[LIKE條件] #顯示所有全局系統(tǒng)變量SHOWSESSIONVARIABLES[LIKE條件] #顯示所有會話系統(tǒng)變量例如:SHOWVARIABLES; #(a)SHOWGLOBALVARIABLESLIKE'table_%'; #(b)SHOWSESSIONVARIABLESLIKE'character_%’; #(c)說明:(a)獲得所有系統(tǒng)變量清單,共601個。(b)獲得與特定模式匹配的系統(tǒng)變量清單,需使用LIKE子句,通配符為“%”。(c)獲得字符集會話系統(tǒng)變量清單。變

量2.用戶變量用戶自己定義的變量叫用戶變量,可在其中保存值,以后再引用它,這樣在一個會話中可以將值從一個語句傳遞到另一個語句。用戶變量可用下列語句定義和賦值:SET @變量名=表達式,...說明:(1)變量名由當前字符集的文字和數(shù)字字符、“.”、“_”和“$”組成。當變量名中需要包含一些特殊符號(如空格、#等)時,可以使用雙引號或單引號將整個變量括起來。@必須放在一個用戶變量的前面,以便將它和列名區(qū)分開。(2)用戶變量的數(shù)據(jù)類型取決于賦予它的表達式值。表達式可以是常量、已經(jīng)賦值的用戶變量或它們通過運算符組成的式子,也可以是NULL值。(3)沒有初始化的用戶變量的值為NULL。變

量【例7.4】創(chuàng)建用戶變量及其表達式。SET@user1=1,@user2=@user1+1;SELECT@user1,@user2,@user3; #(a)SET@user2=@user1+1;SELECT@user1,@user2; #(b)運行結果如圖7.5所示。

量(4)只有當一個用戶變量已經(jīng)被創(chuàng)建并初始化后,它才可以用于其他SQL語句中,變量名前必須加上@符號。【例7.5】以“商品名稱”作為中間變量查詢指定編號的商品信息。USEemarket;SET@cid='1A0101';SET@cname=(SELECT商品名稱FROMcommodityWHERE商品編號=@cid);SELECT@cid,@cname; #(a)SELECT商品名稱,價格FROMcommodityWHERE商品編號=@cidINTO@cname,@cprice;SELECT@cid,@cname,@cprice; #(b)運行結果如圖7.6所示。

說明:(a)先查詢“商品編號等于用戶變量@cid('1A0101')值的“商品名稱”存于用戶變量@cname中并顯示。這種方式SELECT的輸出項只能一個,并且,查詢出的記錄最多只能一個,因為它只能存放一個值。注意,SELECT語句需要括起來。(b)這種方式查詢的輸出項可以有多個,但INTO后面的項需要一一對應。同時,查詢出的記錄最多只能一個,因為每一個用戶變量只能存放一個值。變

量(5)用其他語句代替SET語句來為用戶變量分配一個值,分配符必須為“:=”,而不能用“=”,因為在非SET語句中“=”被視為比較操作符。例如:SELECT@t2:=(@t2:=2)+5ASt2;(6)用戶變量可以用于存放數(shù)據(jù)庫的查詢結果。第7章

運算符、表達式和系統(tǒng)函數(shù)——運算符與表達式01賦值運算符賦值運算符因“=”只有在SET語句中才被作為賦值運算符使用,其他上下文情形下都被視作等于比較運算符,而“:=”則在任何合法的SQL語句中都是賦值運算符,故實際應用中要進行賦值運算,建議優(yōu)先采用“:=”形式?!纠?.6】賦值運算符修改數(shù)據(jù)庫表列值。USEmydb;CREATETABLEtest(t1int);INSERTINTOtestVALUES(3),(5),(7);SELECT*FROMtest;SET@var1:=5;UPDATEtestSETt1=2WHEREt1=@var1;SELECT*FROMtest;02算術運算符算術運算符算術運算符是用于數(shù)值型數(shù)據(jù)運算的,常用的算術運算符見表7.2。運算符作用實例運算符作用實例DIV整數(shù)除法7DIV2=3*乘法7*2=14/除法7/2=3.5-減法或負號-7-2=-9%,MOD取模運算7%2=1+加法-7+2=-5(1)算術運算符優(yōu)先級:先算括號里面的;先負號(-),再*、/、DIV,然后%,最后+和-;同級從左到右。(2)DIV與/的區(qū)別是它會丟棄運算結果的小數(shù)部分。(3)自動將除法運算結果規(guī)格化為固定位數(shù)的小數(shù),除數(shù)為零時會產(chǎn)生NULL結果。(4)不同進制進行算術運算均轉換為十進制。(5)數(shù)值字符串被當成數(shù)值進行運算,字符串中含非數(shù)字字符,其前面部分數(shù)字字符當成數(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)算術運算符運行結果如圖7.7所示。說明:(a)-7/2+1=-2.5:顯示-2.5000。如果顯示小數(shù)點后面2位數(shù)(-2.50),可以進行格式控制。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':二進制數(shù)值+二進制串,作為二進制數(shù)值計算。0x1E+'11':十六進制數(shù)值+十進制串,作為十進制數(shù)值計算。-b'01101'+21+x'1E':二進制串+十進制數(shù)值+十六進制串,作為十進制數(shù)值計算。21-'3A'-'C3':十進制數(shù)值-打頭含數(shù)字字符串-打頭不含數(shù)字字符串,按21-3-0=18。03比較運算符1.等于(=)2.安全等于(<=>)3.不等于(<>或!=)4.小于等于(<=)5.小于(<)6.大于等于(>=)7.大于(>)比較運算符比較運算符用于操作數(shù)間的比較運算,運算的結果總是1、0或NULL。它經(jīng)常用在SELECT語句的WHERE子句中表達査詢條件。MySQL中的比較運算符如表7.3所示。運

符作

用運

符作

用=等于<

小于<=>安全等于>=大于等于<>,!=不等于>

大于<=小于等于

1.等于(=)等于運算符(=)用來判斷數(shù)字、字符串和表達式是否相等,如果相等返回值為1;否則返回值為0。等于運算符比較時遵循如下規(guī)則:1)若兩個參數(shù)均為數(shù)值或者數(shù)值表達式,則按照數(shù)值進行比較。例如:SET@t=5.001;SELECT1.0=1,@t=5+1e-3,0=1e-90;運行結果如圖7.8所示。比較運算符2)若用數(shù)值字符串和數(shù)字進行比較,則自動將字符串轉換為數(shù)字后用數(shù)值進行比較。例如:SELECT'3'=3,'0.0'=0,'0.05'=5e-2,0.05='5e-2','0.05'='5e-2';運行結果如圖7.9所示。其中,因為兩邊都是字符串,科學計數(shù)法表示的數(shù)值5e-2就不會轉換為數(shù)值,而是直接進行字符串比較。用全角數(shù)值字符串和數(shù)字進行比較,也會先轉換成對應數(shù)值然后比較。例如:SET@4=3.14159;SELECT3.1416<'4',3.1416<@4;運行結果如圖7.10所示。比較運算符3)用非數(shù)值字符串和數(shù)字進行比較,字符串轉換為0,然后進行比較。例如:SET@π=3.14159;SELECT3.14<'π',3.14<@π,'A'=0;運行結果如圖7.11所示。4)若兩個都是(單引號或雙引號括起)字符串,則按照字符串進行比較。只有字符串順序和個數(shù)完全相同,字符串才相等。注意,空格也是字符。例如:SELECT"he"='he','he'=LEFT('he',1)+'e','H'='h','he'='h','h'='h';運行結果如圖7.12所示。比較運算符5)ASCII碼字符在不同的字符集中存儲的代碼是相同的,中文在不同的中文字符集中存儲的代碼是相同的,但在中文字符集和其他非中文字符集代碼是不同的。例如:SELECT_utf8'he'=_gbk'he',_utf8'漢'=_gbk'漢';SELECT'he'=N'he',_gbk'漢'=N'漢';運行結果如圖7.13所示。

比較運算符6)大小寫字符是否相等取決于當前字符排序規(guī)則?!纠?.7】大小寫字符串比較和字符排序規(guī)則。(1)顯示當前字符排序規(guī)則SHOWVARIABLESLIKE'COLLATION_%';運行結果如圖7.14所示。其中,collation打頭描述各種排序規(guī)則,Value中的“ci”表示不區(qū)分大小寫。(2)字符比較SELECT'ABC'='abc','ABC'=_utf8mb4'abc'COLLATEutf8mb4_0900_as_cs;運行結果如圖7.15所示。比較運算符7)元組比較兩項對應列的數(shù)據(jù)項是否相等?!纠?.8】元組相等比較。SELECT('1A','蘋果')=('1B','梨'), ('1A','蘋果')=('1A','梨'),('1A','蘋果')=('1A','蘋果');運行結果如圖7.16所示。說明:第1項:第1列'1A'與'1B'不等,結果為假。第2項:因為第1列相等,單第2列'蘋果'和'梨'不等,結果為假。第3項:因為第1列和第2列均相等,結果為真。比較運算符8)若有一個或兩個參數(shù)為NULL,則比較運算的結果為NULL。例如:SELECT''=NULL,NULL=NULL;運行結果如圖7.17所示。9)半角字符和全角字符是不相等的。在GB2312-80編碼中鍵盤上出現(xiàn)的可以打印的字符均有編碼,這些字符就跟漢字一樣。GB2312內碼兼容ASCII碼,因為ASCII每一個字節(jié)的最高位為0,稱為半角字符;漢字每一個字節(jié)的最高位為1,不是真正的漢字的符號稱為全角字符。所以半角字符和全角字符是不相等的,而且半角字符<全角字符。GBK編碼是GB2312-80的擴展。比較運算符【例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)運行結果如圖7.18所示。

說明:(a)客戶端字符集character_set_client為utf8,對應默認排序規(guī)則不區(qū)分大小寫。全角字符'A'轉換為半角字符'A'后與半角字符'a'相等。而gbk'A'就是全角字符'A',與半角字符'a'當然不等,而且全角字符'A'編碼大于半角字符'a'。(b)設置客戶端字符集character_set_client為gbk,對應默認排序規(guī)則區(qū)分大小寫,當前默認的character_set_system字符集為utf8。(c)字符集gbk區(qū)分大小寫,'A'是全角字符與半角字符'a'當然不等,而且全角字符'A'編碼大于半角字符'a'。比較運算符2.安全等于(<=>)在兩個操作數(shù)均為NULL時,其返回值為1,否則返回值為0。除此之外,它與普通等于運算符(=)作用完全相同。例如:SELECT3<=>ABS(-3),''<=>NULL,NULL<=>NULL,0<=>NULL;運行結果如圖7.19所示。3.不等于(<>或!=)不等于運算符(<>或!=)用于數(shù)字、字符串、表達式不相等的判斷,如果不相等就返回值1,否則返回0。對于元組(a,b)<=(x,y)比較,只要有一個數(shù)據(jù)項不同,結果就為1。比較運算符4.小于等于(<=)如果左邊的操作數(shù)小于等于右邊的操作數(shù),返回值為1;否則返回值為0。對于元組(a,b)<=(x,y)比較,等效于:(a<x)OR((a=x)AND(b<=y))例如:SELECT('1A','orange')<=('1C','apple'),('1C','orange')<=('1C','apple');運行結果如圖7.20所示。說明:第一項:因為第1列'1A'<'1C',故無須看第2列,直接返回1。第二項:第1列相等(都是“'1C'”),因'orange'>'apple'(字符o大于a),故返回0。比較運算符5.小于(<)小于運算符(<)用來判斷左邊的操作數(shù)是否小于右邊的操作數(shù):如果小于,返回值為1;否則返回值為0。對于元組(a,b)<(x,y)等效于:(a<x)OR((a=x)AND(b<y))6.大于等于(>=)大于等于運算符(>=)用來判斷左邊的操作數(shù)是否大于等于右邊的操作數(shù):如果大于等于,返回值為1;否則返回值為0。該運算符不能用于判斷空值。對于元組(a,b)>=(x,y)等效于:(a>x)OR((a=x)AND(b>=y))7.大于(>)大于運算符(>)用來判斷左邊的操作數(shù)是否大于右邊的操作數(shù):如果大于,返回值為1;否則返回值為0。該運算符不能用于判斷空值。對于元組(a,b)>(x,y)等效于:(a>x)OR((a=x)AND(b>y))04判斷運算符1.ISNULL(ISNULL)和ISNOTNULL2.值是否在范圍內:BETWEEN...AND...3.值是否在其中:IN、NOTIN判斷運算符1.ISNULL(ISNULL)和ISNOTNULL表達式ISNULL表達式ISNULL表達式ISNOTNULL“表達式ISNULL”或者“表達式ISNULL”中表達式的值為NULL,返回值為1,否則返回值為0?!氨磉_式ISNOTNULL”中表達式的值非空,返回值為1,否則返回值為0。ISNULL(表達式):系統(tǒng)函數(shù)ISNULL(表達式)與“表達式ISNULL”功能相同。例如:SELECTNULLISNULL,ISNULL(100/(2-2)), (''=NULL)ISNOTNULL,(NULL=NULL)ISNOTNULL;運行結果如圖7.21所示。說明:(1)表達式“100/(2-2)”除數(shù)為0,結果為NULL。(2)“(''=NULL)”和“(NULL=NULL)”皆為空值。(3)ISNULL和ISNULL的作用相同,而ISNULL和ISNOTNULL的返回值正好相反。判斷運算符2.值是否在范圍內:BETWEEN...AND...表達式BETWEEN最小值AND最大值作用等同于:最小值<=

表達式AND

表達式<=

最大值即,如果表達式值大于或等于最小值且小于或等于最大值,則返回1;否則返回0?!纠?.10】表達式值范圍判斷。(1)數(shù)值表達式范圍判斷SET@x=-1;SELECT@xBETWEEN-2AND0,@x+1BETWEEN0AND2,ABS(@x)BETWEEN-2AND0;運行結果如圖7.22所示。判斷運算符(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)運行結果如圖7.23所示。說明:(a)不區(qū)分大小寫。(b)''<'lo','l'<'p'。(c)'g'<'h','h'<'你'。(d)'H'<='h','h'>''。(e)'z'>'h','h'>'a'。判斷運算符3.值是否在其中:IN、NOTIN值IN(值1,值2,...,值n)值NOTIN(值1,值2,...,值n)IN運算符用來判斷操作數(shù)是否為IN列表中的其中一個值:如果是,返回值為1;否則返回值為0。NOTIN運算符則正好相反。(1)數(shù)值和字符串符合等于比較(=)條件,IN條件才為真。例如:SET@x=-3;SELECT3.14IN(ABS(@x)+0.14),3.14IN(3,3.14159,'π'),'fruit'NOTIN('fish','fruit','apple','orange');運行結果如圖7.24所示。判斷運算符(2)在“值IN(…)”值為NULL的情況下,即使(…)中存在NULL值,IN的返回值均為NULL。例如:SELECTNULLIN(2,3,5,NULL);運行結果如圖7.25所示。值非NULL,但(…)中找不到匹配項并且包含NULL,IN的返回值均為NULL。但是,在已經(jīng)找到匹配項的情況下,即使(…)中存在NULL值,也能正常返回1。SELECT'3.14'IN(0,3.14159,NULL),3.14IN(3,3.14,NULL);運行結果如圖7.26所示。判斷運算符(3)“值IN(…)”值盡量避免依賴IN列表中值的隱式類型轉換,因為可能會產(chǎn)生非直觀的結果而給實際使用帶來麻煩。SELECT'a'IN(0),0IN('b');運行結果如圖7.27所示。(4)IN、NOTIN還可以用于元組比較。例如:SELECT(7,5)IN((2,3),(5,7)),('1A','蘋果','洛川')NOTIN(('1B','梨','碭山'),('1A','蘋果','煙臺'));運行結果如圖7.28所示。05字符串匹配1.字符串通配符匹配:LIKE2字符串是否匹配正則表達式規(guī)范:REGEXP字符串匹配1.字符串通配符匹配:LIKE表達式LIKE匹配條件如果表達式滿足匹配條件,返回值為1;如果不匹配,則返回0。表達式或匹配條件中任何一個為空,則結果為NULL??梢允褂孟旅鎯煞N通配符。'%':匹配任何數(shù)目的字符,甚至包括''字符。'_':只能匹配一個字符。例如:SELECT'Tyson/泰森雞胸肉'LIKE'Tyson______', #(a)結果:1'Tyson/泰森雞胸肉'LIKE'Tyson%'; #(b)結果:1說明:(a)'Tyson______'(6個'_'連)表示匹配以'Tyson'開頭后跟6個字符長度的字符串,而“/泰森雞胸肉”正好是6個字符,滿足匹配條件,匹配成功返回1。(b)'Tyson%'表示匹配以字符串'Tyson'開頭的字符串,“Tyson/泰森雞胸肉”滿足匹配條件,也返回1。只要以“Tyson”打頭后面有沒有字符有多少字符均滿足條件。字符串匹配【例7.11】字符串通配符匹配測試。SELECT'character_set_client'LIKE'%set_client’; #(a)結果:1SELECT'character_set_client'LIKE'%set\_client’; #(b)結果:1SELECT'character_set\_client'LIKE'%set\_client’; #(c)結果:0SELECT'Tyson/泰森雞胸肉'LIKE'%__雞胸肉'; #(d)結果:1說明:(a)'character_set_client'中“_”均為字符串內容,'%set_client'中的“%”和“_”均為匹配描述字符。(b)'%set\_client'中的“\_”為1個內容描述字符“_”轉義字符。(c)'character_set\_client'中的“\_”為2個內容描述字符,'%set\_client'的“\_”中的“\”是內容描述字符,而“_”是匹配描述字符。(d)'%__雞胸肉'中是1個“%”匹配描述字符和2個“_”匹配描述字符。字符串匹配2.字符串是否匹配正則表達式規(guī)范:REGEXP通過正則表達式可實現(xiàn)更復雜的字符串匹配。表達式REGEXP匹配條件如果表達式滿足匹配條件,返回1;如果不滿足,則返回0。若表達式或匹配條件任意一個為空,則結果為NULL。REGEXP運算符在進行匹配時,常用的有下面幾種通配符:(1)'^':匹配以該字符后面的字符開頭的字符串。(2)'$':匹配以該字符后面的字符結尾的字符串。(3)'.':匹配任何一個單字符。(4)'[...]':匹配在方括號內的任何字符,例如,[abc]匹配'a'、'b'或'c'。為了命名字符的范圍,使用一個“-'”,例如,[a-z]匹配任何字母,而[0-9]匹配任何數(shù)字。字符串匹配(5)'*':匹配零個或多個在它前面的字符,例如,'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)運行結果如圖7.29所示。06邏輯運算符和位運算符1.邏輯運算符2.位邏輯運算符和位移動運算符邏輯運算符和位運算符1.邏輯運算符邏輯運算符用于對操作數(shù)整體進行邏輯操作,如表7.4所示。運算符作

用邏輯運算表(真: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說明:(1)將所有非零數(shù)值(例如-98)、數(shù)字打頭的字符串都看作是1(TRUE),而非數(shù)字(例如'Apple蘋果')的字符串則看作是0(FALSE)。(2)從MySQL8.0.17開始,不推薦使用!、&&、||符號,因它們均為軟件開發(fā)商定義擴展的邏輯運算符,在將來的MySQL版本中將刪除對它們的支持。故應將應用程序中使用的!、&&、||符號調整為標準SQL的NOT、AND和OR符號。例如:SELECTNOT-98,NOT0,!NULL,!'Apple蘋果',!FALSE,NOT'1';運行結果如圖7.30所示。邏輯運算符和位運算符【例7.12】邏輯運算符測試。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)運行結果如圖7.31所示。

邏輯運算符和位運算符2.位邏輯運算符和位移動運算符位運算符是在二進制數(shù)上進行計算的運算符,它先將操作數(shù)變成二進制數(shù),然后進行位運算,最后將計算結果從二進制變回十進制。MySQL的位運算符見表7.5。運算符作

用實例: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邏輯運算符和位運算符【例7.13】位邏輯運算符和位移動運算符測試。SET@x=83;SET@y=15;SELECT~0-~@x,@x&@y,@x|@y,@x^@y,@y<<2,@y>>2;運行結果如圖7.32所示。07表達式和運算符的優(yōu)先級1.表達式2.運算符的優(yōu)先級表達式和運算符的優(yōu)先級1.表達式所謂“表達式”就是操作數(shù)(包括常量和變量)、列名函數(shù)通過運算符進行有機組合的式子。例如,下列SELECT語句顯示項均為表達式: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)說明:(a)賦值表達式。(b)算術表達式。(c)算術表達式。(d)字符串匹配邏輯表達式。表達式和運算符的優(yōu)先級又例如,操作數(shù)據(jù)庫表SQL語句表達式:USEemarket;CREATETABLEuser( ...

手機號 char(11) NOTNULL UNIQUECHECK(LENGTH(TRIM(手機號))=11ANDLEFT(手機號,1)='1'), #(a) ... CHECK(YEAR(有效期)-CONVERT(SUBSTR(身份證號,7,4),UNSIGNED)>=20) #(b));SELECT...FROMcommodityWHERE商品編號<'3'AND價格>=100; #(c)UPDATE... SETcommodity_new.價格=commodity_new.價格-10 #(d) WHEREcommodity_temp.原價-commodity_new.價格<15ANDcommodity_new.商品編號=commodity_temp.商品編號; #(e)說明:(a)字符串表達式、比較表達式、邏輯表達式。(b)字符串表達式、算術表達式、比較表達式。(c)比較表達式、邏輯表達式。(d)算術表達式、賦值表達式。(e)算術表達式、比較表達式、邏輯表達式。表達式和運算符的優(yōu)先級2.運算符的優(yōu)先級當一個復雜的表達式有多個運算符時,運算符優(yōu)先級決定執(zhí)行運算的先后次序,會影響所得到的運算結果。MySQL運算符的優(yōu)先級如表7.6所示,級別數(shù)字越小表示優(yōu)先級越高。運

符級

別!(邏輯取反)0–(負號)、~(按位取反)1^(按位異或)2*(乘法)、/(除法)、DIV(整數(shù)除法)、%,MOD(取模)3+(加法)、–(減法)4<<(位左移)、>>(位右移)5&(按位與)6|(按位或)7比較運算符:=、<=>、<>,!=、<=、<、>=、>、ISNULL、IN、LIKE、REGEXP8BETWEENAND9NOT(邏輯非)10AND,&&(邏輯與)11XOR(邏輯異或)12OR,||(邏輯或)13=(賦值)、:=14表達式和運算符的優(yōu)先級說明:(1)對表達式求值時,級別高的運算符先進行計算。(2)當一個表達式中有多個運算符級別相同時,根據(jù)它們在表達式中的位置,從左至右依次進行計算。但有一例外:賦值(=、:=)是從右至左進行。(3)“=”作為比較運算符與<=>、<>,!=、<=、<、>=、>等具有相同的優(yōu)先級;但作為賦值運算符時,則與:=優(yōu)先級相同。(4)一些運算符的優(yōu)先級和含義取決于SQL模式:如在默認情況下,!的優(yōu)先級高于NOT。但啟用HIGH_NOT_PRECEDENCE后,兩者具有相同的優(yōu)先級。(5)可用括號改變運算符的優(yōu)先性,先對括號內的表達式求值,然后對括號外的運算符進行運算時使用該值。若表達式中有嵌套的括號,則首先對嵌套最深的表達式求值。第7章

運算符、表達式和系統(tǒng)函數(shù)——系統(tǒng)函數(shù)系統(tǒng)函數(shù)1.數(shù)學函數(shù)數(shù)學函數(shù)是用來處理數(shù)值型數(shù)據(jù)的函數(shù),主要有常用運算函數(shù)、數(shù)制及轉換、取接近值函數(shù)、冪和對數(shù)函數(shù)、隨機數(shù)函數(shù)、三角函數(shù)等。在有錯誤產(chǎn)生時,數(shù)學函數(shù)返回NULL。2.字符串函數(shù)字符串函數(shù)是專門用來處理字符串數(shù)據(jù)的,可實現(xiàn)對字符串進行長度統(tǒng)計、比較、獲取、定位、改變、合并、替換、刪除空格等諸多靈活而強大的功能。字符串函數(shù)包括長度統(tǒng)計和比較函數(shù)、獲取字符串函數(shù)、字符串定位函數(shù)、改變字符串函數(shù)、刪除空格函數(shù)和生成字符串函數(shù)。系統(tǒng)函數(shù)3.日期時間函數(shù)日期時間函數(shù)又分為日期函數(shù)和時間函數(shù),分別用來處理日期和時間值。日期函數(shù)通常接受date類型的參數(shù),也可使用datetime、timestamp型參數(shù),但會忽略值的時間部分;同樣地,時間函數(shù)通常以time類型值為參數(shù),也可接受datetime、timestamp類型值,但會忽略其日期部分。此外,許多日期時間函數(shù)還可以同時接受描述日期和時間的數(shù)字和字符串類型的參數(shù)。日期時間函數(shù)包括獲取當前日期和時間函數(shù)、獲取日期包含信息函數(shù)、獲取時間包含信息函數(shù)、計算日期所在周函數(shù)、日期和時間運算函數(shù)、日期時間格式化函數(shù)和時間與秒轉換函數(shù)。4.類型轉換函數(shù)類型轉換函數(shù)包括數(shù)值轉換為進制字符串、進制與對應字符函數(shù)、字符串轉換為數(shù)值和日期和IP地址轉換函數(shù)。系統(tǒng)函數(shù)5.JSON函數(shù)JSON函數(shù)用于處理JSON數(shù)據(jù)類型及JSON列記錄的基本操作函數(shù)。包括JSON基本操作函數(shù)、JSON數(shù)據(jù)檢索函數(shù)、JSON數(shù)據(jù)修改函數(shù)、獲取JSON屬性函數(shù)和JSON數(shù)據(jù)轉化函數(shù)。6.空間數(shù)據(jù)處理函數(shù)空間數(shù)據(jù)處理函數(shù)分為空間對象創(chuàng)建函數(shù)、獲取空間對象屬性、空間對象計算和處理和幾何對象判斷。MySQL中空間對象都有特定的格式,一般都要將WKT串轉換為對應格式,才能使用MySQL提供的空間數(shù)據(jù)處理函數(shù)進行存儲計算。7.窗口函數(shù)MySQL支持的窗口函數(shù)按照功能分為如下幾類:序號函數(shù)、分布函數(shù)、前后函數(shù)、頭尾函數(shù)和其他函數(shù)。8.其他函數(shù)其他函數(shù)包括判斷函數(shù)、加密解密函數(shù)、聚合函數(shù)(常用于SELECT…GROUPBY中)和系統(tǒng)信息函數(shù)。加密解密函數(shù)、聚合函數(shù)(常用于SELECT…GROUPBY中)和系統(tǒng)信息函數(shù)。第8章

查詢、視圖和索引——數(shù)據(jù)庫查詢MySQL+實用教程(第4版)數(shù)據(jù)庫查詢SELECT語句,它的功能非常強大、使用極為靈活,它可以實現(xiàn)對表的選擇、投影及連接操作。主干形式如下:SELECT[ALL|DISTINCT|DISTINCTROW]輸出項,... [FROM表名|視圖名] /*指定數(shù)據(jù)源*/ [WHERE條件表達式] /*指定查詢條件*/ [GROUPBY...] /*指定分組項*/ [HAVING條件] /*指定分組后篩選條件*/ [ORDERBY...] /*指定輸出行排列依據(jù)項*/ [LIMIT行數(shù)] /*指定輸出行范圍*/ [UNIONSELECT語句] /*數(shù)據(jù)源聯(lián)合*/ [WINDOWS...] /*窗口定義*/01選擇輸出項1.輸出項為列名2.輸出項為表達式3.輸出內容變換4.消除輸出項的重復行5.聚合函數(shù)6.JSON類型列的部分內容選擇輸出項1.輸出項為列名輸出項為一個表中的某些列,各列名之間以逗號分隔。當希望使用自己命名的標題時,可以在列名之后加“AS別名”?!纠?.1】查詢網(wǎng)上商城數(shù)據(jù)庫(emarket)的商品表(commodity)中所有的商品編號、商品名稱、庫存量和單價。USEemarket;SELECT商品編號,商品名稱,庫存量,價格AS商品單價FROMcommodity;查詢結果如圖8.1所示。選擇輸出項2.輸出項為表達式列名本身就是一個簡單表達式,也可以是包含列名的一般表達式。例如,對數(shù)字列進行各種計算。為了避免不太直觀的表達式作為輸出項標題,可以用AS定義一個別名作為新的計算結果列的名稱。【例8.2】將1000元以上的商品打8折出售,并同時顯示原價和優(yōu)惠價。USEemarket;SELECTLEFT(商品編號,1)AS類別編號,商品編號,商品名稱,價格AS'原

價',FORMAT(價格*0.8,2)AS優(yōu)惠價 FROMcommodity WHERE價格>1000;查詢結果如圖8.2所示。說明:(1)LEFT(商品編號,1)為字符串表達式,獲得商品編號列第1個字符。(2)不允許在WHERE子句中使用列別名。例如:“WHERE原價>1000”。(3)別名中含有空格時,須用引號括起來,比如AS'原

價'。(4)價格包含兩位小數(shù),價格*0.8后就會超過兩位,為了顯示兩位小數(shù),采用FORMAT(價格*0.8,2)函數(shù)。選擇輸出項【例8.3】查詢用戶(user)表姓名、年齡和身份證是否有效。SELECT姓名, YEAR(NOW())-CONVERT(SUBSTR(身份證號,7,4),UNSIGNED)+1AS年齡,IF(有效期>=NOW(),'有效','過期')AS身份證有效 FROMuser;查詢結果如圖8.3所示。說明:(1)SUBSTR(身份證號,7,4)是出生年份n,CONVERT(n,UNSIGNED)將n轉換為無符號整數(shù)n1,YEAR(NOW())為獲得當前日期中的年份n2,n2-n1+1就是年齡。(2)IF(有效期>=NOW(),'有效','過期'):有效期(date類型)列與當前日期對比,大于等于為'有效'否則為'過期'。選擇輸出項3.輸出內容變換在對表進行查詢時,輸出列顯示內容可以通過CASE語句進行變換。CASE WHEN條件1THEN表達式1 ...... ELSE表達式nEND【例8.4】在emarket數(shù)據(jù)庫商品分類表(category)中,顯示商品分類記錄對應的大類。USEemarket;SELECT類別編號,類別名稱, CASE WHENLEFT(類別編號,1)='1'THEN'水果' WHENLEFT(類別編號,1)='2'THEN'肉禽' WHENLEFT(類別編號,1)='3'THEN'海鮮水產(chǎn)' ELSE'糧油蛋' ENDAS大類 FROMcategory;選擇輸出項查詢結果如圖8.4所示。選擇輸出項也可以采用IF()函數(shù)嵌套變換輸出項:IF(邏輯表達式,表達式1,表達式2)功能:如果邏輯表達式為真,函數(shù)值為表達式1值,否則為表達式2值。表達式2又可以是IF()函數(shù),以此類推。例如:商品表(commodity)中商品編號前兩位對應類別編號,第一位也是大類編號,輸出項變換商品大類名稱,可以進行下列變換:SELECT IF(LEFT(商品編號,1)='1','水果',IF(LEFT(商品編號,1)='2','肉禽',IF(LEFT(商品編號,1)='3','海鮮水產(chǎn)','糧油蛋')))AS大類,商品編號,商品名稱,價格,庫存量 FROMcommodity;說明:顯示商品表(commodity)所有記錄,輸出項包括大類、商品編號、商品名稱、價格、庫存量。大類通過商品編號第一個字符變換得到。選擇輸出項4.消除輸出項的重復行查詢結果顯示“輸出項”可能會出現(xiàn)重復行,可以使用DISTINCT或DISTINCTROW關鍵字消除結果集中的重復行?!纠?.5】查詢orders表中出現(xiàn)的所有帳戶。對emarket數(shù)據(jù)庫的訂單表(orders)只選擇帳戶名,由于同一個帳戶會多次購物而出現(xiàn)多個訂單,消除重復行可以很方便看清當前有哪些帳戶購物。USEemarket;SELECT帳戶名 FROMorders; #(a)SELECTDISTINCT帳戶名FROMorders; #(b)查詢結果如圖8.5所示。

選擇輸出項5.聚合函數(shù)輸出項為表達式中用到的系統(tǒng)函數(shù)僅僅是對包含的列值進行處理,而這里的“聚合函數(shù)”處理的是查詢得到的行和列。下表8.1列出了MySQL常用的聚合函數(shù)。函

數(shù)

名說

明COUNT求記錄行數(shù)MAX求最大值MIN求最小值SUM求表達式列的和AVG求表達式列的平均值STD或STDDEV求表達式列中所有值的標準差VARIANCE求表達式列中所有值的方差GROUP_CONCAT產(chǎn)生由屬于一組的列值連接組合而成的字符串選擇輸出項【例8.6】統(tǒng)計commodity表中的商品記錄總數(shù),商品價格的最高、最低及平均值,并計算出全部商品的總價值。USEemarket;SELECTCOUNT(商品編號)AS商品總數(shù), MAX(價格)AS最高價,MIN(價格)AS最低價,FORMAT(AVG(價格),2)AS均價,SUM(價格*庫存量)AS總價值 FROMcommodity;查詢結果如圖8.6所示。選擇輸出項【例8.7】計算commodity表中所有商品價格的方差和標準差。統(tǒng)計學上的標準差等于方差的平方根,所以STDDEV(…)和SQRT(VARIANCE(…))這兩個表達式是相等的。方差的計算按以下幾個步驟進行。(1)計算相關列的平均值。(2)求列中的每一個值與平均值之差。(3)計算差值的平方的總和。(4)用總和除以(列中的)值的個數(shù)得結果。USEemarket;SELECTVARIANCE(價格)AS方差,STDDEV(價格)AS標準差,SQRT(VARIANCE(價格))AS方差的平方根FROMcommodity; #(a)SET@avg=(SELECTAVG(價格)FROMcommodity); #計算價格平均值SELECTSUM(POW(價格-@avg,2))/COUNT(商品編號)AS方差FROMcommodity; #(b)查詢結果如圖8.7所示。

選擇輸出項MySQL支持一個特殊的聚合函數(shù)GROUP_CONCAT,它返回一個組指定列的所有非NULL值的長字符串,這些值一個接著一個放置,中間用逗號隔開。這個字符串最大長度標準值是1024?!纠?.8】羅列出商品分類表(category)中水果大類的商品類別名稱。USEemarket;SELECTGROUP_CONCAT(類別名稱)FROMcategoryWHERELEFT(類別編號,1)='1';查詢結果如圖8.8所示。選擇輸出項6.JSON類型列的部分內容JSON類型列內容是符合“鍵:值”結構的,輸出項中可通過“列名->路徑”或者“列名->>路徑”及JSON函數(shù)指定部分內容。例如:SELECT姓名,常用地址->'$."地址"."位置"'住址FROMuser;查詢結果如圖8.9所示。02單數(shù)據(jù)源1.表作為數(shù)據(jù)源2.表分區(qū)作為數(shù)據(jù)源3.查詢作為數(shù)據(jù)源4.視圖作為數(shù)據(jù)源單數(shù)據(jù)源SELECT語句的查詢對象(即數(shù)據(jù)源)由FROM子句指定:FROM數(shù)據(jù)源[AS別名],...數(shù)據(jù)源:=表名[分區(qū)]|視圖|查詢|連接1.表作為數(shù)據(jù)源當表作為數(shù)據(jù)源時,如果查詢表位于當前數(shù)據(jù)庫,直接寫表名即可;如果查詢表不在當前數(shù)據(jù)庫,表名前需要加數(shù)據(jù)庫名前綴,或者使用“USE數(shù)據(jù)庫名”將指定的數(shù)據(jù)庫變成當前數(shù)據(jù)庫再行查詢。查詢的數(shù)據(jù)庫可以是用戶創(chuàng)建的,也可以是MySQL系統(tǒng)的。1)查詢用戶數(shù)據(jù)庫表信息例如:USEemarket;SELECT*FROMmydb.test;SELECT*FROMcommodityWHERELEFT(商品編號,1)='1';單數(shù)據(jù)源2)查詢系統(tǒng)數(shù)據(jù)庫表信息系統(tǒng)數(shù)據(jù)庫存放服務器、數(shù)據(jù)庫及其對象的有關信息,通過查詢可以獲得用戶關注的信息。例如:(1)查詢MySQL支持的字符集:SELECT*FROMinformation_schema.character_sets;(2)通過系統(tǒng)數(shù)據(jù)庫information_schema字典表columns查詢mydb數(shù)據(jù)庫mytab表列的字符集和排序規(guī)則:USEmydb;SELECTcolumn_name,character_set_name,collation_nameFROMinformation_schema.columnsWHEREtable_name='mytab';(3)通過系統(tǒng)數(shù)據(jù)庫information_schema字典表tables查詢指定表的狀態(tài)信息:SELECT*FROMinformation_schema.tablesWHEREtable_schema='mydb'andtable_name='test';單數(shù)據(jù)源(4)通過系統(tǒng)數(shù)據(jù)庫information_schema的PARTITIONS表查詢用戶數(shù)據(jù)庫表分區(qū)信息:SELECT PARTITION_NAME分區(qū)名稱, PARTITION_ORDINAL_POSITION排序, PARTITION_METHOD分區(qū)類型, PARTITION_EXPRESSION表達式, PARTITION_DESCRIPTION描述, CREATE_TIME創(chuàng)建時間, TABLE_ROWSAS記錄數(shù) FROMinformation_schema.PARTITIONS WHERETABLE_SCHEMA=SCHEMA()ANDTABLE_NAME='youth';單數(shù)據(jù)源2.表分區(qū)作為數(shù)據(jù)源不指定分區(qū),表的所有記錄均為查詢數(shù)據(jù)源;包含分區(qū),則僅將指定分區(qū)內的記錄作為查詢數(shù)據(jù)源?!纠?.9】查詢商品表中水果庫存量大于10000的商品。(1)對商品表(commodity)查詢。USEemarket;SELECT*FROMcommodityWHERELEFT(商品編號,1)='1'AND庫存量>10000;單數(shù)據(jù)源(2)對商品分區(qū)表指定分區(qū)查詢。前面已經(jīng)對商品表(commodity)的副本商品分區(qū)表(commodity_part)進行過分區(qū),這里為方便對比再次列出:ALTERTABLEcommodity_part PARTITIONBYRANGECOLUMNS(商品編號) ( PARTITION水果VALUESLESSTHAN('2'), PARTITION肉禽VALUESLESSTHAN('3'), PARTITION海鮮水產(chǎn)VALUESLESSTHAN('4'), PARTITION糧油蛋VALUESLESSTHAN(MAXVALUE) );按照分區(qū)查詢,顯示結果如圖8.10所示:SELECT*FROMcommodity_partPARTITION(水果)WHERE庫存量>10000;單數(shù)據(jù)源(3)對商品分區(qū)表不指定分區(qū)查詢。SELECT*FROMcommodity_partWHERE商品編號<'2'AND庫存量>10000;因為WHERE條件包含商品編號列,系統(tǒng)會根據(jù)條件匹配分區(qū)。這里匹配的也會是水果分區(qū)。同理,對于表按HASH和KEY分區(qū)的,用戶一般不能簡單知道記錄分區(qū)存放情況,所以不能顯式指定查詢分區(qū)數(shù)據(jù)源,但系統(tǒng)會根據(jù)WHERE查詢條件是否包含分區(qū)列,指定匹配對應的分區(qū)進行查詢,否則分區(qū)就失去意義。所以我們應該將最頻繁查詢的列(表達式)作為分區(qū)依據(jù)。單數(shù)據(jù)源3.查詢作為數(shù)據(jù)源查詢作為數(shù)據(jù)源:FROM(SELECT語句)名稱,…將FROM后的查詢結果作為數(shù)據(jù)來源,然后對其進行查詢。【例8.10】查詢庫存量10000以上的水果。SELECT*FROMcommodityWHERELEFT(商品編號,1)='1'AND庫存量>10000; #(a)SELECT*FROM(SELECT*FROMcommodityWHERELEFT(商品編號,1)='1')commodity1WHERE庫存量>10000; 說明:(a)在commodity表篩選出符合LEFT(商品編號,1)='1'AND庫存量>10000條件的記錄。(b)查詢結果與(a)查詢語句的結果相同。這里先從commodity表篩選出符合LEFT(商品編號,1)='1'條件的記錄作為數(shù)據(jù)源(commodity1),然后再在commodity1數(shù)據(jù)源查詢符合“庫存量>10000”條件的記錄。單數(shù)據(jù)源4.視圖作為數(shù)據(jù)源視圖作為數(shù)據(jù)源進行查詢與表一樣,僅僅是視圖中的數(shù)據(jù)記錄是由定義它的查詢語句決定的。USEemarket;CREATEVIEWcommodity_1 ASSELECT*FROMcommodityWHERELEFT(商品編號,1)='1'; #(a)SELECT*FROMcommodity_1WHERE庫存量>10000; #(b)說明:(a)創(chuàng)建視圖,視圖中的數(shù)據(jù)是定義它的查詢結果,并以視圖名“commodity_1”標識。(b)把commodity_1視圖作為數(shù)據(jù)源,對其進行查詢。03多數(shù)據(jù)源1.全連接2.內連接3.外連接4.自然連接5.交叉連接6.徑直連接多數(shù)據(jù)源1.全連接各個數(shù)據(jù)源之間用逗號分隔就指定了一個全連接,又叫“等值連接”。連接后產(chǎn)生的中間結果是一個新表,它是每個數(shù)據(jù)源的每行都與其他數(shù)據(jù)源中的每行交叉產(chǎn)生的所有可能組合,也就是笛卡兒積(每個數(shù)據(jù)源行數(shù)相乘),列包含了所有數(shù)據(jù)源中出現(xiàn)的列。例如,訂單表(orders)包含4列9行(記錄),訂單項表(orderitems)包含4列13行(記錄),如圖8.11所示。

多數(shù)據(jù)源那么下列語句:SELECT*FROMorders,orderitems;將產(chǎn)生9*13=117行(記錄),4+4=8列作為輸出項。全連接的多表可通過WHERE指定查詢條件,輸出項前需要以表名作為前綴,表明輸出的內容出于哪個表。如果列名在各表中均不相同,輸出列名前可不加前綴。【例8.11】查找所有購買過商品的帳戶名、訂單編號和商品編號。分析:訂單表(orders)中包含帳戶名和訂單編號,訂單項表(orderitems)中包含訂單編號和商品編號,所以需要把這兩個表通過訂單編號連接起來進行查詢。USEemarket;SELECT帳戶名,orderitems.訂單編號,商品編號 FROMorders,orderitems WHEREorders.訂單編號=orderitems.訂單編號;多數(shù)據(jù)源顯示結果如圖8.12所示。多數(shù)據(jù)源說明:(1)這里是在117行(記錄)中間結果中查詢符合WHEREorders.訂單編號=orderitems.訂單編號條件的13條記錄,輸出項從8列選擇3列。(2)因為訂單編號在兩個表中都存在,所以需要加表名作為前綴指定值從哪一個表得到,而帳戶名和商品編號只在一個表中存在,可以不加前綴。為了把多個表組成一個有效的整體進行有效查詢,通常使用JOIN關鍵字指定連接類型,把它們連接起來:表名[INNER|CROSS]JOIN表名[連接條件]|表名STRAIGHT_JOIN表名|表名STRAIGHT_JOIN表名ON連接條件|表名LEFT|RIGHT[OUTER]JOIN表名連接條件|表名NATURAL[LEFT|RIGHT[OUTER]]JOIN表名多數(shù)據(jù)源2.內連接指定了INNER

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論