天天看點

009、分組查詢(group by)

分組查詢(group by)

分組查詢

分組查詢主要涉及到兩個子句,分别是:group by 和 having,having不可單獨出現,需要和group by 一起使用。

# -------------------------9、分組查詢 -------------------------
# 取得每個工作崗位的工資合計,要求顯示崗位名稱和工資合計。
select * from emp;
select job, sum(sal) from emp group by job;

# 按照工作崗位和部門編碼分組,取得的工資合計
# 在 SQL 語句中若有 group by 語句,那麼在 select 語句後面隻能跟分組函數+參與分組的字段。
select deptno, job, sum(sal) from emp group by deptno, job;

# 取得每個崗位的平均工資大于 2000
# 有group by語句,後面不能有where
select job, avg(sal) from emp group by job having avg(sal)>2000;      

select 語句總結

一個完整的 select 語句格式如下:

  select 字段

  from 表名

  where …….

  group by ……..

  having …….(就是為了過濾分組後的資料而存在的—不可以單獨的出現)

  order by ……..

以上語句的執行順序

  1. 首先執行 where 語句過濾原始資料

  2. 執行 group by 進行分組

  3. 執行 having 對分組資料進行操作

  4. 執行 select 選出資料

  5. 執行 order by 排序

原則:能在 where 中過濾的資料,盡量在 where 中過濾,效率較高。having 的過濾是專門對分組之後的資料進行過濾 的。

知識擴充:

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

參考資料:https://baijiahao.baidu.com/s?id=1664040284917893293&wfr=spider&for=pc

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;

009、分組查詢(group by)

我們使用group by将這些資料按照性别進行分組:

SELECT * FROM STUDENT GROUP BY SSEX;

不幸的是,執行失敗了,提示:不是 GROUP BY 表達式!(我用navicat 連接配接mysql 執行  SELECT * FROM t_student GROUP BY sex;  成功啊!不過還是按照他的思路搬運過來先,或許Oracle不行呢。) 

009、分組查詢(group by)

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

SELECT SSEX FROM STUDENT GROUP BY SSEX;

009、分組查詢(group by)

這下成功地将資料分為了兩組。我們接下來使用下聚合函數

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

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

009、分組查詢(group by)

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

二,group by 用法的意義

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

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

很多人會這樣寫:

SELECT * FROM STUDENT GROUP BY SSAGE

上面已經證明過了,這樣子文法不通過。

SELECT SSAGE FROM STUDENT GROUP BY SSAGE

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

009、分組查詢(group by)

正确的寫法是這樣的:

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

009、分組查詢(group by)

可以看出,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

009、分組查詢(group by)

然後使用having語句篩選:

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

查詢結果:

009、分組查詢(group by)

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

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

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

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

以上三點就是分組查詢group by的用法及講解。