Oracle 分組函數


分組函數的介紹

分組函數作用於一組數據,並對一組數據返回一個值.

(引用網上的一張圖)

分組函數的使用規則

SELECT [column,] group_function(column)  

FROM table  

[WHERE condition]  

[GROUP BY column]  

[HAVING group_function(column)expression  

[ORDER BY column|group_function(column)expression]  

實例講解:

create table stu_class(
sno number(2) not null primary key,
sname varchar2(20) not null,
ssex varchar2(2),
sdept varchar2(20),
sclass varchar2(10),
sscore number(5)
);
insert into stu_class values(1,'小明','','信息系','軟件2班',60);
insert into stu_class values(2,'小洪','','信息系','軟件1班',70);
insert into stu_class values(3,'小亮','','電子系','機械1班',66);
insert into stu_class values(4,'小張','','電子系','機械1班',27);
insert into stu_class values(5,'小王','','信息系','軟件1班',65);
insert into stu_class values(6,'小李','','信息系','軟件1班',64);
insert into stu_class values(7,'小狗','','電子系','機械2班',60);
insert into stu_class values(8,'小貓','','電子系','機械1班',88);
insert into stu_class values(9,'小汪','','電子系','機械2班',89);

分組函數(函數的介紹和說明引用http://blog.csdn.net/rex90522/article/details/54910729)

(不加Group By語句的話只可在查詢列顯示分組函數,不可顯示其他字段)

MIN函數和MAX函數

MIN([DISTINCT|ALL] column|expression):返回每組中的最小值

MAX([DISTINCT|ALL] column|expression):返回每組中的最大值

MIN和MAX函數可以用於任何數據類型

select max(sscore) from stu_class;
select min(sscore) from stu_class;
select max(sname) from stu_class;
select max(sdept) from stu_class;

SUM函數和AVG函數

SUM([DISTINCT|ALL] column|expression):返回每組的總和

AVG([DISTINCT|ALL] column|expression):返回每組的平均值

SUM和AVG函數只能夠對數值類型的列或表達式操作

select sum(sscore) from stu_class;
select avg(sscore) from stu_class;
select avg(sscore) from stu_class where sdept='信息系;

COUNT函數

COUNT(*):返回表中滿足條件的行記錄數

COUNT([DISTINCT|ALL] column|expression):返回表中滿足條件的非空行記錄數

--當前表中的總記錄數
select count(*) from stu_class;
--查詢sclass這一列不為空時的總記錄數
select count(sclass) from stu_class;

DISTINCT函數

DISTINCT會消除重復記錄后再使用組函數

--顯示有多少不同的班級空值也會統計出來
select distinct(sclass) from stu_class;
--統計有多少院系
select count(distinct(sdept)) from stu_class;

分組函數中的空值處理

除了COUNT(*)和DISTINCT(COLUMN)之外,其他所有分組函數都會忽略列表中的空值,然后再進行計算

在分組函數中使用NVL函數可以使分組函數強制包含含有空值的記錄

select avg(sscore) from stu_class where sclass='軟件2班';
--如果sscore列有空值則按0處理
select avg(nvl(sscore,0)) from stu_class where sclass='軟件2班';

GROUP BY子句

創建數據組

使用GROUP BY子句可將表中滿足WHERE條件的記錄按照指定的列划分成若干個小組,其中GROUP BY子句指定要分組的列

SELECT [column,] group_function(column)  

FROM table  

[WHERE condition]  

[GROUP BY column]  

[HAVING group_function(column)expression  

[ORDER BY column|group_function(column)expression]  

 使用GROUP BY子句

 在SELECT列表中除了分組函數那些項,所有列都必須包含在GROUP BY子句中

--按照班級分組后求每個班級的得分最高的值,如果想將sclass查出則需要在group by語句中指定按其進行分組得到每班最大值
select sclass,max(sscore) from stu_class group by sclass;

GROUP BY所指定的列並不是必須出現在SELECT列表中

--group by 所指定的列不一定要出現在查詢列表中
select sclass,sum(sscore) from stu_class group by sdept,sclass;

按多列分組的GROUP BY子句

--按照多列進行分組查詢求平均值
select sdept,ssex,avg(sscore) from stu_class group by sdept,ssex;

HAVING子句

不能在WHERE子句中限制分組信息,要在HAVING子句中對數據組進行限制

--查詢所有女生中按照院系和班級排序后平均成績大於60的相關信息
select sdept,sclass,avg(nvl(sscore,0)) from stu_class where ssex='' group by sdept,sclass having avg(nvl(sscore,0))>60;

組函數的嵌套

與單行函數不同,組函數只能嵌套兩層

--嵌套后就不能在查詢列表中查分組函數意外的其他列了,否則會報錯
select max(avg(sscore)) from stu_class group by sdept,sclass;

SELECT語句執行過程

<1>通過FROM子句中找到需要查詢的表

<2>通過WHERE子句進行非分組函數篩選判斷

<3>通過GROUP BY子句完成分組操作

<4>通過HAVING子句完成組函數篩選操作

<5>通過SELECT子句選擇顯示的列或表達式及組函數

<6>通過ORDER BY子句進行排序操作

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM