Mysql 的分組數(shù)據(jù)(十)

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ī)定:

  1. group by 子句可以包含任意數(shù)目的列。這使得能對分組進行嵌套,為數(shù)據(jù)分組提供更細致的控制
  2. 如果在 group by 子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進行匯總。換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回數(shù)據(jù))
  3. group by 子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數(shù))。如果在 select 中使用表達式,則必須在 group by 子句中指定相同的表達式。不能使用別名
  4. 除聚集計算語句外, select 語句中的每個列都必須在 group by 子句中給出
  5. 如果分組列中具有 null 值,則 null 將作為一個分組 返回。如果列中有多行 null 值,它們將分為一組
  6. 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ù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容