如何使用使用 HAVING 與 ORDER BY?

Rich Dad發表於2020-10-19

時間煮雨
@R星校長

使用having子句進行分組篩選

簡單來說,having子句用來對分組後的資料進行篩選,即having針對查詢結果中的列發揮篩選資料作用。因此having通常與Group by連用。

基本格式:

select [聚合函式] 欄位名 from 表名 [where 查詢條件] [group by 欄位名] [having 欄位名 篩選條件]

Info的資料資訊仍如下:

categorycountdigest
a5a2002
a2a2001
a11a2001
b20b2003
b15b2002
b3b2001
c9c2005
c9c2004
c8c2003
c7c2002
c4c2001

示例:查詢將表中資料分類後數量大於20的類別資訊

在這裡插入圖片描述

select語句中,wheregroup byhaving子句和聚合函式的執行次序如下:

  1. where子句從資料來源中去除不符合條件的資料;

  2. 然後group by子句蒐集資料行到各個組中;

  3. 接著統計函式為各個組計算統計值;

  4. 最後having子句去掉不符合其組搜尋條件的各組資料行。

HavingWhere的區別

where子句都可以用having代替,區別在於where過濾行,having過濾分組;

where子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾資料,where條件中不能包含聚組函式,使用where條件過濾出特定的行;

having子句的作用是篩選滿足條件的組,即在分組之後過濾資料,條件中經常包含聚組函式,使用having條件過濾出特定的組,也可以使用多個分組標準進行分組。

having結合where示例:

在這裡插入圖片描述

Group ByOrder By

基本格式

select [聚合函式] 欄位名 from 表名 [where 查詢條件] [group by 欄位名] [order by 欄位名 排序方向]

示例:(以降序方式輸出資料分類的彙總)

在這裡插入圖片描述
若分組欄位和排序欄位一樣時,可不需要order by關鍵字,則只需告知排序方向,即可簡寫成:

在這裡插入圖片描述

程式設計要求

  1. 我們要評選三好學生,條件是至少有兩門課程在90分以上(包括90分)才能有資格,請列出符合的學生的學號(sno)及其90分以上(包括90分)科目總數;
  2. 學校評選先進學生,要求平均成績大於90分(包括90分)的學生都有資格,並且語文課必須在95分以上(包括95分),請列出有資格的學生的學號(sno)及其科目的平均分。

給定資料表tb_grade格式如下:

snopnoscore
1語文95
1數學98
1英語90
2語文89
2數學91
2英語92
3語文85
3數學88
3英語96
4語文95
4數學89
4英語88

預期輸出:

sno    count(*)
1        3
2        2
sno    avg(score)
1        94.3333
4        90.6667

開始你的任務吧,祝你成功!

USE School;

#請在此處新增實現程式碼
########## Begin ##########

#1.查詢表中至少有兩門課程在90分以上的學生資訊
select sno, count(*) 
from tb_grade
where score >= 90
group by sno 
having count(*) >= 2;

#2.查詢表中平均成績大於90分且語文課在95分以上的學生資訊
select sno, avg(score)
from tb_grade
where sno in 
(select sno from tb_grade 
where score >=95 and pno = '語文')
group by sno
having avg(score) > 90;

########## End ##########

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章