
timg.jpeg
本節(jié)將簡單介紹分組數(shù)據(jù),以便能匯總表內(nèi)容的子集
分組數(shù)據(jù)
select sid, avg(score)
from sc
group by sid;
此查詢語句返回了每個學生的平均分,輸出為:
+------+------------+
| sid | avg(score) |
+------+------------+
| 01 | 73.00000 |
| 02 | 70.00000 |
| 03 | 80.00000 |
| 04 | 63.33333 |
| 05 | 81.50000 |
| 06 | 32.50000 |
| 07 | 93.50000 |
+------+------------+
使用 WITH ROLLUP 關(guān)鍵字,可以得到每個分組以及每個分組匯總級別(針對每個分組)的值,如
select sid, avg(score)
from sc
group by sid with rollup;
此查詢語句返回了所有學生各自的平均分,以及所有學生的平均分,輸出為:
+------+------------+
| sid | avg(score) |
+------+------------+
| 01 | 73.00000 |
| 02 | 70.00000 |
| 03 | 80.00000 |
| 04 | 63.33333 |
| 05 | 81.50000 |
| 06 | 32.50000 |
| 07 | 93.50000 |
| NULL | 70.77778 |
+------+------------+
在具體使用 group by 子句前,需要知道一些重要的規(guī)定:
- group by 子句可以包含任意數(shù)目的列。這使得能對分組進行嵌套,為數(shù)據(jù)分組提供更細致的控制
- 如果在 group by 子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進行匯總。換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回數(shù)據(jù))
- group by 子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數(shù))。
如果在 select 中使用表達式,則必須在 group by 子句中指定相同的表達式。不能使用別名 - 除聚集計算語句外, select 語句中的每個列都必須在 group by 子句中給出
- 如果分組列中具有 null 值,則
null 將作為一個分組返回。如果列中有多行 null 值,它們將分為一組 - group by 子句必須出現(xiàn)在
where 子句之后, order by 子句之前
過濾數(shù)組
這里有另一種理解方法,
where 在數(shù)據(jù)分組前進行過濾, having 在數(shù)據(jù)分組后進行過濾。這是一個重要的區(qū)別, where 排除的行不包括在分組中。這可能會改變計算值,從而影響 having 子句中基于這些值過濾掉的分組
select sid, avg(score) as score_avg
from sc
group by sid
having avg(score) > 70;
此查詢語句返回了所有平均分大于 70 的數(shù)據(jù),輸出為:
+------+-----------+
| sid | score_avg |
+------+-----------+
| 01 | 73.00000 |
| 03 | 80.00000 |
| 05 | 81.50000 |
| 07 | 93.50000 |
+------+-----------+
如何在一個查詢語句中既使用 where 有使用 having,語句如下:
select sid, avg(score)
from sc
where score > 60
group by sid
having avg(score) >= 80;
此查詢語句返回了分數(shù)在 60 分以上的所有平均分大于等于 80 的學生,輸出為:
+------+------------+
| sid | avg(score) |
+------+------------+
| 01 | 89.50000 |
| 03 | 80.00000 |
| 05 | 81.50000 |
| 07 | 93.50000 |
+------+------------+
分組和排序
一般在使用 group by 句時,應該也給出 order by 子句
| 比較類目 | order by | group by |
|---|---|---|
| 作用 | 排序產(chǎn)生的輸出 | 分組行。但輸出可能不是分組的順序 |
| 使用范圍 | 任意列都可以使用(甚至非選擇的列也可以使用) | 只可能使用選擇列或表達式列,而且必須使用每個選擇列表達式 |
| 是否一定需要 | 不一定需要 | 如果與聚集函數(shù)一起使用列(或表達式),則必須使用 |
select sid, avg(score)
from sc
group by sid
having avg(score) >= 60
order by avg(score);
此查詢語句表示查詢所有平均分大于等于 60 的學生,并按照平均分排序,輸出為:
+------+------------+
| sid | avg(score) |
+------+------------+
| 04 | 63.33333 |
| 02 | 70.00000 |
| 01 | 73.00000 |
| 03 | 80.00000 |
| 05 | 81.50000 |
| 07 | 93.50000 |
+------+------------+
select 子句順序
| 子句 | 說明 | 是否必須使用 |
|---|---|---|
| select | 要返回的列或表達式 | 是 |
| from | 從中檢索數(shù)據(jù)的表 | 僅在從表選擇數(shù)據(jù)時使用 |
| where | 行級過濾 | 否 |
| group by | 分組說明 | 僅在按組計算聚集時使用 |
| having | 組級過濾 | 否 |
| order by | 輸出排序順序 | 否 |
| limit | 要檢索的行數(shù) | 否 |