SQL語句--Group By總結
1SQL語句--GroupBy總結
1.GroupBy語句簡介:
GroupBy語句從英文的字面意義上理解就是“根據(jù)(by)一定的規(guī)則進行分組(Group)”。它的作用是通過一定的規(guī)則將一個數(shù)據(jù)集劃分成若干個小的區(qū)域,然后針對若干個小區(qū)域進行數(shù)據(jù)處理。
P.S.這里真是體會到了一個好的命名的力量,GroupBy從字面是直接去理解是非常好理解的。恩,以后在命名的環(huán)節(jié)一定要加把勁:)。話題扯遠了。
2.GroupBy的使用:
上面已經(jīng)給出了對GroupBy語句的理解。基于這個理解和SQLServer201*的聯(lián)機幫助,下面對GroupBy語句的各種典型使用進行依次列舉說明。
2.1GroupBy[Expressions]:
這個恐怕是GroupBy語句最常見的用法了,GroupBy+[分組字段](可以有多個)。在執(zhí)行了這個操作以后,數(shù)據(jù)集將根據(jù)分組字段的值將一個數(shù)據(jù)集劃分成各個不同的小組。比如有如下數(shù)據(jù)集,其中水果名稱(FruitName)和出產(chǎn)國家(ProductPlace)為聯(lián)合主鍵:
FruitNameProductPlacePriceAppleChina$1.1AppleJapan$2.1AppleUSA$2.5
OrangeChina$0.8
BananaChina$3.1PeachUSA$3.0
如果我們想知道每個國家有多少種水果,那么我們可以通過如下SQL語句來完成:
SELECTCOUNT(*)AS水果種類,ProductPlaceAS出產(chǎn)國FROMT_TEST_FRUITINFOGROUPBYProductPlace
這個SQL語句就是使用了GroupBy+分組字段的方式,那么這句SQL語句就可以解釋成“我按照出產(chǎn)國家(ProductPlace)將數(shù)據(jù)集進行分組,然后分別按照各個組來統(tǒng)計各自的記錄數(shù)量!焙芎美斫鈱Π伞_@里值得注意的是結果集中有兩個返回字段,一個是ProductPlace(出產(chǎn)國),一個是水果種類。如果我們這里水果種類不是用Count(*),而是類似如下寫法的話:
SELECTFruitName,ProductPlaceFROMT_TEST_FRUITINFOGROUPBYProductPlace
那么SQL在執(zhí)行此語句的時候會報如下的類似錯誤:
選擇列表中的列"T_TEST_FRUITINFO.FruitName"無效,因為該列沒有包含在聚合函數(shù)或GROUPBY子句中。
這就是我們需要注意的一點,如果在返回集字段中,這些字段要么就要包含在GroupBy語句的后面,作為分組的依據(jù);要么就要被包含在聚合函數(shù)中。我們可以將GroupBy操作想象成如下的一個過程,首先系統(tǒng)根據(jù)SELECT語句得到一個結果集,如最開始的那個水果、出產(chǎn)國家、單價的一個詳細表。然后根據(jù)分組字段,將具有相同分組字段的記錄歸并成了一條記錄。這個時候剩下的那些不存在于GroupBy語句后面作為分組依據(jù)的字段就有可能出現(xiàn)多個值,但是目前一種分組情況只有一條記錄,一個數(shù)據(jù)格是無法放入多個數(shù)值的,所以這里就需要通過一定的處理將這些多值的列轉化成單值,然后將其放在對應的數(shù)據(jù)格中,那么完成這個步驟的就是聚合函數(shù)。這就是為什么這些函數(shù)叫聚合函數(shù)(aggregatefunctions)了。
2.2GroupByAll[expressions]:
GroupByAll+分組字段,這個和前面提到的GroupBy[Expressions]的形式多了一個關鍵字ALL。這個關鍵字只有在使用了where語句的,且where條件篩選掉了一些組的情況才可以看出效果。在SQLServer201*的聯(lián)機幫助中,對于GroupByAll是這樣進行描述的:
作者:mnmnm669
201*-4-1418:46回復此發(fā)言
2SQL語句:GroupBy總結如果使用ALL關鍵字,那么查詢結果將包括由GROUPBY子句產(chǎn)生的所有組,即使某些組沒有符合搜索條件的行。沒有ALL關鍵字,包含GROUPBY子句的SELECT語句將不顯示沒有符合條件的行的組。其中有這么一句話“如果使用ALL關鍵字,那么查詢結果將包含由GroupBy子句產(chǎn)生的所有組...沒有ALL關鍵字,那么不顯示不符合條件的行組!边@句話聽起來好像挺耳熟的,對了,好像和LEFTJOIN和RIGHTJOIN有點像。其實這里是類比LEFTJOIN來進行理解的。還是基于如下這樣一個數(shù)據(jù)集:FruitNameProductPlacePriceAppleChina$1.1AppleJapan$2.1AppleUSA$2.5OrangeChina$0.8BananaChina$3.1PeachUSA$3.
首先我們不使用帶ALL關鍵字的GroupBy語句:
SELECTCOUNT(*)AS水果種類,ProductPlaceAS出產(chǎn)國FROMT_TEST_FRUITINFO
WHERE(ProductPlace"Japan")GROUPBYProductPlace
那么在最后結果中由于Japan不符合where語句,所以分組結果中將不會出現(xiàn)Japan。
現(xiàn)在我們加入ALL關鍵字:
SELECTCOUNT(*)AS水果種類,ProductPlaceAS出產(chǎn)國FROMT_TEST_FRUITINFO
WHERE(ProductPlace"Japan")GROUPBYALLProductPlace
重新運行后,我們可以看到Japan的分組,但是對應的“水果種類”不會進行真正的統(tǒng)計,聚合函數(shù)會根據(jù)返回值的類型用默認值0或者NULL來代替聚合函數(shù)的返回值。
2.3GROUPBY[Expressions]WITHCUBE|ROLLUP:
首先需要說明的是GroupByAll語句是不能和CUBE和ROLLUP關鍵字一起使用的。
首先先說說CUBE關鍵字,以下是SQLServer201*聯(lián)機幫助中的說明:
指定在結果集內(nèi)不僅包含由GROUPBY提供的正常行,還包含匯總行。在結果集內(nèi)返回每個可能的組和子組組合的GROUPBY匯總行。GROUPBY匯總行在結果中顯示為NULL,但可用來表示所有值。使用GROUPING函數(shù)確定結果集內(nèi)的空值是否是GROUPBY匯總值。
結果集內(nèi)的匯總行數(shù)取決于GROUPBY子句內(nèi)包含的列數(shù)。GROUPBY子句中的每個操作數(shù)(列)綁定在分組NULL下,并且分組適用于所有其它操作數(shù)(列)。由于CUBE返回每個可能的組和子組組合,因此不論指定分組列時所使用的是什么順序,行數(shù)都相同。
我們通常的GroupBy語句是按照其后所跟的所有字段進行分組,而如果加入了CUBE關鍵字以后,那么系統(tǒng)將根據(jù)所有字段進行分組的基礎上,還會通過對所有這些分組字段所有可能存在的組合形成的分組條件進行分組計算。由于上面舉的例子過于簡單,這里就再適合了,現(xiàn)在我們的數(shù)據(jù)集將換一個場景,一個表中包含人員的基本信息:員工所在的部門編號(C_EMPLINFO_DEPTID)、員工性別(C_EMPLINFO_SEX)、員工姓名(C_EMPLINFO_NAME)等。那么我現(xiàn)在想知道每個部門各個性別的人數(shù),那么我們可以通過如下語句得到:SELECTC_EMPLINFO_DEPTID,C_EMPLINFO_SEX,COUNT(*)ASC_EMPLINFO_TOTALSTAFFNUMFROMT_PERSONNEL_EMPLINFOGROUPBYC_EMPLINFO_DEPTID,C_EMPLINFO_SEX但是如果我現(xiàn)在希望知道:1.所有部門有多少人(這里相當于就不進行分組了,因為這里已經(jīng)對員工的部門和性別沒有做任何限制了,但是這的確也是一種分組條件的組合方式);2.每種性別有多人(這里實際上是僅僅根據(jù)性別(C_EMPLINFO_SEX)進行分組);
擴展閱讀:[數(shù)據(jù)庫]簡單SQL語句總結
SQL關系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結
[數(shù)據(jù)庫]簡單SQL語句總結
全篇以學生成績的管理為例描述。1.在查詢結果中顯示列名:
a.用as關鍵字:selectnameas"姓名"fromstudentsorderbyageb.直接表示:selectname"姓名"fromstudentsorderbyage2.精確查找:
a.用in限定范圍:select*fromstudentswherenativein("湖南","四川")b.between...and:select*fromstudentswhereagebetween20and30c.“=”:select*fromstudentswherename="李山"
d.like:select*fromstudentswherenamelike"李%"(注意查詢條件中有“%”,則說明是部分匹配,而且還有先后信息在里面,即查找以“李”開頭的匹配項。所以若查詢有“李”的所有對象,應該命令:"%李%";若是第二個字為李,則應為"_李%"或"_李"或"_李_"。)
e.[]匹配檢查符:select*fromcourseswherecnolike"[AC]%"(表示或的關系,與"in(...)"類似,而且"[]"可以表示范圍,如:select*fromcourseswherecnolike"[A-C]%")
3.對于時間類型變量的處理
a.smalldatetime:直接按照字符串處理的方式進行處理,例如:
select*fromstudentswherebirth>="1980-1-1"andbirthSQL關系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結
groupbygender(查看男女學生各有多少)
注意:從哪種角度分組就從哪列"groupby"
對于多重分組,只需將分組規(guī)則羅列。比如查詢各屆各專業(yè)的男女同學人數(shù),那么分組規(guī)則有:屆別(grade)、專業(yè)(mno)和性別(gender),所以有"groupbygrade,mno,gender"selectgrade,mno,gender,count(*)fromstudents
groupbygrade,mno,gender
通常group還和having聯(lián)用,比如查詢1門課以上不及格的學生,則按學號(sno)分類有:selectsno,count(*)fromgradeswheremark1
6.UNION聯(lián)合合并查詢結果,如:SELECT*FROMstudentsWHEREnamelike張%UNION[ALL]
SELECT*FROMstudentsWHEREnamelike李%
7.多表查詢a.內(nèi)連接
selectg.sno,s.name,c.coursename
fromgradesgJOINstudentssONg.sno=s.snoJOINcoursescONg.cno=c.cno(注意可以引用別名)b.外連接
2SQL關系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結
b1.左連接
selectcourses.cno,max(coursename),count(sno)
fromcoursesLEFTJOINgradesONcourses.cno=grades.cnogroupbycourses.cno
左連接特點:顯示全部左邊表中的所有項目,即使其中有些項中的數(shù)據(jù)未填寫完全。左外連接返回那些存在于左表而右表中卻沒有的行,再加上內(nèi)連接的行。b2.右連接與左連接類似b3.全連接
selectsno,name,major
fromstudentsFULLJOINmajorsONstudents.mno=majors.mno兩邊表中的內(nèi)容全部顯示c.自身連接
selectc1.cno,c1.coursename,c1.pno,c2.coursenamefromcoursesc1,coursesc2wherec1.pno=c2.cno采用別名解決問題。d.交叉連接
selectlastname+firstnamefromlastnameCROSSJOINfirstanme相當于做笛卡兒積
8.嵌套查詢
a.用關鍵字IN,如查詢李山的同鄉(xiāng):select*fromstudents
wherenativein(selectnativefromstudentswherename=李山)b.使用關鍵字EXIST,比如,下面兩句是等價的:select*fromstudents
wheresnoin(selectsnofromgradeswherecno=B2)
SQL關系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結
select*fromstudentswhereexists(select*fromgradeswhere
grades.sno=students.snoANDcno=B2)
9.關于排序order
a.對于排序order,有兩種方法:asc升序和desc降序
b.對于排序order,可以按照查詢條件中的某項排列,而且這項可用數(shù)字表示,如:selectsno,count(*),avg(mark)fromgradesgroupbysnohavingavg(mark)>85orderby310.其他
a.對于有空格的識別名稱,應該用"[]"括住。
b.對于某列中沒有數(shù)據(jù)的特定查詢可以用null判斷,如selectsno,coursenofromgradeswheremarkISNULL
c.注意區(qū)分在嵌套查詢中使用的any與all的區(qū)別,any相當于邏輯運算“||”而all則相當于邏輯運算“&&”
d.注意在做否定意義的查詢是小心進入陷阱:如,沒有選修B2課程的學生:selectstudents.*fromstudents,grades
wherestudents.sno=grades.sno
ANDgrades.cnoB2上面的查詢方式是錯誤的,正確方式見下方:select*fromstudents
wherenotexists(select*fromgradeswheregrades.sno=students.snoANDcno="B2")
SQL關系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結
11.關于有難度多重嵌套查詢的解決思想:如,選修了全部課程的學生:select*fromstudents
wherenotexists(select*fromcourseswhereNOTEXISTS(select*fromgrades
wheresno=students.snoANDcno=courses.cno))
最外一重:從學生表中選,排除那些有課沒選的。用notexist。由于討論對象是課程,所以第二重查詢從course表中找,排除那些選了課的即可。
友情提示:本文中關于《SQL語句--Group By總結》給出的范例僅供您參考拓展思維使用,SQL語句--Group By總結:該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡整理 免責聲明:本文僅限學習分享,如產(chǎn)生版權問題,請聯(lián)系我們及時刪除。