国产精品色无码视频,国产av毛片影院精品资源,亚洲人成网站77777·c0m,囯产av无码片毛片一级,夜夜操www99视频,美女白嫩胸交在线观看,亚洲a毛片性生活

薈聚奇文、博采眾長、見賢思齊
當(dāng)前位置:公文素材庫 > 計(jì)劃總結(jié) > 工作總結(jié) > SQL語句--Group By總結(jié)

SQL語句--Group By總結(jié)

網(wǎng)站:公文素材庫 | 時間:2019-05-29 23:11:00 | 移動端:SQL語句--Group By總結(jié)

SQL語句--Group By總結(jié)

1SQL語句--GroupBy總結(jié)

1.GroupBy語句簡介:

GroupBy語句從英文的字面意義上理解就是“根據(jù)(by)一定的規(guī)則進(jìn)行分組(Group)”。它的作用是通過一定的規(guī)則將一個數(shù)據(jù)集劃分成若干個小的區(qū)域,然后針對若干個小區(qū)域進(jìn)行數(shù)據(jù)處理。

P.S.這里真是體會到了一個好的命名的力量,GroupBy從字面是直接去理解是非常好理解的。恩,以后在命名的環(huán)節(jié)一定要加把勁:)。話題扯遠(yuǎn)了。

2.GroupBy的使用:

上面已經(jīng)給出了對GroupBy語句的理解;谶@個理解和SQLServer201*的聯(lián)機(jī)幫助,下面對GroupBy語句的各種典型使用進(jìn)行依次列舉說明。

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ù)集進(jìn)行分組,然后分別按照各個組來統(tǒng)計(jì)各自的記錄數(shù)量!焙芎美斫鈱Π伞_@里值得注意的是結(jié)果集中有兩個返回字段,一個是ProductPlace(出產(chǎn)國),一個是水果種類。如果我們這里水果種類不是用Count(*),而是類似如下寫法的話:

SELECTFruitName,ProductPlaceFROMT_TEST_FRUITINFOGROUPBYProductPlace

那么SQL在執(zhí)行此語句的時候會報(bào)如下的類似錯誤:

選擇列表中的列"T_TEST_FRUITINFO.FruitName"無效,因?yàn)樵摿袥]有包含在聚合函數(shù)或GROUPBY子句中。

這就是我們需要注意的一點(diǎn),如果在返回集字段中,這些字段要么就要包含在GroupBy語句的后面,作為分組的依據(jù);要么就要被包含在聚合函數(shù)中。我們可以將GroupBy操作想象成如下的一個過程,首先系統(tǒng)根據(jù)SELECT語句得到一個結(jié)果集,如最開始的那個水果、出產(chǎn)國家、單價的一個詳細(xì)表。然后根據(jù)分組字段,將具有相同分組字段的記錄歸并成了一條記錄。這個時候剩下的那些不存在于GroupBy語句后面作為分組依據(jù)的字段就有可能出現(xiàn)多個值,但是目前一種分組情況只有一條記錄,一個數(shù)據(jù)格是無法放入多個數(shù)值的,所以這里就需要通過一定的處理將這些多值的列轉(zhuǎn)化成單值,然后將其放在對應(yīng)的數(shù)據(jù)格中,那么完成這個步驟的就是聚合函數(shù)。這就是為什么這些函數(shù)叫聚合函數(shù)(aggregatefunctions)了。

2.2GroupByAll[expressions]:

GroupByAll+分組字段,這個和前面提到的GroupBy[Expressions]的形式多了一個關(guān)鍵字ALL。這個關(guān)鍵字只有在使用了where語句的,且where條件篩選掉了一些組的情況才可以看出效果。在SQLServer201*的聯(lián)機(jī)幫助中,對于GroupByAll是這樣進(jìn)行描述的:

作者:mnmnm669

201*-4-1418:46回復(fù)此發(fā)言

2SQL語句:GroupBy總結(jié)如果使用ALL關(guān)鍵字,那么查詢結(jié)果將包括由GROUPBY子句產(chǎn)生的所有組,即使某些組沒有符合搜索條件的行。沒有ALL關(guān)鍵字,包含GROUPBY子句的SELECT語句將不顯示沒有符合條件的行的組。其中有這么一句話“如果使用ALL關(guān)鍵字,那么查詢結(jié)果將包含由GroupBy子句產(chǎn)生的所有組...沒有ALL關(guān)鍵字,那么不顯示不符合條件的行組!边@句話聽起來好像挺耳熟的,對了,好像和LEFTJOIN和RIGHTJOIN有點(diǎn)像。其實(shí)這里是類比LEFTJOIN來進(jìn)行理解的。還是基于如下這樣一個數(shù)據(jù)集:FruitNameProductPlacePriceAppleChina$1.1AppleJapan$2.1AppleUSA$2.5OrangeChina$0.8BananaChina$3.1PeachUSA$3.

首先我們不使用帶ALL關(guān)鍵字的GroupBy語句:

SELECTCOUNT(*)AS水果種類,ProductPlaceAS出產(chǎn)國FROMT_TEST_FRUITINFO

WHERE(ProductPlace"Japan")GROUPBYProductPlace

那么在最后結(jié)果中由于Japan不符合where語句,所以分組結(jié)果中將不會出現(xiàn)Japan。

現(xiàn)在我們加入ALL關(guān)鍵字:

SELECTCOUNT(*)AS水果種類,ProductPlaceAS出產(chǎn)國FROMT_TEST_FRUITINFO

WHERE(ProductPlace"Japan")GROUPBYALLProductPlace

重新運(yùn)行后,我們可以看到Japan的分組,但是對應(yīng)的“水果種類”不會進(jìn)行真正的統(tǒng)計(jì),聚合函數(shù)會根據(jù)返回值的類型用默認(rèn)值0或者NULL來代替聚合函數(shù)的返回值。

2.3GROUPBY[Expressions]WITHCUBE|ROLLUP:

首先需要說明的是GroupByAll語句是不能和CUBE和ROLLUP關(guān)鍵字一起使用的。

首先先說說CUBE關(guān)鍵字,以下是SQLServer201*聯(lián)機(jī)幫助中的說明:

指定在結(jié)果集內(nèi)不僅包含由GROUPBY提供的正常行,還包含匯總行。在結(jié)果集內(nèi)返回每個可能的組和子組組合的GROUPBY匯總行。GROUPBY匯總行在結(jié)果中顯示為NULL,但可用來表示所有值。使用GROUPING函數(shù)確定結(jié)果集內(nèi)的空值是否是GROUPBY匯總值。

結(jié)果集內(nèi)的匯總行數(shù)取決于GROUPBY子句內(nèi)包含的列數(shù)。GROUPBY子句中的每個操作數(shù)(列)綁定在分組NULL下,并且分組適用于所有其它操作數(shù)(列)。由于CUBE返回每個可能的組和子組組合,因此不論指定分組列時所使用的是什么順序,行數(shù)都相同。

我們通常的GroupBy語句是按照其后所跟的所有字段進(jìn)行分組,而如果加入了CUBE關(guān)鍵字以后,那么系統(tǒng)將根據(jù)所有字段進(jìn)行分組的基礎(chǔ)上,還會通過對所有這些分組字段所有可能存在的組合形成的分組條件進(jìn)行分組計(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.所有部門有多少人(這里相當(dāng)于就不進(jìn)行分組了,因?yàn)檫@里已經(jīng)對員工的部門和性別沒有做任何限制了,但是這的確也是一種分組條件的組合方式);2.每種性別有多人(這里實(shí)際上是僅僅根據(jù)性別(C_EMPLINFO_SEX)進(jìn)行分組);

擴(kuò)展閱讀:[數(shù)據(jù)庫]簡單SQL語句總結(jié)

SQL關(guān)系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結(jié)

[數(shù)據(jù)庫]簡單SQL語句總結(jié)

全篇以學(xué)生成績的管理為例描述。1.在查詢結(jié)果中顯示列名:

a.用as關(guān)鍵字:selectnameas"姓名"fromstudentsorderbyageb.直接表示:selectname"姓名"fromstudentsorderbyage2.精確查找:

a.用in限定范圍:select*fromstudentswherenativein("湖南","四川")b.between...and:select*fromstudentswhereagebetween20and30c.“=”:select*fromstudentswherename="李山"

d.like:select*fromstudentswherenamelike"李%"(注意查詢條件中有“%”,則說明是部分匹配,而且還有先后信息在里面,即查找以“李”開頭的匹配項(xiàng)。所以若查詢有“李”的所有對象,應(yīng)該命令:"%李%";若是第二個字為李,則應(yīng)為"_李%"或"_李"或"_李_"。)

e.[]匹配檢查符:select*fromcourseswherecnolike"[AC]%"(表示或的關(guān)系,與"in(...)"類似,而且"[]"可以表示范圍,如:select*fromcourseswherecnolike"[A-C]%")

