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

group by在sql中怎么使用?

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

網(wǎng)友解答:

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

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

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

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

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

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

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

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

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

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

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

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

再如,對表達(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)品

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

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

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

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

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

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

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

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

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

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

返回的總量數(shù)據(jù)仍然不變,記錄數(shù)也不變,只是沒有了年份列,數(shù)據(jù)查看起來比較費(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ù)。請注意,不同的數(shù)據(jù)庫,轉(zhuǎn)換函數(shù)是不一樣的,CStr是Access數(shù)據(jù)庫中的用法,SQLServer用的是convert。

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

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

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

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

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

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

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

這是對產(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í)行錯誤。這是因?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

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

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

標(biāo)簽: