分組函數的介紹
分組函數作用於一組數據,並對一組數據返回一個值.
(引用網上的一張圖)
分組函數的使用規則
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子句進行排序操作