下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章數(shù)據(jù)的排序,和分本章主要內(nèi)容:上一章已經(jīng)學(xué)習(xí)了從表中查詢數(shù)據(jù)。有的時(shí)候這樣的選擇結(jié)果排列的并不是非常合理。因?yàn)?,一般?lái)說(shuō),查詢的結(jié)果是按照數(shù)據(jù)被添加到表時(shí)的順序來(lái)排列。因此,需要ORDERBYSQLORDERBY子句以使查詢結(jié)果按照用戶的需要進(jìn)行排列,以便于用戶閱讀。ORDERBY的基本格式如下:SELECTselect_listFROMtable_list[WHEREconditions][ORDERBYcolumnname|alias|position[ASC|在ORDERBY子句中也可以包含多個(gè)元素,元間也是使用逗號(hào)隔開(kāi)ASCDESC表示按ORDERBYSELECT子句中一個(gè)列的名稱——columnname;也可SELECT子句中為列或表達(dá)式創(chuàng)建的別名——aliasSELECT子句中代表位置的編碼——position1SELECT子句中第一個(gè)列,2表示SELECT子句中第二個(gè)列。如果沒(méi)有使用ORDERBY子句,返回的數(shù)據(jù)將按照表中數(shù)據(jù)的物理順序排列,Employee表創(chuàng)建索引,在這種情況下查找所有工資為3000.00元和6000.00元的工作人SELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=————男女男男男男男男男女剛男序,可以這樣使用SELECT語(yǔ)句:SELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=6000.00ORDERBYid————男男男女男男女男男男剛男EmployeeidCREATEINDEXSELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=————男男男女男男女男男男剛男對(duì)比上面使用索引和不使用索引而對(duì)dODERBY子句,那么為什么還要提供索引呢?實(shí)際上,雖然上面的顯示結(jié)果是相同的,但是索引與ORDERBY子句是兩個(gè)完全不同的概念:創(chuàng)建了索引,數(shù)據(jù)庫(kù)系統(tǒng)就將為索引建立了一個(gè)對(duì)應(yīng)的物理對(duì)象,ODERBY子句的SQLODERBY子句指定的條件到物理磁盤上,每次都必須指定ORDERBY子句以重新將數(shù)據(jù)進(jìn)在排序中您可以指定按照什么順序來(lái)排序:升序或降序。SQL中,關(guān)鍵字ASC表DESC表示按照降序排列。而默認(rèn)的排序方式為升序,也就是DESCASC,那么顯示結(jié)果將按照從低到高的順序排列。當(dāng)然,為了使用戶能更好的明白顯示結(jié)果的排列順序,您也可以指定ASC。3000.006000.00id列降序排列,可以這樣使用SELECT語(yǔ)句:SELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=6000.00ORDERBYidDESC————?jiǎng)偰心心心信心信心心蠸ELECTname,sex,idFROMEmployeeWHEREnameBETWEEN’王AND’張ORDERBY—男女男女男男男女女剛男男ORDERBYASCDESC,因此結(jié)果按照在SQL中字符之間是怎么排序的呢?特殊字符又是怎么排序的呢?特殊字符與普通字符間是怎么排序的呢?“A”在“”之前么?大小寫是否有區(qū)別呢?字符的排序取決于數(shù)據(jù)庫(kù)系統(tǒng)使用的字符集和字符集中字符的順序。在SQL中,并沒(méi)有限定字符集與排序順序,而是可以由數(shù)據(jù)庫(kù)系統(tǒng)自行決定。多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)都允許用戶安裝或選擇自己想使用的字符集,系統(tǒng)中也有默認(rèn)的字符集設(shè)置和排序順序,使用時(shí)請(qǐng)注意查看系統(tǒng)文檔。年1月1號(hào)之后開(kāi)始的項(xiàng)目,并按照日期的先后進(jìn)行降序排序,可以這樣使用SELECTSELECTpnumber,budget,pstrdateFROMProjectWHEREpstrdate>’2002-01-ORDERBYpstrdate
2002-12-2002-04-2002-01-SELECT子句中的表達(dá)式來(lái)對(duì)查詢結(jié)果進(jìn)行排序。這時(shí)就不能直接在ORDERBY子句中直接使用表達(dá)式。如,按照項(xiàng)目利潤(rùn)排序:SELECTpnumber,budget,gross,gross-budgetFROMProjectORDERBYgross-在SL2SL3DS將通過(guò)對(duì)表達(dá)式的比較而不是列名的比較進(jìn)行排列。不同的數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)也有所不同,有的SELECTpnumber,budgetFROMProjectORDERBY但是,SQL3的這兩個(gè)特性使得編寫的代碼不夠系統(tǒng)。因此,建議仍使用SQL2的ORDERBYSELECT列表中的ORDERBYORDERBYcolumnname|alias|position[ASC|ORDERBYcolumnname排序,也可以使用為表達(dá)式創(chuàng)建的別名排序,還可以按照其在SELECT子句中的位置position排序。如,查詢Projiect表中每個(gè)項(xiàng)目的利潤(rùn),為利潤(rùn)創(chuàng)建別名“profit”,并且按照升序的順序進(jìn)行排序,可以這樣使用ORDERBY子句:SELECTpnumber,budget,gross,gross–budgetASprofitFROMProjectWHEREprofit>=30000.00profit<=70000.00ORDERBYprofit如果沒(méi)有為表達(dá)式創(chuàng)建別名也沒(méi)有關(guān)系,SQLSELECT子句列表中的位置來(lái)指定排序的列。例如,查詢Projiect表中每個(gè)項(xiàng)目的利潤(rùn),并且按照降序的順序進(jìn)行排序,在沒(méi)有為利潤(rùn)創(chuàng)建別名的情況下,可以這樣使用ORDERBY子句:SELECTpnumber,budget,gross,gross–budgetFROMProjectWHEREprofit>=30000.00profit<=70000.00ORDERBY4DESC gross–SELECT列表中的列,如刪除一列、改變列的先后順序等等,這時(shí)需要注意ORDERBY子句中使用的位置代表的列是否發(fā)生了變化。例如,在SELECT列表中增加pmgrid列,如果仍這樣使用ORDERBY子句:SELECTpnumber,pmgrid,budget,gross,gross–budgetFROMProjectWHEREprofit>=30000.00profit<=70000.00ORDERBY4DESCgross–從查詢結(jié)果可以看出結(jié)果按照gross列降序排列,而不是按照利潤(rùn)降序排列??梢?jiàn)4不再代表列“gross–budgetgross列了。如果還要按照利潤(rùn)對(duì)結(jié)果SELECTpname.pnumber,budget,gross,gross–FROMWHEREprofit>=30000.00profit<=70000.00ORDERBY5DESC多級(jí)排清晰。例如,公司想知道每個(gè)部門工作人員的薪水情況,將工作人員的記錄按照salary列進(jìn)行排序,使用SELECT語(yǔ)句:SELECTname,sex,id,salaryFROMEmployeeORDERBY————女男男男男男女剛男男男女女女女女男男男男男男男男男salaryidsalary列的值相同的列進(jìn)行再次排序,使用SELECT語(yǔ)句:SELECTname,sex,id,salaryFROMEmployeeORDERBY————男男女男男女男剛男男女女女女女男男男男男男男男男男DESCASC關(guān)鍵字,以指定排序的列是按照DESC與ASC關(guān)鍵字的使用是互不干擾的。例如,按照salary列降序排序,再按照id列升序排序:SELECTname,sex,id,salaryFROMEmployeeWHEREnameBETWEEN’王AND’張ORDERBYsalaryDESC,id
————
———男 男 男 男 男 女 女 女 女 男 SELECTname,sex,id,salaryFROMEmployeeORDERBY4DESC,3————男男男男男男男男男男女女女女女男男男女男男女男剛男由于SQL支持多級(jí)排序,因此,在需要的時(shí)候您就可以使查詢結(jié)果按照所需的方空值的SQLServerProjiect表中每個(gè)項(xiàng)目ORDERBY子句:SELECTpnumber,budget,gross,gross–budgetASprofitFROMProjectORDERBYOracleProjiect表中每個(gè)項(xiàng)目的利潤(rùn),為利潤(rùn)創(chuàng)建別名“profitORDERBYSELECTpnumber,budget,gross,gross–budgetASprofitFROMProjectORDERBY6.2數(shù)同記錄的情況,或者希望知道平均值、最大值等要求,沒(méi)關(guān)系不必?fù)?dān)心,SQL還提供了去除相SELECT子句中有兩個(gè)可選的關(guān)ALLSELECT[ALL|DISTINCT]ALL為默認(rèn)選項(xiàng),表示列出所有記錄,而不管是否出現(xiàn)重復(fù)。如果要去掉重復(fù)的記DISTINCTDISTINCT對(duì)一列或多列的組合進(jìn)行重復(fù)的3000.00dno列進(jìn)行排序,當(dāng)在SELECT子句中不使用DISTINCT關(guān)鍵字時(shí):SELECTdnoFROMEmployeeWHEREsalary=3000.00ORDERBYdno11223355DISTINCTSELECTDISTINCTFROMWHEREsalary=3000.00ORDERBYdno1235DISTINCT關(guān)鍵字時(shí)需要注意:DISTINCTselect_list之前使SELECTdno,DISTINCTFROMWHEREsalary=3000.00ORDERBYdnoSELECT子句中包含多個(gè)列時(shí),DISTINCT是對(duì)列的組合進(jìn)行去除的。例如下面的SELECT語(yǔ)句:SELECTDISTINCTname,dnoFROMEmployeeWHEREsalary=ORDERBY 12233 顯示結(jié)果表明,dnonamedno列的組合并沒(méi)有出現(xiàn)重復(fù)。所以沒(méi)有刪除dno列中的重復(fù)數(shù)據(jù)??梢?jiàn),DISTINCT是對(duì)列的組合進(jìn)行去除DISTINCT關(guān)鍵字,所有的例如,查詢工資為3000.00元的工作人員的名字、所屬部門號(hào)、參與的項(xiàng)目號(hào),可以這樣使用SELECT語(yǔ)句:SELECTDISTINCTname,dno,pnoFROMEmployeeWHEREsalary=3000.00ORDERBYdno1122335剛5從本例查詢結(jié)果再次證明,DISTINCTSELECTSELECTDISTINCTdno,FROMWHEREsalary=3000.00ORDERBYdno 的行。可見(jiàn)DISTINCT中空值是相同的。SELECTSELECTDISTINCTFROMWHEREsalary=3000.00ORDERBYpno6.2.2函出Project表中所有記錄的budget:SELECTpnumber,budgetFROMProject您可以使用SQL提供的函數(shù)SUM()。SELECTSUM(budget)FROMProject函數(shù)是SQL中很重要的一部分。函數(shù)不是對(duì)某個(gè)記錄進(jìn)行操作,而是對(duì)function([DISTINCT]expression通常是一個(gè)列名或者別名,但也可以是一個(gè)常量或者一個(gè)函數(shù)(SQL支持函數(shù)的嵌套)。表6-1列出了SQL中支持的函數(shù)。表6- SQL支持的函含COUNT(SUM(AVG(MAX(MIN(COUNT、SUM()、AVG()DISTINCT關(guān)鍵字,以在計(jì)算中MAX()、MIN()COUNT(*)由于不會(huì)改變其結(jié)果,因此沒(méi)有必要使用DISTINCT。SUM()、AVG()COUNT()、MAX()、MIN()與COUNT(*)可以對(duì)所有數(shù)據(jù)類型使用。VARIANCE()函數(shù),ASALIST()函數(shù)。使用時(shí)請(qǐng)注意查閱系統(tǒng)SELECTSUM(budget)ASTotalFROMProjectWHERE有時(shí)您可能不需要對(duì)所有的記錄都進(jìn)行函數(shù)操作,而僅需要對(duì)符合條件的記錄進(jìn)行與WHEE行WHE子句到滿件錄后查的錄數(shù)計(jì)。SELECTSUM(budget)ASTotalFROMProjectWHEREbudget<同時(shí)需要注意的是:在WHERE子句中不能使用函數(shù)。例如,您可能想查找所SELECTFROMWHEREbudget>SELECTFROMProjectWHEREbudget>(SELECTAVG(budget)FROMProject)8以同時(shí)使用SUM()與COUNT()函數(shù):SELECTSUM(budget)ASTotal,COUNT(budget)ASNumberFROMProjectWHEREbudget< COUNT()COUNT()函數(shù)可以用來(lái)計(jì)算查詢結(jié)果中某個(gè)特定列出現(xiàn)的次數(shù)。SQL提供了COUNT()和COUNT(*)函數(shù)。這兩個(gè)函數(shù)很相似,但使用是完全不同的。通過(guò)下面的SELECTFROMProject12gross列的值為空值,上面的計(jì)算結(jié)果僅為10,可以看出COUNT(column)函數(shù)并不把column在內(nèi)。再看看COUNT(*)函數(shù)的使用:SELECTFROM可見(jiàn),COUNT(*)函數(shù)計(jì)算所有的記錄,不用考慮空值。當(dāng)然,如果COUNT()函數(shù)在沒(méi)有空值的列上進(jìn)行計(jì)算得到的值與COUNT(*)函數(shù)相同。例如,在dnumber列上使用COUNT()函數(shù):SELECTCOUNT(dnumber)FROMProject可以看見(jiàn)計(jì)算的結(jié)果與使 COUNT(*)函數(shù)計(jì)算的結(jié)果相同COUNT()不僅可以對(duì)數(shù)字類型的列使用,也可以對(duì)其它數(shù)據(jù)類型的列使用,如字符串類型。例如,計(jì)算公司有多少工作人員,可以對(duì)Employee表中的name列使用COUNT()函數(shù),其中可以再比較一下COUNT()和COUNT(*)兩個(gè)函數(shù)的結(jié)果:SELECTCOUNT(name),FROM DISTINCTCOUNT中唯一值的數(shù)目。例如,下面的查詢計(jì)算了在Projectgross列唯一值的數(shù)目:SELECTCOUNT(DISTINCTFROMCOUNT(DISTINCT8因此使用DISTINCT關(guān)鍵字后COUNT()函數(shù)返回的值為8。注意:DISTINCT注意:DISTINCTCOUNT(*)COUNT(*)計(jì)算的是表中含DISTINCTCOUNT(*SELECTCOUNT(DISTINCTFROMCOUNT使用一個(gè)臨時(shí)表或視圖不同DISTINCTCOUNTCREATEVIEWtemp_tableSELECTDISTINCTsex,salaryFROMEmployeeSELECTFROMtemp_talbeORDERBY 這樣臨時(shí)視圖中了唯一的sex列與salary列的組合的值。接著,對(duì)臨時(shí)的視SELECTCOUNT(*)ASFROM7SUMAVG()SUM(column)columnAVG(column)函數(shù)用來(lái)計(jì)算選擇的行中column列所有值的平均值。因此,SUMAVG(SUMAVGSELECTSUM(gross),AVG(gross)FROMProject SELECTCOUNT(gross),FROM 268000.00.0010SUMAVG(注意:AVG()函數(shù)中計(jì)算值的數(shù)目時(shí),并不會(huì)將空值計(jì)算在內(nèi)。如上例中,雖然Project注意:AVG()函數(shù)中計(jì)算值的數(shù)目時(shí),并不會(huì)將空值計(jì)算在內(nèi)。如上例中,雖然Project12grossDISTINCT關(guān)鍵字也可以在SUM()與AVG()函數(shù)中使用。在SUM()函數(shù)中使用DISTINCT,SUM()函數(shù)將只計(jì)算列中唯一值的總和。在AVG(DISTINCT,使用SUM()與AVG()函數(shù):SELECTSUM(DISTINCTgross),AVG(DISTINCTFROMSUM(DISTINCT AVG(DISTINCT DISTINCTDISTINCT是不同的。當(dāng)DISTINCT關(guān)鍵字包含在函數(shù)中時(shí),它是在函數(shù)計(jì)算時(shí)起作用,并不與規(guī)則——DISTINCTselect_list之前使用——相違背。在SELECTselect_list前SELECTCOUNT(DISTINCTgross),FROMCOUNT(DISTINCT 可見(jiàn),唯一值有8個(gè)。與不使用DISTINCT關(guān)鍵字時(shí)相比,使用DISTINCT關(guān)鍵字的SUM()函數(shù)沒(méi)有將重復(fù)值進(jìn)行多次計(jì)算,因此SUM()函數(shù)得出的值為.00,而包含DISTINCT鍵字的AVG()函數(shù)得到的是.00/8=.00的值,即得到MAXMINMAX(column)函數(shù)用來(lái)計(jì)算選擇的行中column列包含的所有值中最大的值。而MIN(column)函數(shù)用來(lái)計(jì)算選擇的行中column列包含的所有值中最小的值。因此,MAX()與MIN()函數(shù)中沒(méi)有必要使用DISTINCT關(guān)鍵字。SELECTMAX(gross),MIN(gross)FROMProject 注意注意:當(dāng)列中存在非空值時(shí),MAX(MIN(非空值存在,MAX(MIN(MAX(MIN(日期類型數(shù)據(jù)使用,當(dāng)然對(duì)于字符串與時(shí)間日期類型數(shù)據(jù)空值也是不大于或小于任何值。EmloyeeameMAX(MIN()函數(shù):SELECTMAX(name),MIN(name)FROMEmployee SQL3ROLLUPCUBE關(guān)鍵字。ROLLUP意思是從所有每個(gè)所成的組的列中得出每一個(gè)組的組;CUBE意思是通過(guò)組合成組列的所有可能的組合,從所有組中得出一個(gè)組。ROLLUPCUBE關(guān)鍵字的使用比較復(fù)雜,也比較晦澀,由于在使用中6.2.3避免使用DISTINCT時(shí)的要查找記錄中唯一的組合,您可以使用DISTINCT關(guān)鍵字。但是,初學(xué)者對(duì)于對(duì)其注意事項(xiàng)做了介紹,但為了您更好的掌握DISTINCT,這兒對(duì)注意的地方進(jìn)行一下總在列和表達(dá)式中使用DISTINCT時(shí),只能使用一次DISTINCTDISTINCT是對(duì)SELECTDISTINCT時(shí)有了很大的限制,分別對(duì)每個(gè)列或表達(dá)式指定是否包含DISTINCT。下面的例子可以更好的幫助您理解這樣的限制。查找收入低于300000.00元的項(xiàng)目SELECTDISTINCTFROMWHEREgross<300000.00SELECTDISTINCTgross–budgetASprofitFROMProjectWHEREgross<SELECTDISTINCTgross,gross–budgetASprofitFROMProjectWHEREgross<ORDERBY 其中,gross180000.00280000.00,profit也出現(xiàn)了重復(fù),四個(gè)40000.00。DISTINCTDISTINCT是互不干擾的,它是在函數(shù)計(jì)算時(shí)起作用,并不與規(guī)則——DISTINCTselect_list之前使用——相違背。例如,可以在SUM()函數(shù)與AVG()函數(shù)中分別使用:SELECTSUM(DISTINCTgross),AVG(DISTINCTFROMSUM(DISTINCT AVG(DISTINCT SELECTSUM(DISTINCTgross),FROMSUM(DISTINCT 在函數(shù)中使用DISTINCT與在SELECT列表中使用DISTINCT區(qū)別還是比較大的。錯(cuò)誤是使用帶有DISTINCT關(guān)鍵字的COUNT(*)函數(shù),如:SELECTCOUNT(DISTINCTFROM其中,對(duì)特定列計(jì)算不同值的數(shù)目比較簡(jiǎn)單,您可以在COUNT()函數(shù)中使用DISTINCT關(guān)鍵字從而直接得出正確結(jié)果。使用一個(gè)臨時(shí)表或視圖不同DISTINCT不同點(diǎn):對(duì)其它運(yùn)算符而言,空值之間是互不相同的,而且要想查找到空值需ISNULLDISTINCT來(lái)說(shuō),將空值看作是相同的,也不需要使用ISNULL。SELECTgrossFROMWHEREgross<200000.00grossISSELECTDISTINCTFROMWHEREgross<DISTINCTISNULL關(guān)鍵字就可以查找出空值,而且將所有的空值看成是相同的。所以,使用DISTINCT關(guān)鍵字去掉了一個(gè)重復(fù)的180000.00,同時(shí)也去掉一個(gè)重復(fù)的NULL。學(xué)習(xí)了函數(shù)后,有的時(shí)候可能希望對(duì)一組數(shù)據(jù)使用函數(shù)。例如,統(tǒng)計(jì)每個(gè)部門工資總額,就可以使用函數(shù)SUM()函數(shù)為每個(gè)部門進(jìn)行計(jì)算,如計(jì)算部門號(hào)為1的部門工資總額:SELECTSUM(salary)FROMEmployeeWHEREdno=1然而,您會(huì)發(fā)覺(jué)無(wú)法在一個(gè)查詢中完成所有部門的工資總額的計(jì)算,而必須為每一個(gè)部門使用一個(gè)查詢,而且您必須對(duì)部門的個(gè)數(shù)有清楚的了解。這樣使用是非常不方便,SQLGROUPBYGROUPBYGROUPBY子句根據(jù)列的內(nèi)容對(duì)查詢結(jié)果進(jìn)行分類。GROUPBY子句的基本格式SELECT[ALL|DISTINCT]select_listFROMtable_list/view_list[WHEREconditions][GROUPBYgroup_list][HAVINGconditions][ORDERBYorder_list]GROUPBY時(shí),order_listselect_list中,即不能選擇select_listdnoSELECT列表中,下面的SQL語(yǔ)句將無(wú)法運(yùn)行:SELECTSUM(salary)FROMEmployeeGROUPBYdno注意注意GROUPBYGROUPBYGROUPBY子句來(lái)方便的完成每個(gè)部SELECTdno,SUM(salary)FROMEmployeeGROUPBY — 3456GROUPBYGROUPBY子句可以用來(lái)對(duì)數(shù)據(jù)進(jìn)行分組,將數(shù)據(jù)分成組并為每一組返回一行。在不使用函數(shù)時(shí),使用GROUPBY與DISTINCT類似。SELECTDISTINCTFROMEmployeeORDERBYdno123456GROUPBYSELECTdnoFROMEmployeeGROUPBYdnoGROUPBY6個(gè)部門,—123456可見(jiàn),查詢結(jié)果是相同的。GROUPBY與DISTINCT另一個(gè)相似之處是:與DISTINCT一樣,GROUPBYGROUPBY與函GROUPBY子句與函數(shù)有密切的聯(lián)系,可以說(shuō)沒(méi)有函數(shù)GROUPBY子句也就沒(méi)有多大的用處。GROUPBY子句可以將查詢到的數(shù)據(jù)分成組,而函數(shù)則用來(lái)GROUPBYSELECTsalary,COUNT(*)FROMEmployeeGROUPBY SELECTdno,AVG(salary)FROMEmployeeGROUPBY —123456WHERE排序中可以使用WHERE子句以對(duì)特定的記錄進(jìn)行排序,在分組中也可以使用WHEREWHERE子句將符合條件的記錄選出,再對(duì)選出的數(shù)據(jù)進(jìn)行分組。當(dāng)然,WHERE子句中使用的列并不是一定要在SELECT列表中出現(xiàn)。3000.00SELECTdnoFROMEmployeeWHEREsalary=3000.00GROUPBYdno1235多次分ODERYOUPY以指定多個(gè)列對(duì)一組數(shù)據(jù)再次進(jìn)行分組。多個(gè)列之間也是使用逗號(hào)分隔。執(zhí)行順序也與SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBY—男男女男女男34女35男35女16男2再按照dno列進(jìn)行分組:SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBY—2女13女24女35女11男52男23男24男35男36男2SQL的讀者可能并不能完全掌握。例如,要句進(jìn)行查詢:SELECTdno,COUNT(id),sex,COUNT(id)FROMEmployeeGROUPBY—男男女男232女243男343女353男351女162男2COUNT(dCOUNT(d)并不是對(duì)每個(gè)部門工作人員人數(shù)進(jìn)行了計(jì)算。函數(shù)是對(duì)進(jìn)行多次分組之后形成的小組進(jìn)行計(jì)算的。因此,要實(shí)現(xiàn)上面的計(jì)算,必須使用兩個(gè)查詢,分別計(jì)算每個(gè)部門工作人員的人數(shù)及部門中男女工作人員各自的人數(shù)。SELECTdno,FROMEmployeeGROUPBYdno — 2SELECTdno,sex,COUNT(id)FROMEmployeeGROUPBYdno,SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYdno,SELECTsex,FROMEmployeeGROUPBYsex — Oracle中提供了工具來(lái)ORDERBYORDERBYGROUPBY子句一起使用以對(duì)結(jié)果進(jìn)行排序,更清晰的顯示結(jié)果。SQL語(yǔ)句書寫時(shí),ORDERBYGROUPBY子句之后書寫。這兩個(gè)GROUPBYORDERBY例如,列出工資為3000.00的工作人員所屬的所有部門號(hào),并按照降序排列,可以SELECTdnoFROMEmployeeWHEREsalary=3000.00GROUPBYdnoORDERBYdno5321注意:ORDERBY子句中使用的列名必須是GROUPBY子句中包含的列名 在ODERBYGROUPBY列表之外包含的列名將會(huì)產(chǎn)生錯(cuò)誤。例如,計(jì)算每個(gè)部門的平均工資水平,這時(shí)應(yīng)該對(duì)部門進(jìn)行分組,如果將結(jié)果按照平均工資進(jìn)SQL語(yǔ)句:SELECTdno,AVG(salary)ASavgFROMEmployeeGROUPBYdnoORDERBY — 相反地,上面的語(yǔ)句是不能運(yùn)行的,根本不可能產(chǎn)生上面的查詢結(jié)果。SQL引擎將當(dāng)然必須是包含在GROUPBY子句中的列。例如,計(jì)算每個(gè)部門中和女性工作人員的數(shù)目,并將結(jié)果按照dno列降序排列,可以這樣使用GROUPBY子句:SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYdno,sexORDERBYdnoDESC,sex—6男25女15男34女34男33女23男22女12男21男5ORDERBYGROUPBY子句中列的順序不同。例如,上面的例子可以先按照sex列排序,再按照id列進(jìn)行排序:SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYORDERBYsex,dno—5女女女女男男4男33男22男21男5當(dāng)然,GROUPBY子句中有多個(gè)列時(shí),ORDERBY子句也可以僅使用其中的部分列進(jìn)行排序。例如,可以僅按照dno列進(jìn)行排序:SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYdno,sexORDERBYdnoSELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYdno,sexORDERBYsexHAVING子SELECTWHEREGROUPBY子句時(shí),也可以HAVING子句及函數(shù)時(shí),執(zhí)行順序如下:GROUPBY對(duì)GROUPBY子句形成的組運(yùn)行函數(shù)計(jì)算每一組的值HAVING子句去掉不符合條件的組。例如,刪除工作人員數(shù)目小于4的部門號(hào):SELECTdno,FROMEmployeeGROUPBYdnoHAVINGCOUNT(*)> — 64HAVING使用HAVING子句時(shí),需要注意的是:HAVING子句中的每一個(gè)元素也必須出現(xiàn)SELECTHAVINGSELECT列表SELECTdno,FROMEmployeeGROUPBYdnoHAVINGSUM(salary)> — 雖然HAVING子句通常與函數(shù)一起使用,但是HAVING子句中也可以不使用SELECT10000.006HAVING子SELECTdno,FROMEmployeeGROUPBYdnoHAVINGdno<>6 — HAVINGAND、ORNOT運(yùn)算符來(lái)包含多個(gè)限制條件。例如,SELECTdno,AVG(salary),SUM(salary)FROMEmployeeGROUPBYHAVINGSUM(salary)>10000.00AVG(salary)<—235SELECTHAVINGHAVING子句與WHERE子句都可以用來(lái)設(shè)定限制條件以使查詢結(jié)果滿足一定的10000.00元的組,可以使用HAVING子句設(shè)置限制:SELECTdno,SUM(salary)FROMEmployeeGROUPBYHAVINGSUM(salary)> — SELECTdno,SUM(salary)FROMEmployeeWHEREdno<>6GROUPBYdno — 但是,WHERE子句與HAVING子句并不是相同的:HAVING子句限制的是組,而不是行;WHERE子句用于限制查找的行,而不是對(duì)形成的組進(jìn)行限制。即WHERE子句產(chǎn)生用于成組的行,HAVINGWHERE子句中不允許使用函數(shù),而HAVING子句中卻可以使用。WHERE子句也有自己的優(yōu)點(diǎn),它比HAVING子句更有效。因?yàn)閃HERE子句刪除行,這樣用于成組的行更少,函數(shù)也在更少的行上進(jìn)行計(jì)算,而HAVING子句不能限制成組的行,只能對(duì)組的值進(jìn)行4.綜合使用各SELECTdno,AVG(salary),SUM(salary)FROMEmployeeWHEREdno>2GROUPBYdnoHAVINGSUM(salary)>10000.00AVG(salary)<4000.00ORDERBYdnoDESCdno2dno的值進(jìn)行分組,并對(duì)分組結(jié)果進(jìn)行限制,最后將結(jié)果按照dno列進(jìn)行降序排列: —53空值的SELECTpno,FROMEmployeeGROUPBYpnoORDERBYpno WHERE子句以去除分組結(jié)果中的空值。例如,計(jì)算參與各項(xiàng)目pnopnoNULL的SELECTpno,FROMWHEREpnoISNOTNULLGROUPBYpnoORDERBY 當(dāng)分組中包含空值時(shí),需要注意COUNT(*)與COUNT()的區(qū)別。例如,對(duì)上例使用COUNT()進(jìn)行計(jì)算:SELECTpno,COUNT(pno)FROMEmployeeGROUPBYpnoORDERBY 注意,使用COUNT()進(jìn)行計(jì)算
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年寶鈦集團(tuán)有限公司高層次人才招聘考試筆試備考題庫(kù)及答案解析
- 2026山西忻州市岢嵐縣兵役登記暨征兵參考筆試題庫(kù)附答案解析
- 2025山東濱州醫(yī)學(xué)院煙臺(tái)附屬醫(yī)院高級(jí)專業(yè)技術(shù)崗位招聘1人參考考試試題及答案解析
- 2025北京坤泰昌盛建筑工程有限公司投標(biāo)專員招聘?jìng)淇脊P試題庫(kù)及答案解析
- 2025浙江嘉興市海寧市老干部活動(dòng)中心招聘1人參考考試題庫(kù)及答案解析
- (15篇)施工管理崗總結(jié)
- 網(wǎng)店使用合同范本
- 網(wǎng)用戶保密協(xié)議書
- 耗苗購(gòu)買合同范本
- 職工合同聘用協(xié)議
- 綠化黃土采購(gòu)合同協(xié)議
- 醫(yī)保中心對(duì)定點(diǎn)二級(jí)醫(yī)院建立住院信息月報(bào)制度
- DB50/T 675-2016 資源綜合利用發(fā)電機(jī)組單位產(chǎn)品能源消耗限額
- 2024年檢驗(yàn)檢測(cè)機(jī)構(gòu)管理評(píng)審報(bào)告
- 小區(qū)監(jiān)控系統(tǒng)工程改造方案
- 液壓升降平臺(tái)技術(shù)協(xié)議模板
- 2024年高考英語(yǔ) (全國(guó)甲卷)真題詳細(xì)解讀及評(píng)析
- DB36-T 1865-2023 濕地碳匯監(jiān)測(cè)技術(shù)規(guī)程
- 福建省部分地市2025屆高中畢業(yè)班第一次質(zhì)量檢測(cè) 化學(xué)試卷(含答案)
- JJF(陜) 036-2020 單相機(jī)攝影測(cè)量系統(tǒng)校準(zhǔn)規(guī)范
- 藥物化學(xué)-001-國(guó)開(kāi)機(jī)考復(fù)習(xí)資料
評(píng)論
0/150
提交評(píng)論