現(xiàn)有表 score
name kecheng fenshu
張三 語(yǔ)文 81
張三 數(shù)學(xué) 75
李四 語(yǔ)文 76
李四 數(shù)學(xué) 90
王五 語(yǔ)文 81
王五 數(shù)學(xué) 100
王五 英語(yǔ) 90
group by 的使用
在使用group by 時(shí),有一個(gè)規(guī)則需要遵守,即出現(xiàn)在select列表中的字段,如果沒(méi)有在聚合函數(shù)中,那么必須出現(xiàn)在group by 子句中。
(select中的字段不可以單獨(dú)出現(xiàn),必須出現(xiàn)在group語(yǔ)句中或者在組函數(shù)中。)
select a.name,a.fengshu from score a group by a.name 這是錯(cuò)誤的
select a.name,min(a.fengshu) from score a group by a.name 這是可以的
圖片表內(nèi)容 名字 和文字內(nèi)容不同,看一眼就好


以名字為主查詢,
group by having的使用
having的篩選是在分組以后,并且針對(duì)分組中的每一條數(shù)據(jù),只要有一條不符合要求,這一組都不會(huì)被篩選出來(lái)
篩選出每一門課程分?jǐn)?shù)都大于80的學(xué)生姓名
select a.name from score a group by a.name having min(a.fengshu)>80

最低分?jǐn)?shù)大于80 表里最低的 80 加了個(gè)=
where group by
where 的篩選是在分組之前,所以在where 里面可以出現(xiàn)任意字段
select a.namefrom score a
where a.fenshu>80
group by a.name

group by ordey by
select a.fenshu from score a group by a.fenshu order by a.fenshu
order by 排序
(1)order by price //默認(rèn)升序排列
(2)order by price desc //降序排列
(3)order by price asc //升序排列,與默認(rèn)一樣
(4)order by rand() //隨機(jī)排列,效率不高

ps:到底啥時(shí)候用group by ?
看select后的字段 能不能成為一個(gè)唯一標(biāo)識(shí),如果不能,則使用group by 可以分組
作者:枯木生花
來(lái)源:CSDN
原文:https://blog.csdn.net/qq_28007533/article/details/72859474?utm_source=copy
where和having的區(qū)別:
作用的對(duì)象不同。
WHERE 子句作用于表和視圖,HAVING 子句作用于組。
WHERE 在分組和聚集計(jì)算之前選取輸入行(因此,它控制哪些行進(jìn)入聚集計(jì)算), 而 HAVING 在分組和聚集之后選取分組的行。因此,WHERE 子句不能包含聚集函數(shù); 因?yàn)樵噲D用聚集函數(shù)判斷那些行輸入給聚集運(yùn)算是沒(méi)有意義的。 相反,HAVING 子句總是包含聚集函數(shù)。(嚴(yán)格說(shuō)來(lái),你可以寫不使用聚集的 HAVING 子句, 但這樣做只是白費(fèi)勁。同樣的條件可以更有效地用于 WHERE 階段。)
在上面的例子中,我們可以在 WHERE 里應(yīng)用數(shù)量字段來(lái)限制,因?yàn)樗恍枰奂?這樣比在 HAVING 里增加限制更加高效,因?yàn)槲覀儽苊饬藶槟切┪赐ㄟ^(guò) WHERE 檢查的行進(jìn)行分組和聚集計(jì)算。
綜上所述:
having一般跟在group by之后,執(zhí)行記錄組選擇的一部分來(lái)工作的。where則是執(zhí)行所有數(shù)據(jù)來(lái)工作的。
再者h(yuǎn)aving可以用聚合函數(shù),如having sum(fenshu)>1000

查詢學(xué)生的 平均分,并且此學(xué)生有兩門以上都小于80,