成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

group by在sql中怎么使用?

網(wǎng)友解答: group by在SQL語(yǔ)句中用于指定分組。說(shuō)起來(lái)雖然只有一句話,但應(yīng)用起來(lái)還是很有講究的。例如,有下面的“訂單”表,全部數(shù)據(jù)共216行:未使用聚合函數(shù)的分組當(dāng)沒(méi)有使用聚合函

網(wǎng)友解答:

group by在SQL語(yǔ)句中用于指定分組。說(shuō)起來(lái)雖然只有一句話,但應(yīng)用起來(lái)還是很有講究的。

例如,有下面的“訂單”表,全部數(shù)據(jù)共216行:

未使用聚合函數(shù)的分組

當(dāng)沒(méi)有使用聚合函數(shù)進(jìn)行分組時(shí),其效果相當(dāng)于同類項(xiàng)合并,也就是類似于distinct的效果。例如,下面的兩條語(yǔ)句,執(zhí)行效果是完全一樣的,都是用于提取產(chǎn)品、客戶列的不重復(fù)記錄:

select distinct 產(chǎn)品,客戶 from 訂單

select 產(chǎn)品,客戶 from 訂單 group by 產(chǎn)品,客戶

使用聚合函數(shù)的分組

凡是select中沒(méi)有出現(xiàn)在group by子句里的所有列,都必須使用聚合函數(shù)。

例如,下面語(yǔ)句中的數(shù)量列既沒(méi)有使用聚合函數(shù),也沒(méi)有用在分組中,因此,該語(yǔ)句在執(zhí)行時(shí)將出錯(cuò):

select 產(chǎn)品,客戶,數(shù)量 from 訂單 group by 產(chǎn)品,客戶

正確的寫法應(yīng)該是:

select 產(chǎn)品,客戶,sum(數(shù)量) from 訂單 group by 產(chǎn)品,客戶

再如,對(duì)表達(dá)式列進(jìn)行統(tǒng)計(jì)計(jì)算:

select 產(chǎn)品,客戶,sum(數(shù)量) as 總量,sum(單價(jià)*折扣*數(shù)量) as 總額 from 訂單 group by 產(chǎn)品,客戶

按產(chǎn)品列進(jìn)行分組,統(tǒng)計(jì)每組中的記錄數(shù):

select 產(chǎn)品,count(*) as 記錄條數(shù) from 訂單 group by 產(chǎn)品

這個(gè)count聚合函數(shù)中的*也可以換成某個(gè)指定的列名。例如:

select 產(chǎn)品,count(客戶) as 記錄條數(shù) from 訂單 group by 產(chǎn)品

請(qǐng)注意,這樣得到的統(tǒng)計(jì)結(jié)果和count(*)得到的結(jié)果可能并非完全一致:count(*)僅統(tǒng)計(jì)數(shù)據(jù)記錄的行數(shù),不會(huì)讀取列中的任何數(shù)據(jù),因此執(zhí)行效率非常高;而count(客戶)在統(tǒng)計(jì)時(shí)會(huì)判斷該列中的值,一旦出現(xiàn)空值就會(huì)剔除該行。也就是說(shuō),count(客戶)統(tǒng)計(jì)的記錄數(shù)是不會(huì)包括指定列內(nèi)容為空的記錄行的。

分組依據(jù)可以是具體的列,也可以是表達(dá)式

例如,訂單表中并沒(méi)有單獨(dú)的年份列,我們可以使用表達(dá)式來(lái)實(shí)現(xiàn)按年分組:

select 客戶,year(日期) as 年,sum(數(shù)量) as 總量 from 訂單 group by 客戶,year(日期)

其中,Year就是SQL中用于獲取年份的函數(shù)。

分組依據(jù)和最終返回的列并不是完全對(duì)應(yīng)的

仍以上一行語(yǔ)句為例,盡管該語(yǔ)句按“客戶”和“year(日期)”分組,但它們并不一定要必須返回。例如,將其改成這樣也是可以的:

select 客戶,sum(數(shù)量) as 總量 from 訂單 group by 客戶,year(日期)

返回的總量數(shù)據(jù)仍然不變,記錄數(shù)也不變,只是沒(méi)有了年份列,數(shù)據(jù)查看起來(lái)比較費(fèi)勁而已。

再比如,這里的分組用的是“year(日期)”,我們還可以將輸出的年份列內(nèi)容改成這樣的表達(dá)式:

select 客戶,cstr(year(日期))+'年' as 年份,sum(數(shù)量) as 總量 from {訂單} group by 客戶,year(日期)

由于“year(日期)”獲取的數(shù)據(jù)是整數(shù),如果要在它后面加上其它字符,就必須先將其轉(zhuǎn)為字符串形式,這里的CStr就是SQL中用于將其它類型數(shù)據(jù)轉(zhuǎn)為字符的函數(shù)。請(qǐng)注意,不同的數(shù)據(jù)庫(kù),轉(zhuǎn)換函數(shù)是不一樣的,CStr是Access數(shù)據(jù)庫(kù)中的用法,SQLServer用的是convert。

聚合函數(shù)可以用在沒(méi)有指定分組的select語(yǔ)句中

對(duì)于這樣的語(yǔ)句,所有的列表達(dá)式都必須使用聚合函數(shù),否則會(huì)出現(xiàn)錯(cuò)誤。例如:

select sum(單價(jià)*折扣*數(shù)量) as 總額 from 訂單 where 產(chǎn)品='PD05'

這樣得到的結(jié)果就只有一條統(tǒng)計(jì)行,因?yàn)闆](méi)有指定分組列。

where和group by有著嚴(yán)格的順序要求,且聚合函數(shù)不能用于where中

當(dāng)一個(gè)select語(yǔ)句中既有where又有g(shù)roup by時(shí),where必須寫在前面,group by寫在后面,這種順序是有嚴(yán)格要求的,不能搞錯(cuò)!而當(dāng)需要使用聚合函數(shù)作為查詢條件時(shí),必須使用having代替where。

例如,下面的SQL語(yǔ)句執(zhí)行效果:

這是對(duì)產(chǎn)品為“PD05”的所有記錄按照“客戶”所進(jìn)行的分組統(tǒng)計(jì)。如果希望僅返回總量大于2000的記錄,怎么辦?可以這樣在where中設(shè)置嗎?

select 客戶,sum(數(shù)量) as 總量 from 訂單 where 產(chǎn)品='PD05' and sum(數(shù)量)2000 group by 客戶

結(jié)果出現(xiàn)執(zhí)行錯(cuò)誤。這是因?yàn)?,where中不能使用聚合函數(shù)!

如要使用聚合函數(shù)作為數(shù)據(jù)查詢條件,必須將其以having跟在group by的后面。例如:

select 客戶,sum(數(shù)量) as 總量 from 訂單 where 產(chǎn)品='PD05' group by 客戶 having sum(數(shù)量)2000

這樣語(yǔ)句就能正常執(zhí)行了,如下圖:

我是人民郵電出版社簽約作者,如果覺(jué)得以上回答對(duì)您有所幫助,請(qǐng)點(diǎn)個(gè)贊并關(guān)注我吧,也期待與各位留言交流,謝謝!

標(biāo)簽: