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

2021-01-08 Git聯盟

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的用法及講解。希望大家多多練習,多多實踐。溫故而知新!

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

相關焦點

  • mysql 資料庫group_concat函數的一些用法
    對於group_contact函數一般懂一點sql的人來說,並不算太陌生,它主要配合group by 使用,起著分組時,將涉及行的相應的欄位串聯成一個欄位如下表a:我們按照type分類,並將對應的名稱按逗號分隔保存為一個names欄位可以寫為:select type,group_concat(name) names from a group by
  • MySQL教程之concat以及group_concat的用法
    3、舉例:例3:我們使用concat_ws()將 分隔符指定為逗號,達到與例2相同的效果:例4:把分隔符指定為null,結果全部變成了null:三、group_concat()函數前言:在有group by的查詢語句中,select指定的欄位要麼就包含在group by語句的後面,作為分組的依據,要麼就包含在聚合函數中
  • MySQL拼接字符串,GROUP_CONCAT 值得擁有
    主角閃亮登場GROUP_CONCAT(expr)在 Mysql 官方文檔 中,該函數被放在聚合函數章節,如果你要按照指定欄位分組拼接,就要配合關鍵字GROUP BY來使用的定義該函數返回一個字符串結果,該字符串結果是通過分組串聯的非NULL值。如果沒有非NULL值,則返回NULL。完整語法如下:What?
  • 篩選大於當前天oracle - CSDN
    * from studentinfo where to_char(stujointime,'yyyy') = '2007'triggers 練習三:分組函數練習1、查詢所有學員的平均年齡(要求保留兩位小數) select trunc(avg(stuage),2) from studentinfo ;2、查詢所有考試的總成績 select
  • pandas系列(三)Pandas分組
    分組函數的基本內容:(a)根據某一列分組grouped_single = df.groupby('School')經過groupby後會生成一個groupby對象,該對象本身不會返回任何東西,只有當相應的方法被調用才會起作用例如取出某一個組:grouped_single.get_group('S_2').head()
  • Oracle 19C rac集群靜默安裝操作手冊v2.0 for centos7
    /usr/sbin/groupadd -g 50001 oinstall2./usr/sbin/groupadd -g 50002 dba3./usr/sbin/groupadd -g 50003 oper4./usr/sbin/groupadd -g 50004 backupdba5.
  • mysql查詢——統計每日新用戶數量
    方法一:第一步,根據UserId分組查詢,得出每個用戶的最小登錄日期即各個用戶首次登錄網站的日期。select UserId,min(Date)as login_datefrom User_Activitieswhere Activity='login'group by UserId;查詢結果如下:
  • oracle 函數decode用法
    ELSIF 條件=值n THENRETURN(翻譯值n)ELSERETURN(預設值)END IFDECODE的用法這裡主要說的就是decode的用法,在很多時候這個函數還是很有用的。1.翻譯值數據截圖:需求:查詢出的數據,1表示男生,2表示女生select t.id,t.name,t.age,decode(t.sex, '1', '男生', '2', '女生', '其他') as sexfrom STUDENT2 t結果:2.decode比較大小
  • oracle 查詢昨天記錄專題及常見問題 - CSDN
    我寫了一小段代碼來驗證這個內容,參考:[oracle@jumper oracle]$ cat unsign.c#include int main(void){unsigned int num = 0xffffffff;printf("num is %d bits long\n", sizeof(num) * 8);printf("
  • 數據查詢的知識
    數據查詢市資料庫的核心操作單表查詢選擇表中的若干列查詢表中的部分或者全部列即關係代數的投影運算(1)指定列查詢語句select 【內容】 from 【表】;例如查詢學生的學號、姓名select sno,sname from student;(2)查詢全部列語句:語句
  • 零基礎學Oracle之2:開始使用oracle
    零基礎學Oracle之2:開始使用oracle1、 資料庫管理工具OUI:安裝使用,自帶的DBCA:圖形化創建資料庫,初學者使用SQL*PLUS:重點掌握OEM:外圍產品2、 OUI:統一安裝器而oracle則力推java,把java虛擬機內嵌到oracle中。[oracle@wl database]$ ./runInstaller 在資料庫軟體目錄下執行這個安裝,類似於windows的setup
  • oracle 查詢 今天、昨天、本周、本月、本季度的所有記錄
    我寫了一小段代碼來驗證這個內容,參考:[oracle@jumper oracle]$ cat unsign.c#include int main(void){unsigned int num = 0xffffffff;printf("num is %d bits long\n", sizeof(num) * 8);printf("
  • 製作多維度分組交叉銷售統計表
    如表樣所示,左側分別有「地區」和「銷售員」兩個分組,均按照上面「產品類別」匯總數據,分上下兩片來呈現。(客戶地區; 客戶地區:1)  B4:=ds1.group(銷售人員; 銷售人員:1)  C2:=ds1.group(產品類別; 產品類別:1)  C3:=ds1.sum(訂單金額)  C4:=ds1.sum(訂單金額)   4、 保存,預覽報表結果
  • Oracle資料庫參數優化參考
    下面為一些參數調優參考:一、db_file_multiblock_read_count:oracle讀取數據有兩種方式:1)通過rowid(即索引掃描)2)通過全表掃描如果是全表掃描時,oracle會一次讀取多個blocks,每次讀取的塊數將受初始化參數db_file_multiblock_read_count和作業系統的
  • 零基礎學Oracle之4:理解oracle的啟動與關閉
    spfile.ora, 啟動instance3) 查找initSID.ora這個文件並啟動instance4) 使用預設pfile,也就是在敲命令時STARTUP PFILE = $ORACLE_HOME/dbs/initDBA1.ora,直接用指定的pfile啟動instance2、 oracle
  • 複雜sql處理邏輯 case when的用法
    (比如上圖一、圖二)背景:後臺採用三個表trainee_info 實習生表 trainee_rotation_program 計劃表 trainee_group_info 輪換分組表計劃表中存在 trainee_id 實習生id 、group_id 分組id 、plan_type 計劃類型 計劃類型為1或者為null的是輪換計劃,關聯分組id
  • ORACLE序列:基本概念和使用說明
    CURRVAL=返回 sequence的當前值  NEXTVAL=增加sequence的值,然後返回 sequence 值  比如:  emp_sequence.CURRVAL  emp_sequence.NEXTVAL  可以使用sequence的地方:  ①不包含子查詢