java web項目開發(fā)案例精粹-補(bǔ)技術(shù)sql查詢語言chap_第1頁
java web項目開發(fā)案例精粹-補(bǔ)技術(shù)sql查詢語言chap_第2頁
java web項目開發(fā)案例精粹-補(bǔ)技術(shù)sql查詢語言chap_第3頁
java web項目開發(fā)案例精粹-補(bǔ)技術(shù)sql查詢語言chap_第4頁
java web項目開發(fā)案例精粹-補(bǔ)技術(shù)sql查詢語言chap_第5頁
免費預(yù)覽已結(jié)束,剩余46頁可下載查看

下載本文檔

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

文檔簡介

第六章數(shù)據(jù)的排序,和分本章主要內(nèi)容:上一章已經(jīng)學(xué)習(xí)了從表中查詢數(shù)據(jù)。有的時候這樣的選擇結(jié)果排列的并不是非常合理。因為,一般來說,查詢的結(jié)果是按照數(shù)據(jù)被添加到表時的順序來排列。因此,需要ORDERBYSQLORDERBY子句以使查詢結(jié)果按照用戶的需要進(jìn)行排列,以便于用戶閱讀。ORDERBY的基本格式如下:SELECTselect_listFROMtable_list[WHEREconditions][ORDERBYcolumnname|alias|position[ASC|在ORDERBY子句中也可以包含多個元素,元間也是使用逗號隔開ASCDESC表示按ORDERBYSELECT子句中一個列的名稱——columnname;也可SELECT子句中為列或表達(dá)式創(chuàng)建的別名——aliasSELECT子句中代表位置的編碼——position1SELECT子句中第一個列,2表示SELECT子句中第二個列。如果沒有使用ORDERBY子句,返回的數(shù)據(jù)將按照表中數(shù)據(jù)的物理順序排列,Employee表創(chuàng)建索引,在這種情況下查找所有工資為3000.00元和6000.00元的工作人SELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=————男女男男男男男男男女剛男序,可以這樣使用SELECT語句:SELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=6000.00ORDERBYid————男男男女男男女男男男剛男EmployeeidCREATEINDEXSELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=————男男男女男男女男男男剛男對比上面使用索引和不使用索引而對dODERBY子句,那么為什么還要提供索引呢?實際上,雖然上面的顯示結(jié)果是相同的,但是索引與ORDERBY子句是兩個完全不同的概念:創(chuàng)建了索引,數(shù)據(jù)庫系統(tǒng)就將為索引建立了一個對應(yīng)的物理對象,ODERBY子句的SQLODERBY子句指定的條件到物理磁盤上,每次都必須指定ORDERBY子句以重新將數(shù)據(jù)進(jìn)在排序中您可以指定按照什么順序來排序:升序或降序。SQL中,關(guān)鍵字ASC表DESC表示按照降序排列。而默認(rèn)的排序方式為升序,也就是DESCASC,那么顯示結(jié)果將按照從低到高的順序排列。當(dāng)然,為了使用戶能更好的明白顯示結(jié)果的排列順序,您也可以指定ASC。3000.006000.00id列降序排列,可以這樣使用SELECT語句:SELECTname,sex,id,salaryFROMEmployeeWHEREsalary=3000.00salary=6000.00ORDERBYidDESC————剛男男男男女男男女男男男SELECTname,sex,idFROMEmployeeWHEREnameBETWEEN’王AND’張ORDERBY—男女男女男男男女女剛男男ORDERBYASCDESC,因此結(jié)果按照在SQL中字符之間是怎么排序的呢?特殊字符又是怎么排序的呢?特殊字符與普通字符間是怎么排序的呢?“A”在“”之前么?大小寫是否有區(qū)別呢?字符的排序取決于數(shù)據(jù)庫系統(tǒng)使用的字符集和字符集中字符的順序。在SQL中,并沒有限定字符集與排序順序,而是可以由數(shù)據(jù)庫系統(tǒng)自行決定。多數(shù)數(shù)據(jù)庫系統(tǒng)都允許用戶安裝或選擇自己想使用的字符集,系統(tǒng)中也有默認(rèn)的字符集設(shè)置和排序順序,使用時請注意查看系統(tǒng)文檔。年1月1號之后開始的項目,并按照日期的先后進(jìn)行降序排序,可以這樣使用SELECTSELECTpnumber,budget,pstrdateFROMProjectWHEREpstrdate>’2002-01-ORDERBYpstrdate

2002-12-2002-04-2002-01-SELECT子句中的表達(dá)式來對查詢結(jié)果進(jìn)行排序。這時就不能直接在ORDERBY子句中直接使用表達(dá)式。如,按照項目利潤排序:SELECTpnumber,budget,gross,gross-budgetFROMProjectORDERBYgross-在SL2SL3DS將通過對表達(dá)式的比較而不是列名的比較進(jìn)行排列。不同的數(shù)據(jù)庫系統(tǒng)實現(xiàn)也有所不同,有的SELECTpnumber,budgetFROMProjectORDERBY但是,SQL3的這兩個特性使得編寫的代碼不夠系統(tǒng)。因此,建議仍使用SQL2的ORDERBYSELECT列表中的ORDERBYORDERBYcolumnname|alias|position[ASC|ORDERBYcolumnname排序,也可以使用為表達(dá)式創(chuàng)建的別名排序,還可以按照其在SELECT子句中的位置position排序。如,查詢Projiect表中每個項目的利潤,為利潤創(chuàng)建別名“profit”,并且按照升序的順序進(jìn)行排序,可以這樣使用ORDERBY子句:SELECTpnumber,budget,gross,gross–budgetASprofitFROMProjectWHEREprofit>=30000.00profit<=70000.00ORDERBYprofit如果沒有為表達(dá)式創(chuàng)建別名也沒有關(guān)系,SQLSELECT子句列表中的位置來指定排序的列。例如,查詢Projiect表中每個項目的利潤,并且按照降序的順序進(jìn)行排序,在沒有為利潤創(chuàng)建別名的情況下,可以這樣使用ORDERBY子句:SELECTpnumber,budget,gross,gross–budgetFROMProjectWHEREprofit>=30000.00profit<=70000.00ORDERBY4DESC gross–SELECT列表中的列,如刪除一列、改變列的先后順序等等,這時需要注意ORDERBY子句中使用的位置代表的列是否發(fā)生了變化。例如,在SELECT列表中增加pmgrid列,如果仍這樣使用ORDERBY子句:SELECTpnumber,pmgrid,budget,gross,gross–budgetFROMProjectWHEREprofit>=30000.00profit<=70000.00ORDERBY4DESCgross–從查詢結(jié)果可以看出結(jié)果按照gross列降序排列,而不是按照利潤降序排列??梢?不再代表列“gross–budgetgross列了。如果還要按照利潤對結(jié)果SELECTpname.pnumber,budget,gross,gross–FROMWHEREprofit>=30000.00profit<=70000.00ORDERBY5DESC多級排清晰。例如,公司想知道每個部門工作人員的薪水情況,將工作人員的記錄按照salary列進(jìn)行排序,使用SELECT語句:SELECTname,sex,id,salaryFROMEmployeeORDERBY————女男男男男男女剛男男男女女女女女男男男男男男男男男salaryidsalary列的值相同的列進(jìn)行再次排序,使用SELECT語句: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支持多級排序,因此,在需要的時候您就可以使查詢結(jié)果按照所需的方空值的SQLServerProjiect表中每個項目ORDERBY子句:SELECTpnumber,budget,gross,gross–budgetASprofitFROMProjectORDERBYOracleProjiect表中每個項目的利潤,為利潤創(chuàng)建別名“profitORDERBYSELECTpnumber,budget,gross,gross–budgetASprofitFROMProjectORDERBY6.2數(shù)同記錄的情況,或者希望知道平均值、最大值等要求,沒關(guān)系不必?fù)?dān)心,SQL還提供了去除相SELECT子句中有兩個可選的關(guān)ALLSELECT[ALL|DISTINCT]ALL為默認(rèn)選項,表示列出所有記錄,而不管是否出現(xiàn)重復(fù)。如果要去掉重復(fù)的記DISTINCTDISTINCT對一列或多列的組合進(jìn)行重復(fù)的3000.00dno列進(jìn)行排序,當(dāng)在SELECT子句中不使用DISTINCT關(guān)鍵字時:SELECTdnoFROMEmployeeWHEREsalary=3000.00ORDERBYdno11223355DISTINCTSELECTDISTINCTFROMWHEREsalary=3000.00ORDERBYdno1235DISTINCT關(guān)鍵字時需要注意:DISTINCTselect_list之前使SELECTdno,DISTINCTFROMWHEREsalary=3000.00ORDERBYdnoSELECT子句中包含多個列時,DISTINCT是對列的組合進(jìn)行去除的。例如下面的SELECT語句:SELECTDISTINCTname,dnoFROMEmployeeWHEREsalary=ORDERBY 12233 顯示結(jié)果表明,dnonamedno列的組合并沒有出現(xiàn)重復(fù)。所以沒有刪除dno列中的重復(fù)數(shù)據(jù)??梢?,DISTINCT是對列的組合進(jìn)行去除DISTINCT關(guān)鍵字,所有的例如,查詢工資為3000.00元的工作人員的名字、所屬部門號、參與的項目號,可以這樣使用SELECT語句:SELECTDISTINCTname,dno,pnoFROMEmployeeWHEREsalary=3000.00ORDERBYdno1122335剛5從本例查詢結(jié)果再次證明,DISTINCTSELECTSELECTDISTINCTdno,FROMWHEREsalary=3000.00ORDERBYdno 的行??梢奃ISTINCT中空值是相同的。SELECTSELECTDISTINCTFROMWHEREsalary=3000.00ORDERBYpno6.2.2函出Project表中所有記錄的budget:SELECTpnumber,budgetFROMProject您可以使用SQL提供的函數(shù)SUM()。SELECTSUM(budget)FROMProject函數(shù)是SQL中很重要的一部分。函數(shù)不是對某個記錄進(jìn)行操作,而是對function([DISTINCT]expression通常是一個列名或者別名,但也可以是一個常量或者一個函數(shù)(SQL支持函數(shù)的嵌套)。表6-1列出了SQL中支持的函數(shù)。表6- SQL支持的函含COUNT(SUM(AVG(MAX(MIN(COUNT、SUM()、AVG()DISTINCT關(guān)鍵字,以在計算中MAX()、MIN()COUNT(*)由于不會改變其結(jié)果,因此沒有必要使用DISTINCT。SUM()、AVG()COUNT()、MAX()、MIN()與COUNT(*)可以對所有數(shù)據(jù)類型使用。VARIANCE()函數(shù),ASALIST()函數(shù)。使用時請注意查閱系統(tǒng)SELECTSUM(budget)ASTotalFROMProjectWHERE有時您可能不需要對所有的記錄都進(jìn)行函數(shù)操作,而僅需要對符合條件的記錄進(jìn)行與WHEE行WHE子句到滿件錄后查的錄數(shù)計。SELECTSUM(budget)ASTotalFROMProjectWHEREbudget<同時需要注意的是:在WHERE子句中不能使用函數(shù)。例如,您可能想查找所SELECTFROMWHEREbudget>SELECTFROMProjectWHEREbudget>(SELECTAVG(budget)FROMProject)8以同時使用SUM()與COUNT()函數(shù):SELECTSUM(budget)ASTotal,COUNT(budget)ASNumberFROMProjectWHEREbudget< COUNT()COUNT()函數(shù)可以用來計算查詢結(jié)果中某個特定列出現(xiàn)的次數(shù)。SQL提供了COUNT()和COUNT(*)函數(shù)。這兩個函數(shù)很相似,但使用是完全不同的。通過下面的SELECTFROMProject12gross列的值為空值,上面的計算結(jié)果僅為10,可以看出COUNT(column)函數(shù)并不把column在內(nèi)。再看看COUNT(*)函數(shù)的使用:SELECTFROM可見,COUNT(*)函數(shù)計算所有的記錄,不用考慮空值。當(dāng)然,如果COUNT()函數(shù)在沒有空值的列上進(jìn)行計算得到的值與COUNT(*)函數(shù)相同。例如,在dnumber列上使用COUNT()函數(shù):SELECTCOUNT(dnumber)FROMProject可以看見計算的結(jié)果與使 COUNT(*)函數(shù)計算的結(jié)果相同COUNT()不僅可以對數(shù)字類型的列使用,也可以對其它數(shù)據(jù)類型的列使用,如字符串類型。例如,計算公司有多少工作人員,可以對Employee表中的name列使用COUNT()函數(shù),其中可以再比較一下COUNT()和COUNT(*)兩個函數(shù)的結(jié)果:SELECTCOUNT(name),FROM DISTINCTCOUNT中唯一值的數(shù)目。例如,下面的查詢計算了在Projectgross列唯一值的數(shù)目:SELECTCOUNT(DISTINCTFROMCOUNT(DISTINCT8因此使用DISTINCT關(guān)鍵字后COUNT()函數(shù)返回的值為8。注意:DISTINCT注意:DISTINCTCOUNT(*)COUNT(*)計算的是表中含DISTINCTCOUNT(*SELECTCOUNT(DISTINCTFROMCOUNT使用一個臨時表或視圖不同DISTINCTCOUNTCREATEVIEWtemp_tableSELECTDISTINCTsex,salaryFROMEmployeeSELECTFROMtemp_talbeORDERBY 這樣臨時視圖中了唯一的sex列與salary列的組合的值。接著,對臨時的視SELECTCOUNT(*)ASFROM7SUMAVG()SUM(column)columnAVG(column)函數(shù)用來計算選擇的行中column列所有值的平均值。因此,SUMAVG(SUMAVGSELECTSUM(gross),AVG(gross)FROMProject SELECTCOUNT(gross),FROM 268000.00.0010SUMAVG(注意:AVG()函數(shù)中計算值的數(shù)目時,并不會將空值計算在內(nèi)。如上例中,雖然Project注意:AVG()函數(shù)中計算值的數(shù)目時,并不會將空值計算在內(nèi)。如上例中,雖然Project12grossDISTINCT關(guān)鍵字也可以在SUM()與AVG()函數(shù)中使用。在SUM()函數(shù)中使用DISTINCT,SUM()函數(shù)將只計算列中唯一值的總和。在AVG(DISTINCT,使用SUM()與AVG()函數(shù):SELECTSUM(DISTINCTgross),AVG(DISTINCTFROMSUM(DISTINCT AVG(DISTINCT DISTINCTDISTINCT是不同的。當(dāng)DISTINCT關(guān)鍵字包含在函數(shù)中時,它是在函數(shù)計算時起作用,并不與規(guī)則——DISTINCTselect_list之前使用——相違背。在SELECTselect_list前SELECTCOUNT(DISTINCTgross),FROMCOUNT(DISTINCT 可見,唯一值有8個。與不使用DISTINCT關(guān)鍵字時相比,使用DISTINCT關(guān)鍵字的SUM()函數(shù)沒有將重復(fù)值進(jìn)行多次計算,因此SUM()函數(shù)得出的值為.00,而包含DISTINCT鍵字的AVG()函數(shù)得到的是.00/8=.00的值,即得到MAXMINMAX(column)函數(shù)用來計算選擇的行中column列包含的所有值中最大的值。而MIN(column)函數(shù)用來計算選擇的行中column列包含的所有值中最小的值。因此,MAX()與MIN()函數(shù)中沒有必要使用DISTINCT關(guān)鍵字。SELECTMAX(gross),MIN(gross)FROMProject 注意注意:當(dāng)列中存在非空值時,MAX(MIN(非空值存在,MAX(MIN(MAX(MIN(日期類型數(shù)據(jù)使用,當(dāng)然對于字符串與時間日期類型數(shù)據(jù)空值也是不大于或小于任何值。EmloyeeameMAX(MIN()函數(shù):SELECTMAX(name),MIN(name)FROMEmployee SQL3ROLLUPCUBE關(guān)鍵字。ROLLUP意思是從所有每個所成的組的列中得出每一個組的組;CUBE意思是通過組合成組列的所有可能的組合,從所有組中得出一個組。ROLLUPCUBE關(guān)鍵字的使用比較復(fù)雜,也比較晦澀,由于在使用中6.2.3避免使用DISTINCT時的要查找記錄中唯一的組合,您可以使用DISTINCT關(guān)鍵字。但是,初學(xué)者對于對其注意事項做了介紹,但為了您更好的掌握DISTINCT,這兒對注意的地方進(jìn)行一下總在列和表達(dá)式中使用DISTINCT時,只能使用一次DISTINCTDISTINCT是對SELECTDISTINCT時有了很大的限制,分別對每個列或表達(dá)式指定是否包含DISTINCT。下面的例子可以更好的幫助您理解這樣的限制。查找收入低于300000.00元的項目SELECTDISTINCTFROMWHEREgross<300000.00SELECTDISTINCTgross–budgetASprofitFROMProjectWHEREgross<SELECTDISTINCTgross,gross–budgetASprofitFROMProjectWHEREgross<ORDERBY 其中,gross180000.00280000.00,profit也出現(xiàn)了重復(fù),四個40000.00。DISTINCTDISTINCT是互不干擾的,它是在函數(shù)計算時起作用,并不與規(guī)則——DISTINCTselect_list之前使用——相違背。例如,可以在SUM()函數(shù)與AVG()函數(shù)中分別使用:SELECTSUM(DISTINCTgross),AVG(DISTINCTFROMSUM(DISTINCT AVG(DISTINCT SELECTSUM(DISTINCTgross),FROMSUM(DISTINCT 在函數(shù)中使用DISTINCT與在SELECT列表中使用DISTINCT區(qū)別還是比較大的。錯誤是使用帶有DISTINCT關(guān)鍵字的COUNT(*)函數(shù),如:SELECTCOUNT(DISTINCTFROM其中,對特定列計算不同值的數(shù)目比較簡單,您可以在COUNT()函數(shù)中使用DISTINCT關(guān)鍵字從而直接得出正確結(jié)果。使用一個臨時表或視圖不同DISTINCT不同點:對其它運算符而言,空值之間是互不相同的,而且要想查找到空值需ISNULLDISTINCT來說,將空值看作是相同的,也不需要使用ISNULL。SELECTgrossFROMWHEREgross<200000.00grossISSELECTDISTINCTFROMWHEREgross<DISTINCTISNULL關(guān)鍵字就可以查找出空值,而且將所有的空值看成是相同的。所以,使用DISTINCT關(guān)鍵字去掉了一個重復(fù)的180000.00,同時也去掉一個重復(fù)的NULL。學(xué)習(xí)了函數(shù)后,有的時候可能希望對一組數(shù)據(jù)使用函數(shù)。例如,統(tǒng)計每個部門工資總額,就可以使用函數(shù)SUM()函數(shù)為每個部門進(jìn)行計算,如計算部門號為1的部門工資總額:SELECTSUM(salary)FROMEmployeeWHEREdno=1然而,您會發(fā)覺無法在一個查詢中完成所有部門的工資總額的計算,而必須為每一個部門使用一個查詢,而且您必須對部門的個數(shù)有清楚的了解。這樣使用是非常不方便,SQLGROUPBYGROUPBYGROUPBY子句根據(jù)列的內(nèi)容對查詢結(jié)果進(jìn)行分類。GROUPBY子句的基本格式SELECT[ALL|DISTINCT]select_listFROMtable_list/view_list[WHEREconditions][GROUPBYgroup_list][HAVINGconditions][ORDERBYorder_list]GROUPBY時,order_listselect_list中,即不能選擇select_listdnoSELECT列表中,下面的SQL語句將無法運行:SELECTSUM(salary)FROMEmployeeGROUPBYdno注意注意GROUPBYGROUPBYGROUPBY子句來方便的完成每個部SELECTdno,SUM(salary)FROMEmployeeGROUPBY — 3456GROUPBYGROUPBY子句可以用來對數(shù)據(jù)進(jìn)行分組,將數(shù)據(jù)分成組并為每一組返回一行。在不使用函數(shù)時,使用GROUPBY與DISTINCT類似。SELECTDISTINCTFROMEmployeeORDERBYdno123456GROUPBYSELECTdnoFROMEmployeeGROUPBYdnoGROUPBY6個部門,—123456可見,查詢結(jié)果是相同的。GROUPBY與DISTINCT另一個相似之處是:與DISTINCT一樣,GROUPBYGROUPBY與函GROUPBY子句與函數(shù)有密切的聯(lián)系,可以說沒有函數(shù)GROUPBY子句也就沒有多大的用處。GROUPBY子句可以將查詢到的數(shù)據(jù)分成組,而函數(shù)則用來GROUPBYSELECTsalary,COUNT(*)FROMEmployeeGROUPBY SELECTdno,AVG(salary)FROMEmployeeGROUPBY —123456WHERE排序中可以使用WHERE子句以對特定的記錄進(jìn)行排序,在分組中也可以使用WHEREWHERE子句將符合條件的記錄選出,再對選出的數(shù)據(jù)進(jìn)行分組。當(dāng)然,WHERE子句中使用的列并不是一定要在SELECT列表中出現(xiàn)。3000.00SELECTdnoFROMEmployeeWHEREsalary=3000.00GROUPBYdno1235多次分ODERYOUPY以指定多個列對一組數(shù)據(jù)再次進(jìn)行分組。多個列之間也是使用逗號分隔。執(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)并不是對每個部門工作人員人數(shù)進(jìn)行了計算。函數(shù)是對進(jìn)行多次分組之后形成的小組進(jìn)行計算的。因此,要實現(xiàn)上面的計算,必須使用兩個查詢,分別計算每個部門工作人員的人數(shù)及部門中男女工作人員各自的人數(shù)。SELECTdno,FROMEmployeeGROUPBYdno — 2SELECTdno,sex,COUNT(id)FROMEmployeeGROUPBYdno,SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYdno,SELECTsex,FROMEmployeeGROUPBYsex — Oracle中提供了工具來ORDERBYORDERBYGROUPBY子句一起使用以對結(jié)果進(jìn)行排序,更清晰的顯示結(jié)果。SQL語句書寫時,ORDERBYGROUPBY子句之后書寫。這兩個GROUPBYORDERBY例如,列出工資為3000.00的工作人員所屬的所有部門號,并按照降序排列,可以SELECTdnoFROMEmployeeWHEREsalary=3000.00GROUPBYdnoORDERBYdno5321注意:ORDERBY子句中使用的列名必須是GROUPBY子句中包含的列名 在ODERBYGROUPBY列表之外包含的列名將會產(chǎn)生錯誤。例如,計算每個部門的平均工資水平,這時應(yīng)該對部門進(jìn)行分組,如果將結(jié)果按照平均工資進(jìn)SQL語句:SELECTdno,AVG(salary)ASavgFROMEmployeeGROUPBYdnoORDERBY — 相反地,上面的語句是不能運行的,根本不可能產(chǎn)生上面的查詢結(jié)果。SQL引擎將當(dāng)然必須是包含在GROUPBY子句中的列。例如,計算每個部門中和女性工作人員的數(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子句中有多個列時,ORDERBY子句也可以僅使用其中的部分列進(jìn)行排序。例如,可以僅按照dno列進(jìn)行排序:SELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYdno,sexORDERBYdnoSELECTdno,sex,COUNT(*)FROMEmployeeGROUPBYdno,sexORDERBYsexHAVING子SELECTWHEREGROUPBY子句時,也可以HAVING子句及函數(shù)時,執(zhí)行順序如下:GROUPBY對GROUPBY子句形成的組運行函數(shù)計算每一組的值HAVING子句去掉不符合條件的組。例如,刪除工作人員數(shù)目小于4的部門號:SELECTdno,FROMEmployeeGROUPBYdnoHAVINGCOUNT(*)> — 64HAVING使用HAVING子句時,需要注意的是:HAVING子句中的每一個元素也必須出現(xiàn)SELECTHAVINGSELECT列表SELECTdno,FROMEmployeeGROUPBYdnoHAVINGSUM(salary)> — 雖然HAVING子句通常與函數(shù)一起使用,但是HAVING子句中也可以不使用SELECT10000.006HAVING子SELECTdno,FROMEmployeeGROUPBYdnoHAVINGdno<>6 — HAVINGAND、ORNOT運算符來包含多個限制條件。例如,SELECTdno,AVG(salary),SUM(salary)FROMEmployeeGROUPBYHAVINGSUM(salary)>10000.00AVG(salary)<—235SELECTHAVINGHAVING子句與WHERE子句都可以用來設(shè)定限制條件以使查詢結(jié)果滿足一定的10000.00元的組,可以使用HAVING子句設(shè)置限制:SELECTdno,SUM(salary)FROMEmployeeGROUPBYHAVINGSUM(salary)> — SELECTdno,SUM(salary)FROMEmployeeWHEREdno<>6GROUPBYdno — 但是,WHERE子句與HAVING子句并不是相同的:HAVING子句限制的是組,而不是行;WHERE子句用于限制查找的行,而不是對形成的組進(jìn)行限制。即WHERE子句產(chǎn)生用于成組的行,HAVINGWHERE子句中不允許使用函數(shù),而HAVING子句中卻可以使用。WHERE子句也有自己的優(yōu)點,它比HAVING子句更有效。因為WHERE子句刪除行,這樣用于成組的行更少,函數(shù)也在更少的行上進(jìn)行計算,而HAVING子句不能限制成組的行,只能對組的值進(jìn)行4.綜合使用各SELECTdno,AVG(salary),SUM(salary)FROMEmployeeWHEREdno>2GROUPBYdnoHAVINGSUM(salary)>10000.00AVG(salary)<4000.00ORDERBYdnoDESCdno2dno的值進(jìn)行分組,并對分組結(jié)果進(jìn)行限制,最后將結(jié)果按照dno列進(jìn)行降序排列: —53空值的SELECTpno,FROMEmployeeGROUPBYpnoORDERBYpno WHERE子句以去除分組結(jié)果中的空值。例如,計算參與各項目pnopnoNULL的SELECTpno,FROMWHEREpnoISNOTNULLGROUPBYpnoORDERBY 當(dāng)分組中包含空值時,需要注意COUNT(*)與COUNT()的區(qū)別。例如,對上例使用COUNT()進(jìn)行計算:SELECTpno,COUNT(pno)FROMEmployeeGROUPBYpnoORDERBY 注意,使用COUNT()進(jìn)行計算

溫馨提示

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

評論

0/150

提交評論