3.對于時間類型變量的處理

a.smalldatetime:直接按照字符串處理的方式進(jìn)行處理,例如:

select*fromstudentswherebirth>="1980-1-1"andbirthSQL關(guān)系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結(jié)

groupbygender(查看男女學(xué)生各有多少)

注意:從哪種角度分組就從哪列"groupby"

對于多重分組,只需將分組規(guī)則羅列。比如查詢各屆各專業(yè)的男女同學(xué)人數(shù),那么分組規(guī)則有:屆別(grade)、專業(yè)(mno)和性別(gender),所以有"groupbygrade,mno,gender"selectgrade,mno,gender,count(*)fromstudents

groupbygrade,mno,gender

通常group還和having聯(lián)用,比如查詢1門課以上不及格的學(xué)生,則按學(xué)號(sno)分類有:selectsno,count(*)fromgradeswheremark1

6.UNION聯(lián)合合并查詢結(jié)果,如:SELECT*FROMstudentsWHEREnamelike張%UNION[ALL]

SELECT*FROMstudentsWHEREnamelike李%

7.多表查詢a.內(nèi)連接

selectg.sno,s.name,c.coursename

fromgradesgJOINstudentssONg.sno=s.snoJOINcoursescONg.cno=c.cno(注意可以引用別名)b.外連接

2

SQL關(guān)系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結(jié)

b1.左連接

selectcourses.cno,max(coursename),count(sno)

fromcoursesLEFTJOINgradesONcourses.cno=grades.cnogroupbycourses.cno

左連接特點(diǎn):顯示全部左邊表中的所有項(xiàng)目,即使其中有些項(xiàng)中的數(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相當(dāng)于做笛卡兒積

8.嵌套查詢

a.用關(guān)鍵字IN,如查詢李山的同鄉(xiāng):select*fromstudents

wherenativein(selectnativefromstudentswherename=李山)b.使用關(guān)鍵字EXIST,比如,下面兩句是等價的:select*fromstudents

wheresnoin(selectsnofromgradeswherecno=B2)

SQL關(guān)系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結(jié)

select*fromstudentswhereexists(select*fromgradeswhere

grades.sno=students.snoANDcno=B2)

9.關(guān)于排序order

a.對于排序order,有兩種方法:asc升序和desc降序

b.對于排序order,可以按照查詢條件中的某項(xiàng)排列,而且這項(xiàng)可用數(shù)字表示,如:selectsno,count(*),avg(mark)fromgradesgroupbysnohavingavg(mark)>85orderby310.其他

a.對于有空格的識別名稱,應(yīng)該用"[]"括住。

b.對于某列中沒有數(shù)據(jù)的特定查詢可以用null判斷,如selectsno,coursenofromgradeswheremarkISNULL

c.注意區(qū)分在嵌套查詢中使用的any與all的區(qū)別,any相當(dāng)于邏輯運(yùn)算“||”而all則相當(dāng)于邏輯運(yùn)算“&&”

d.注意在做否定意義的查詢是小心進(jìn)入陷阱:如,沒有選修B2課程的學(xué)生:selectstudents.*fromstudents,grades

wherestudents.sno=grades.sno

ANDgrades.cnoB2上面的查詢方式是錯誤的,正確方式見下方:select*fromstudents

wherenotexists(select*fromgradeswheregrades.sno=students.snoANDcno="B2")

SQL關(guān)系型數(shù)據(jù)庫系統(tǒng)簡單SQL語句總結(jié)

11.關(guān)于有難度多重嵌套查詢的解決思想:如,選修了全部課程的學(xué)生:select*fromstudents

wherenotexists(select*fromcourseswhereNOTEXISTS(select*fromgrades

wheresno=students.snoANDcno=courses.cno))

最外一重:從學(xué)生表中選,排除那些有課沒選的。用notexist。由于討論對象是課程,所以第二重查詢從course表中找,排除那些選了課的即可。

友情提示:本文中關(guān)于《SQL語句--Group By總結(jié)》給出的范例僅供您參考拓展思維使用,SQL語句--Group By總結(jié):該篇文章建議您自主創(chuàng)作。

來源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問題,請聯(lián)系我們及時刪除。


SQL語句--Group By總結(jié)》由互聯(lián)網(wǎng)用戶整理提供,轉(zhuǎn)載分享請保留原作者信息,謝謝!
鏈接地址:http://m.hmlawpc.com/gongwen/750822.html
相關(guān)文章