網(wǎng)絡(luò)運(yùn)行分析-數(shù)據(jù)庫(kù)基礎(chǔ)sql語(yǔ)言操作_第1頁(yè)
網(wǎng)絡(luò)運(yùn)行分析-數(shù)據(jù)庫(kù)基礎(chǔ)sql語(yǔ)言操作_第2頁(yè)
網(wǎng)絡(luò)運(yùn)行分析-數(shù)據(jù)庫(kù)基礎(chǔ)sql語(yǔ)言操作_第3頁(yè)
網(wǎng)絡(luò)運(yùn)行分析-數(shù)據(jù)庫(kù)基礎(chǔ)sql語(yǔ)言操作_第4頁(yè)
網(wǎng)絡(luò)運(yùn)行分析-數(shù)據(jù)庫(kù)基礎(chǔ)sql語(yǔ)言操作_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

SQL指中,我們馬上可以看到兩個(gè)關(guān)鍵字:從(FROM)數(shù)據(jù)庫(kù)中的表格內(nèi)選出(SELECT)。(表使用SQL來(lái)設(shè)定表格。)我們由這里可以看到最基本的SQL架構(gòu):SELECT欄位名FROM表格名LosSanLos(store_Name),我們就打入:SELECTstore_nameFROMStore_Information結(jié)果LosSanLosSQL查詢只包括選擇列表、FROM子句和WHERE子句。它們分別說(shuō)明所查詢列、testtable表中所有列的數(shù)據(jù):代碼:SELECT*FROMtesttable代碼:SELECTnickname,FROM代碼:SELECT昵稱=nickname,電子郵件=FROMSELECTALL或DISTINCT選項(xiàng)來(lái)顯示表中符合條件的所有行或刪除其中重復(fù)的數(shù)據(jù)行,默認(rèn)為ALLDISTINCTSELECT返回TOPn是表示一百分?jǐn)?shù),指定返回的行數(shù)等于總行數(shù)的百分之幾。例如:代碼:SELECTTOP2*FROM`testtable`代碼:SELECTTOP20PERCENT*FROMSELECT指令讓我們能夠表格中一個(gè)或數(shù)個(gè)欄位的所有資料。這將把所有的資料都抓SQLSELECT后加上一個(gè)DISTINCT就可以了。DISTINCT的語(yǔ)法如下:SELECTDISTINCT欄位名FROM表格名Store_InformationLosSanLosSELECTDISTINCTstore_nameFROM結(jié)果LosAngelesSanDiego$1,000的資料。要做到這一點(diǎn),我們就需要用到WHERE這個(gè)指令。這個(gè)指令的語(yǔ)法如下:SELECT欄位名FROM表格名"WHERE"條件"961月的定單SELECTorderID,CustomerID,orderDateFROMordersMcirosoftJETSQL中,日期用‘#’Datevalue()函數(shù)來(lái)代替。在比較字符WHEREorderDate〉#96-1-WHEREorderDate〉$1,000Store_InformationLosSanLosSELECTstore_nameFROMStore_InformationWHERESales>1000結(jié)果LosAngelesAND在上一頁(yè)中,我們看到WHERE指令可以被用來(lái)由表格中有條件地選取資料。這個(gè)條件可能是簡(jiǎn)單的(像上一頁(yè)的例子),也可能是復(fù)雜的。復(fù)雜條件是由二或多個(gè)簡(jiǎn)單條件透過(guò)AND或是OR的連接而成。一個(gè)SQL語(yǔ)句中可以有無(wú)限多個(gè)簡(jiǎn)單條件的存在。SELECT欄位名FROM"表格名"WHERE簡(jiǎn)單條件"{[AND|OR簡(jiǎn)單條件{}+代表{}ANDOR加簡(jiǎn)單條件的情況可以發(fā)生一或多次。另外,我們可以用()來(lái)代表?xiàng)l件的先后次序。舉例來(lái)說(shuō),我們?nèi)粢赟tore_Information表格中選出所有Sales高于$1,000或是$500$275Store_InformationLosSanSanSELECTstore_nameFROMStore_InformationWHERESales>1000OR(Sales<500ANDSales>結(jié)果LosAngelesSanFrancisco在SQL中,在兩個(gè)情況下會(huì)用到IN這個(gè)指令;這一頁(yè)將介紹其中之一:與WHERE有道的值都放入IN這個(gè)子句。IN指令的語(yǔ)法為下:SELECT欄位名FROM表格名WHERE欄位名IN值一值二WHERE欄位名值一Store_InformationLosAngelesSanStore_InformationLosSanSanSELECTFROMWHEREstore_nameIN('LosAngeles','San結(jié)果LosSanIN這個(gè)指令可以讓我們依照一或數(shù)個(gè)不連續(xù)(discrete)的值的限制之內(nèi)抓出資料庫(kù)中的BETWEEN(range)BETWEENSELECT欄位名FROM表格名WHERE欄位名BETWEEN值一AND值二Store_InformationJanuary6,1999January10,1999中的資料,Store_InformationLosSanSanSELECTFROMWHEREDateBETWEEN'Jan-06-1999'AND'Jan-10-結(jié)果SanSanLIKEWHERELIKE能讓我們依據(jù)一個(gè)模式(pattern)IN的時(shí)候,我們完全地知道我們需要的條件;在運(yùn)用BETWEEN的時(shí)候,我們則是列出一個(gè)范圍。LIKE的語(yǔ)法如下:SELECT欄位名FROM表格名WHERE欄位名LIKE模式LIKE運(yùn)算符里使用的通配符通配符含義*0~9[字符列表][!字符列表]-{模式}(wildcard).'A_Z':'A''Z''ABZ''A2Z'都符合這一個(gè)模式,而'AKKZ'并不符合(因?yàn)樵贏和Z之間有兩個(gè)字原,而不是一個(gè)'ABC%':'ABC''ABCD''ABCABC''%XYZ':'XYZ'結(jié)尾的字符串。舉例來(lái)說(shuō),'WXYZ''ZZXYZ''%AN%':所有含有'AN'這個(gè)模式的字符串。舉例來(lái)說(shuō),'LOSANGELES'和'SANFRANCISCO'都符合這個(gè)模式。Store_Information表格上Store_InformationLOSSANSANSELECTFROMWHEREstore_nameLIKE結(jié)果LOSSANSANODERSELECTWHERE這兩個(gè)指令將資料由表格中抓出。(ASCENDing)或是由大往小(DESCENDing)ODERBYODERBY的語(yǔ)法如下SELECT欄位名FROM"表格名"[WHERE條件ODERBY欄位名ASC[]WHEREWHEREODERBY子句之前。ASC代表結(jié)果會(huì)以由小往大的順序列出,而DESC代表結(jié)果會(huì)以由大往小的順序列出。如果兩者皆沒(méi)有被寫(xiě)出的話,那我們就會(huì)用ASC。ODERBY子句的語(yǔ)法如下(假設(shè)ODERBY欄位一ASCDESC欄位二ASC"欄位一"由小"欄位一""欄位二"SalesStore_InformationStore_InformationLosSanSanSELECTstore_name,Sales,DateFROMStore_InformationODERBYSales結(jié)果LosSanSan(SQL句中的順序)SELECT12,以此類推。在上面這個(gè)例子中,我們用以下這句SQL可以達(dá)到完全一樣的效果:SELECTstore_name,Sales,DateFROMStore_InformationODERBY2做一些運(yùn)算,例如將它們總合起來(lái),或是找出它們的平均值。SQL有提供一些這一類的函AVG(平均)COUNT計(jì)數(shù)MAX最大值)MIN(最小值)SUM(總合)VAR(方差)STDEV(標(biāo)準(zhǔn)誤差)FIRST(第一個(gè)值)LAST(最后一個(gè)值SELECT函數(shù)名"("欄位名")FROM"表格名"SalesStore_InformationLosSanLosSELECTSUM(Sales)FROM結(jié)果$2750Sales欄位的總合$1500$250$300SQL(concatenation),文字修整(trim),以及子字符串(substring)。不同的數(shù)據(jù)庫(kù)對(duì)這些函數(shù)有不同的語(yǔ)法,所以最好是參考您所用數(shù)基本上,COUNT讓我們能夠數(shù)出在表格中有多少筆資料被選出來(lái)。它的語(yǔ)法是:FROM表格名store_nameStore_InformationLosSanLosSELECTCOUNT(store_name)FROMStore_InformationWHEREstore_nameisnotNULL結(jié)果"isnotNULL""這個(gè)欄位不是空白"COUNT和DISTINCT經(jīng)常被合起來(lái)使用,目的是找出表格中有多少筆不同的資料(至于的store_name,我們就鍵入,SELECTCOUNT(DISTINCTFROM結(jié)果Count(DISTINCTstore_name)GROUP我們現(xiàn)在回到函數(shù)上。記得我們用SUM這個(gè)指令來(lái)算出所有的Sales(營(yíng)業(yè)額)吧!如果我們的需求變成是要算出每一間店(store_name)的營(yíng)業(yè)額(sales),那怎么辦呢?在這個(gè)情況我們需要確認(rèn)所有的sales都要依照各個(gè)store_name來(lái)分開(kāi)算。這個(gè)語(yǔ)法為:SELECT1SUM("FROM"表格名"GROUPBY1"Store_InformationLosSanLosSELECTstore_name,SUM(Sales)FROMStore_InformationGROUPBYstore_name結(jié)果LosSan當(dāng)我們選不只一個(gè)欄位,且其中至少一個(gè)欄位有包含函數(shù)的運(yùn)用時(shí),我們就需要用到GROUPBYGROUPBY所有其他的欄位。換句話說(shuō),除了有包括函數(shù)的欄位外,我們都需要將其放在GROUPBY的子句中。$1,500WHERESQL有提供一個(gè)HAVING的指令,而我們就可以用這個(gè)指令來(lái)達(dá)到這個(gè)目標(biāo)。HAVING子句通常是在一個(gè)SQL句子的最后。一個(gè)含有HAVING子句的SQL并不一定要包含GROUPBY子句。HAVING的語(yǔ)法如下:SELECT1SUM("FROM"表格名"(SELECTGROUPBY子句。在我們Store_Information表格這個(gè)例子中,Store_InformationLosSanLosSales$1,500store_nameSELECTstore_name,SUM(sales)FROMStore_InformationGROUPBYstore_nameHAVINGSUM(sales)>1500結(jié)果 LosAngeles alias別名)SQL上的用處。最常用到的別名有兩種:欄位別名及表SQL產(chǎn)生的結(jié)果易讀。在之前的例子中,每當(dāng)我們有營(yíng)業(yè)額總合時(shí),欄位名都是SUM(sales)。雖然在這個(gè)情況下沒(méi)有什么問(wèn)題,可是如果這FROM子句中的表格名后空一SQL由數(shù)個(gè)不同的表格中獲取資料時(shí)是很方便的。這一點(diǎn)我們?cè)谥笳劦竭B接(join)時(shí)會(huì)看到。SELECT表格別名"."1"欄位別名"FROM"表格名""表格別名"SELECT表格名AS表格別名續(xù)使用Store_Information這個(gè)表格來(lái)做例子:Store_InformationLosSanLosSQLGROUPBY那一頁(yè)一樣的例子。這里的不同處是我們加上了欄位別名以及SELECTA1.store_nameStore,SUM(A1.Sales)"TotalSales"FROMStore_InformationA1結(jié)果LosSan"Sum(Sales)""TotalSales"。很明"TotalSales""Sum(Sales)"更精確地闡述這個(gè)欄位的含意。用表格別名的好處在這里并沒(méi)有顯現(xiàn)出來(lái),不過(guò)這在下一頁(yè)就會(huì)很清楚了。Store_InformationLosSanLosGeographyNewLosSan(region_name)(sales)Geography這個(gè)表格告訴我們每一區(qū)有哪些店,而Store_Information告訴我們每一個(gè)店的營(yíng)業(yè)額。若我們要知道每一區(qū)的營(yíng)會(huì)發(fā)現(xiàn)它們可經(jīng)由一個(gè)相同的欄位,store_nameSQL句列出,之后SELECTA1.region_nameREGION,SUM(A2.Sales)SALESFROMGeographyA1,Store_InformationA2WHEREA1.store_name=A2.store_nameGROUPBYA1.region_name結(jié)果 在第一行中,我們告訴SQL去選出兩個(gè)欄位:第一個(gè)欄位是Geography表格中的region_name(REGION)Store_Information表sales(SALES)。請(qǐng)注意在這里我們有用到表格別名:Geography表格的別名是A1,Store_Information表格的別名是A2。若我們沒(méi)有用表格別名的話,第一行SQL句容易被了解,尤其是這個(gè)SQL句含蓋好幾個(gè)不同的表格時(shí)。接下來(lái)我們看第三行,就是WHERE子句。這是我們闡述連接條件的地方。在這里,我們要確認(rèn)Geography表格中store_name欄位的值與Store_Information表格中store_name欄位的值是相等的。這個(gè)WHERE子句是接的人物,因?yàn)樗慕巧谴_定兩個(gè)表格之間的連接是正確的。如果WHERE子句是錯(cuò)誤的,我們就極可能得到一個(gè)笛卡兒連(Cartesianjoin)。笛卡兒連接會(huì)造成我們得到所有兩個(gè)表格每?jī)尚兄g所有可能的組合。在這個(gè)例子中,笛卡兒連接會(huì)讓我們得到4x4=16行的結(jié)果。之前我們看到的左連接(leftjoin),又稱內(nèi)部連接(innerjoin)。在這個(gè)情況下,要兩個(gè)表格SQLOUTERJOIN(外部連接)的指令。外部連接的語(yǔ)法是依數(shù)據(jù)庫(kù)的不同而有所不同的。舉例來(lái)說(shuō),在Oracle上,我們會(huì)在WHERE子句中要選出所有資料的那個(gè)表格之后加上一個(gè)"(+)"來(lái)代表說(shuō)這個(gè)表格中的所Store_InformationLosSanLosGeographyNewLosSan,我們需要知道每一間店的營(yíng)業(yè)額。如果我們用一個(gè)普通的連接會(huì)漏失掉'NewYork'這個(gè)店,因?yàn)樗⒉淮嬖谟赟tore_Information這個(gè)表格。所以,在這個(gè)情況下,我們需要,SELECTA1.store_name,SUM(A2.Sales)SALESFROMGeorgraphyA1,Store_InformationA2WHEREA1.store_name=A2.store_name(+)Oracle結(jié)果NewLosSan請(qǐng)注意:當(dāng)?shù)诙€(gè)表格沒(méi)有相對(duì)的資料時(shí),SQLNULL'NewYork'并不存在于Store_Information表格,所以它的"SALES"欄位是NULL.MySQL:Oracle:CONCAT(),||SQLServer:+()CONCAT(1,2,3,123,等字符串連連起來(lái)。不過(guò),在Oracle中,我們可以用'||'來(lái)一次串連多個(gè)字符串。GeographyNewLosSanSELECTCONCAT(region_name,store_name)FROMGeographyWHEREstore_name='Boston';2:SELECTregion_name||''||store_nameFROMGeographyWHEREstore_name='Boston';'EastBoston'3:SQLSELECTregion_name+''+store_nameFROMGeographyWHEREstore_name='Boston';'EastSQLsubstringMySQL:SUBSTR(),Oracle:SQLServer:(在這里我們用SUBSTR()為例SUBSTR(str,pos):由<str>中,選出所有從第<pos>位置開(kāi)始的字符。請(qǐng)注意,這個(gè)語(yǔ)法不適SQLServer上。SUBSTR(str,pos,len):由<str>中的第<pos>位置開(kāi)始,選出接下去的<len>個(gè)字符。GeographyNewLosSanSELECTSUBSTR(store_name,3)FROMGeographyWHEREstore_name='Los結(jié)果'sSELECTFROMWHEREstore_name='San結(jié)果'an進(jìn)階在這一部分,介紹以下的SQL概念及關(guān)鍵字SQLUNIONSQLUNIONALLSQLINTERSECTSQLMINUSSQLSubquerySQLEXISTSSQLCASESQL(Rank)(Running(Percentto(CumulativePercenttoUNION指令的目的是將兩個(gè)SQL語(yǔ)句的結(jié)果合并起來(lái)。從這個(gè)角度來(lái)看,UNION跟JOINUNION的一個(gè)限制是兩個(gè)SQL語(yǔ)句所產(chǎn)生的欄位需要是同樣的資料種類。另外,當(dāng)我們用UNION這個(gè)指令時(shí),我們只會(huì)看到不同的資料值(類似SELECTDISTINCT)。UNION[SQL1][SQLStore_InformationLosSanLosInternet_Sales)SELECTDateFROMStore_InformationSELECTDateFROM結(jié)果有一點(diǎn)值得注意的是,如果我們?cè)谌魏我粋€(gè)SQL語(yǔ)句(或是兩句都一起)用"SELECTDISTINCTDate"的話,那我們會(huì)得到完全一樣的結(jié)果。UNIONUNIONALL這個(gè)指令的目的也是要將兩個(gè)SQL語(yǔ)句的結(jié)果合并在一起。UNIONALL和UNIONUNIONALLUNIONALL[SQL1]UNIONALL[SQL2]UNIONALLUNION的不同。同樣假設(shè)我們有以Store_InformationLosSanLosInternet_SalesSELECTDateFROMStore_InformationUNIONALLSELECTDateFROM和UNION指令類似,INTERSECTSQL語(yǔ)句所產(chǎn)生的結(jié)果做處理的。不同UNIONOR如果這個(gè)值存在于第一句或是第二句,它就會(huì)被選出),而INTERSECT則比較像AND(這個(gè)值要存在于第一句和第二句才會(huì)被選出)。UNION是聯(lián)集,而INTERSECT是交集。INTERSECT[SQL1][SQL2]Store_InformationLosSanLosInternet_SalesSQLSELECTDateFROMStore_InformationSELECTDateFROM結(jié)果INTERSECTMINUS指令是運(yùn)用在兩個(gè)SQL語(yǔ)句上。它先找出第一個(gè)SQL語(yǔ)句所產(chǎn)生的結(jié)果,然后SQL語(yǔ)句的結(jié)果中。如果有的話,那這一筆資料就被去除,而不會(huì)在最后的結(jié)果中出現(xiàn)。如果第二個(gè)SQL語(yǔ)句所產(chǎn)生的結(jié)果并沒(méi)有存在于第一個(gè)SQLMINUS[SQL1][SQLStore_InformationLosSanLosInternet_Sales的SQL語(yǔ)句:SELECTDateFROMStore_InformationSELECTDateFROM結(jié)果 Store_Information"所產(chǎn)生的結(jié)果。在這里面,"Jan-07-1999"是存在于"SELECTDateFROMInternet_Sales"所產(chǎn)生的結(jié)果中。因此"Jan-07-1999"并不在最后的結(jié)果中。MINUSSQLSQLWHEREHAVINGSQL(subquery)SELECT1"FROM"表格"WHERE2比較運(yùn)算素](SELECT"1"FROM"表格"WHERE條件])[比較運(yùn)算素]這也可以是一個(gè)對(duì)文字的運(yùn)算素,例如"LIKE"。綠色的部分代表外查詢,紅色的部分代表內(nèi)查詢。SQLStore_InformationLosSanLosGeographyNewLosSansubquerySQL來(lái)達(dá)到我SELECTSUM(Sales)FROMStore_InformationWHEREStore_nameIN(SELECTstore_nameFROMGeographyWHEREregion_name='West')結(jié)果(SimpleSubquery)。如果內(nèi)部查詢是要利用到外部查詢提到的表格中的欄位,那這個(gè)字查詢就被稱為『相關(guān)子查詢』(CorrelatedSubquery)。以下是一個(gè)相關(guān)子查詢的例子:SELECTSUM(a1.Sales)FROMStore_Informationa1WHEREa1.Store_nameIN(SELECTstore_nameFROMGeographya2WHEREa2.store_name=a1.store_name)IN><=,都可以用來(lái)連接內(nèi)查詢和外查詢。EXISTS也是其中式這一頁(yè)討論EXISTS基本上,EXISTS是用來(lái)測(cè)試內(nèi)查詢有沒(méi)有產(chǎn)生任何結(jié)果。如果有的話,系統(tǒng)就會(huì)執(zhí)行外查詢中的SQL。若是沒(méi)有的話,那整個(gè)SQL語(yǔ)句就不會(huì)產(chǎn)生任何結(jié)果。EXISTSSELECTFROM"1"WHEREEXISTS(SELECT*FROM"2"WHERE[條件])*2中的任何欄Store_InformationLosSanLosGeographyNewLosSanSQL是SELECTSUM(Sales)FROMStore_InformationWHEREEXISTS(SELECT*FROMGeographyWHEREregion_name='West')[region_nameWest']的條件,了超過(guò)一筆的資料,所以EXISTS的條件成立,所以外查詢被執(zhí)行。而外查詢本身并沒(méi)有包含[region_name='West']這個(gè)條件。CASESQLIF-THEN-ELSECASESELECTCASE欄位名WHEN1"THENWHEN2"THEN[ELSEN"]FROM表格名"條件"ELSE子句則并不是必須的。在我們的Store_Information中Store_InformationLosSanSanJan-08-'LosAngeles'Sales2'SanDiego'Sales1.5,我們就鍵入以下的SQL:SELECTstore_name,CASEstore_nameWHEN'LosAngeles'THENSales*2WHEN'SanDiego'THENSales*1.5ELSESales"NewSales",FROMNewLosNewLosSanSan算列出每一行的是一個(gè)常見(jiàn)的需求,可惜SQL并沒(méi)有一個(gè)很直接的方式達(dá)到這個(gè)需求。要以SQL列出,基本的概念是要做一個(gè)表格自我連結(jié)(selfjoin),將結(jié)果依序列出,然后算出每一行之前(包含那一行本身)有多少行數(shù)。這樣講讀者聽(tīng)得可能有點(diǎn)困惑,所以Total_SalesS要找出每一行的,我們就打入以下的SQL語(yǔ)句SELECTa1.Name,a1.Sales,COUNT(a2.sales)Sales_RankFROMTotal_Salesa1,Total_Salesa2WHEREa1.Sales<=a2.SalesOR(a1.Sales=a2.SalesANDa1.Name=a2.Name)GROUPBYa1.Name,a1.SalesODERBYa1.SalesDESC,a1.Name結(jié)果12S3356WHERE(a1.Salesa2.Sales),我們算出有多少筆資料Sales欄位的值是比自己本身的值小或是相等。如果在Sales欄位中沒(méi)有同樣大小的資料,那這部分的WHERE子句本身就可以產(chǎn)生出正確的。子句的第二部分,(a1.Sales=a2.SalesANDa1.Namea2.Name)Sales欄位中有同樣大小的資料時(shí)(像Sla及Jeff這兩筆資料),仍然能夠產(chǎn)生正確的。找出『中間』的為何。舉例來(lái)說(shuō),如果總共有9筆資料,那中間就是5(有4545筆資料小)。Total_SalesSSELECTSalesMedian(SELECTa1.Name,a1.Sales,COUNT(a1.Sales)RankFROMTotal_Salesa1,Total_Salesa2WHEREa1.Sales<a2.SalesOR(a1.Sales=a2.SalesANDa1.Name<=a2.Name)GROUPBYa1.Name,a1.SalesODERBYa1.SalesDESC)WHERERank=(SELECT(COUNT(*)+1)DIV2FROM結(jié)果讀者將會(huì)發(fā)現(xiàn),第2行到第6行是跟產(chǎn)生的語(yǔ)句完全一樣。第7行則是算出中間的DIV是在MySQL中算出商的方式在不同的數(shù)據(jù)庫(kù)中會(huì)有不同的方式求商第1SQL并沒(méi)有一個(gè)很直接的方式達(dá)到這個(gè)需求。要以SQL算出累積總計(jì),基本上的概念與列出類似:第一是先做個(gè)表格自我連結(jié)(selfjoin),然后將結(jié)果依序列出。在做列出時(shí),我們算出每一行之前(包含那一行本身)有多少行數(shù);而在做累積總計(jì)時(shí),我們則是算出每一行之前(包含那一行本身)的總合。Total_SalesSSELECTa1.Name,a1.Sales,SUM(a2.Sales)Running_TotalFROMTotal_Salesa1,Total_Salesa2WHEREa1.Sales<=a2.salesOR(a1.Sales=a2.SalesANDa1.Name=a2.Name)GROUPBYa1.Name,a1.SalesODERBYa1.SalesDESC,a1.Name結(jié)果SSQLWHERE子句和ODERBY子句讓我們能夠在有重復(fù)值時(shí)能夠算要用SQL算出總合百分比,我們需要用到算和累積總計(jì)的概念,以及運(yùn)用子查詢的做法。在這里,我們把子查詢放在外部查詢的SELECT子句中。讓我們來(lái)看以下的例子:Total_SalesSSELECTa1.Name,a1.Sales,a1.Sales/(SELECTSUM(Sales)FROMTotal_Sales)Pct_To_TotalFROMTotal_Salesa1,Total_Salesa2WHEREa1.Sales<=a2.salesOR(a1.Sales=a2.SalesANDa1.Name=a2.Name)GROUPBYa1.Name,a1.SalesODERBYa1.SalesDESC,a1.Name結(jié)果S"SELECTSUM(Sales)FROMTotal_Sales"SQL累積總合百分比算出,我們運(yùn)用類似總合百分比的概念。兩者的不同處在于在這Total_SalesSSELECTa1.Name,a1.Sales,SUM(a2.Sales)/(SELECTSUM(Sales)FROMTotal_Sales)WHEREa1.Sales<=a2.salesOR(a1.Sales=a2.SalesANDa1.Name=a2.Name)GROUPBYa1.Name,a1.SalesODERBYa1.SalesDESC,a1.Name結(jié)果S"SELECTSUM(Sales)FROMTotal_Sales"這一段子查詢是用來(lái)算出總合。我們接下來(lái)用累積總計(jì)"SUM(a2.Sales)"除以總合來(lái)求出每一行的累積總合百分比。數(shù)據(jù)類SQLSERVERSQLServer25·Binary·CharBinary、VarbinaryBinary數(shù)據(jù)類型既可以是固定長(zhǎng)度的(Binary),Binary[(n)]n位固定的二進(jìn)制數(shù)據(jù)。其中,n18000。其窨的大小是n+4個(gè)字節(jié)。Varbinary[(n)]n位變長(zhǎng)度的二進(jìn)制數(shù)據(jù)。其中,n18000。其窨的大小是n+4n個(gè)字節(jié)。在Image數(shù)據(jù)類型中的數(shù)據(jù)是以位字符串的,不是由SQLServer解釋的,BMP、TIEF、GIFJPEG格式把數(shù)據(jù)在Image數(shù)據(jù)類型中。Char,VarcharVarchar8KB。Char是定長(zhǎng)字符數(shù)據(jù),其長(zhǎng)度最多為8KB。超過(guò)8KB的ASCII數(shù)據(jù)可以使用Text數(shù)據(jù)類型。例如,因?yàn)镠tml文檔全部ASCII8KBText數(shù)據(jù)類型存SQLServer中。UnicodeUnicodeNchar,Nvarchar在SQLServer中,傳統(tǒng)的非Unicode數(shù)據(jù)類型允許使用由特定字符集定義SQLServerUnicode數(shù)據(jù)類型,列中可以任何由Unicode標(biāo)準(zhǔn)定義的字符。在Unicode標(biāo)準(zhǔn)中,包括了以各種字符集定義UnicodeUnicode數(shù)據(jù)類型所占用的窨在SQLServer中,Unicode數(shù)據(jù)以Nchar、Nvarchar和Ntext數(shù)據(jù)類型。使用這字符類型,這時(shí)最多可以4000個(gè)字符。當(dāng)列的長(zhǎng)度固定不變時(shí),應(yīng)該使用Nchar字符類型,同樣,這時(shí)最多可以4000個(gè)字符。當(dāng)使用Ntext數(shù)據(jù)類型時(shí),該列可以多于4000個(gè)字符。DatetimeSmalldatetime8/17/98時(shí)間在后一個(gè)數(shù)據(jù)類型是霎時(shí)間,日期在后。在SQLServer中,日期和時(shí)間數(shù)據(jù)類型包括DatetimeSmalldatetime兩種類型時(shí),所的日期范圍是從1753年1月1日開(kāi)始,到9999年12月31日結(jié)束(每一個(gè)值要求8個(gè)字節(jié))。使用Smalldatetime數(shù)據(jù)類型時(shí),所的日期范圍是1900年1月1日開(kāi)始,到2079年月31日結(jié)束(每一個(gè)值要求4個(gè)字節(jié))SetDateFormat{format|@format其中,format|@format_varMDYDMYYMDYDM、MYD和DYMMDY。SetDateFormatYMDSetDateFormatDMY之后,日期的格式為日月有年形式,整數(shù)由正整數(shù)和負(fù)整數(shù)組成,例如39、25、0-2和33967。在MicrsoftSQLServer中, Int,Smallint和Tinyint。Int數(shù)據(jù)類型數(shù)據(jù)的范圍大于Smallint數(shù)據(jù)類型數(shù)據(jù)的范圍而Smallint據(jù)類型數(shù)據(jù)的范圍大于Tinyint數(shù)據(jù)類型數(shù)據(jù)的范圍。使用Int數(shù)據(jù)狗昔數(shù)據(jù)的范圍是從-2147483648到2147483647(每一個(gè)值要求4個(gè)字節(jié)空間。使用Smallint數(shù)據(jù)類型時(shí)數(shù)據(jù)的范圍從-32,768到32767(每一個(gè)值要求2個(gè)字節(jié)空間。使用Tinyint數(shù)據(jù)類型時(shí),數(shù)據(jù)的范圍是從0到255(每一個(gè)值要求1個(gè)字節(jié)空間。精確數(shù)據(jù)在SQLServer中的數(shù)據(jù)類型是Decimal和Numeric。這種數(shù)據(jù)所占的SQLServerFloatReal。例如,三分之一這個(gè)分?jǐn)?shù)記作。,當(dāng)使用近似數(shù)據(jù)類型時(shí)能準(zhǔn)確表示。因此,從系統(tǒng)中檢索到的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論