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