Oracle分組查詢group by的用法及講解

Oracle分組查詢group by的用法及講解

Oracle分組查詢group by的用法及講解 (baidu.com)

group by是sql中比較強大的功能,是在對數據分組統計時必不可少的用法。但是,對於很多經驗不足的同學,經常會寫錯。今天我們就以Oracle爲例,來講解下分組查詢group by的用法。

一,group by 語法規範

首先我們準備一張Student表

CREATE TABLE STUDENT

( SNO VARCHAR2(10) not null,

SNAME VARCHAR2(20),

SAGE NUMBER(2),

SSEX VARCHAR2(5) )

往裏面插入幾條學生實體記錄。再查看數據:

SELECT * FROM STUDENT;

我們使用group by將這些數據按照性別進行分組:

SELECT * FROM STUDENT GROUP BY SSEX;

不幸的是,執行失敗了,提示:不是 GROUP BY 表達式!

原因是group by 分組查詢,select子句後的字段必須來自group by後的分組字段。於是 我們執行SQL

SELECT SSEX FROM STUDENT GROUP BY SSEX;

這下成功地將數據分爲了兩組。我們接下來使用下聚合函數

SELECT SSEX,MAX(SAGE) FROM STUDENT GROUP BY SSEX;

注意這條sql語句,select子句中聚合函數使用了SAGE(年齡)這個字段,那會不會違背了前面所說的 “select子句後的字段必須來自group by後的分組字段”這個規律呢,我們來執行一下:

能正常執行,成功地按照了性別分組,並且查詢出了性別對應年齡最大的學生。於是我們可以得出規律:select子句後的任一非聚合函數字段都應來源於group by 分組語句後,否則語法會編譯不通過。

二,group by 用法的意義

我們都知道group by 是用來分組的,那麼具體怎麼分組,對應的語句又怎麼寫呢?我們一起來研究下。

示例:按照年齡將學生分組。

很多人會這樣寫:

SELECT * FROM STUDENT GROUP BY SSAGE

上面已經證實過了,這樣子語法不通過。

SELECT SSAGE FROM STUDENT GROUP BY SSAGE

如果這樣寫的話,也只會單純地將年齡分組。

正確的寫法是這樣的:

SELECT SNAME,SAGE FROM STUDENT GROUP BY SAGE,SNAME ORDER BY SAGE;

可以看出,group by 分組是按照group by後的字段組合來進行分組的。也就是說你group by後給了我幾個字段,我就按照這幾個字段組合成一條記錄,若有重複的記錄,就屬於同一組,最後將所有的分組返回給你。

同時上訴sql的order by語句也要符合group by的語法,即order by後的字段必須來源於group by分組字段。所以我們可以把分出來的組理解爲試圖,所有的其他操作都基於這張視圖。

三,分組查詢的篩選where和having

示例:查詢出性別爲男的學生並按照年齡分組,並篩選出年齡大於21歲的

我們首先實現錢半部分:查詢出性別爲男的學生並按照年齡分組

SELECT SNAME,SAGE FROM STUDENT where SSEX='男' GROUP BY SNAME,SAGE

然後使用having語句篩選:

SELECT SNAME,SAGE FROM STUDENT where SSEX='男' GROUP BY SNAME,SAGE HAVING SAGE>'21'

查詢結果:

可以看到,小於等於21歲的男同學都被過濾掉了。

我們這裏可以進行總結下:

1. 當在一個SQL中同時使用where和group by和having子句時,其執行順序爲:where>group by>having。

2. 同時where子句作用於表或者視圖,having子句作用於組,having子句必須作用在group by之後。

以上三點就是分組查詢group by的用法及講解。希望大家多多練習,多多實踐。溫故而知新!

最後祝大家身體健康,財源滾滾!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章