【SQL】分组数据,过滤分组-group by , having
學(xué)習(xí)筆記,原文來自http://blog.csdn.net/robinjwong/article/details/24845125
創(chuàng)建分組 - GROUP BY
分組是在SELECT語句的GROUP BY子句中建立的。它的作用是通過一定的規(guī)則將一個數(shù)據(jù)集劃分成若干個小的區(qū)域,然后針對若干個小區(qū)域進(jìn)行數(shù)據(jù)處理。SELECT子句中的列名必須為分組列或列函數(shù),列函數(shù)對于GROUP BY子句定義的每個組各返回一個結(jié)果。
一些規(guī)定:
?
- GROUP BY 子句可以包含任意數(shù)目的列,這使得能對分組進(jìn)行嵌套,為數(shù)據(jù)分組提供更細(xì)致的控制;
- 如果在GROUP BY子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總;
- GROUP BY子句中列出的每個列都必須是檢索列或有效的表達(dá)式。如果在SELECT中使用表達(dá)式,則必須在GROUP BU子句中指定相同的表達(dá)式,不能使用別名;
- 大多數(shù)SQL實(shí)現(xiàn)不允許GROUP BU列帶有長度可變的數(shù)據(jù)類型(如文本或備select departmentid, departmentname from basicdepartment group by departmentid;注型字段);
- 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出;
- 如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列中有多行NULL值,它們將分為一組;
- GROUP BY子句必須出現(xiàn)在WHERE子句之后,ORDER BY子句之前;
過濾分組 - HAVING
除了能用GROUP BY分組數(shù)據(jù)外,SQL還允許過濾分組,規(guī)定包括哪些分組,排除哪些分組。例如,可能想要列出至少有兩個訂單的所有顧客,為了得出這種數(shù)據(jù),必須基于完整的分組而不是個別的行進(jìn)行過濾。
WHERE過濾行,而HAVING過濾分組。HAVING支持所有WHERE操作符,HAVING子句中能使用聚集函數(shù)。WHERE在數(shù)據(jù)分組前進(jìn)行過濾。HAVING在數(shù)據(jù)分組后進(jìn)行過濾。WHERE排除的行不包括在分組中。
?
?
分組 V.S. 排序 - GROUP BY V.S. ORDER BY
?
?
| ORDER BY | GROUP BY |
| 排序產(chǎn)生的輸出 | 分組行,但輸出可能不是分組的順序 |
| 任意列都可以使用 | 只可能使用選擇列或表達(dá)式列,而且必須使用每個選擇列表達(dá)式 |
| 不一定需要 | 如果與聚集函數(shù)一起使用列,則必須使用 |
千萬不要僅依賴GROUP BY排序數(shù)據(jù)。
?
示例
?
下表:學(xué)生號(SNO),課程名(PNO),成績(GRADE)
1 YY ?90
1 SX 98
1 YW 95
2 YY 92
2 SX 91
2 YW 89
3 YY 96
3 SX 88
3 YW 85
4 YY 88
4 SX 89
4 YW 95
1. 顯式90分以上學(xué)生的課程名和成績
(不涉及分組計算,數(shù)據(jù)塊是原始表就行)
? select?*?from?sc?where?GRADE?>=?90??
2. ?顯式每個學(xué)生的成績在90分以上的各有多少門
?
(涉及到分組計算,單獨(dú)計算的數(shù)據(jù)快為每個學(xué)生,數(shù)據(jù)塊整體沒有要求(因此沒有having),但是提前需要用where過濾)select?SNO,?count(*)?from?sc?where?GRADE?>=?90?group?by?SNO ?
3. ?至少有兩門課程在90分以上的學(xué)生號及90分以上的課程數(shù) (過濾分組)
(涉及到分組計算,同時數(shù)據(jù)庫也有要求)
select?SNO,?count(*)?from?sc?where?GRADE?>=?90?group?by?SNO?having?count(*)?>=?2 ?
4. ?選出平均成績大于90分,且語文必須在95以上的學(xué)生
?
(涉及到分組計算,且之前有過濾)
?
select?SNO,?avg(GRADE)?
from?sc?
where?SNO?in?(select?SNO?from?sc?where?PNO?=?'YW'?and?GRADE?>=?95)?
group?by?SNO?
having?avg(GRADE)?>=?90 ?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/coskaka/p/7193360.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的【SQL】分组数据,过滤分组-group by , having的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5有哪些新特性、移除了那些元素?
- 下一篇: 有趣的Ruby-学习笔记3