分组函数的介绍

分组函数作用于一组数据,并对一组数据返回一个值.

(引用网上的一张图)

分组函数的使用规则

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子句进行排序操作

Oracle 分组函数的更多相关文章

  1. 【转】【CUBE】Oracle分组函数之CUBE魅力

    http://blog.itpub.net/519536/viewspace-610997/ Oracle的CUBE与ROLLUP功能很相似,也是在数据统计分析领域的一把好手.  关于ROLLUP的查 ...

  2. Oracle分组函数之CUBE魅力

    Oracle的CUBE与ROLLUP功能很相似,也是在数据统计分析领域的一把好手. 关于ROLLUP的查询统计功能请参考文章<Oracle分组函数之ROLLUP魅力>(http://www ...

  3. Oracle分组函数之ROLLUP用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  4. oracle 分组函数执行分析

    先上例了: select job as "JOB1", avg(sal) as "avg sal" from scott.emp group by " ...

  5. [转]【ROLLUP】Oracle分组函数之ROLLUP魅力

    原创:http://blog.itpub.net/519536/viewspace-610995 本文通过演示给出Oracle ROLLUP分组函数的用法,体验一下Oracle在统计查询领域中的函数魅 ...

  6. Oracle分组函数以及数据分组

    简单总结一下对于数据的分组和分组函数. 本文所举实例,数据来源oracle用户scott下的emp,dept ,salgrade 3表:数据如下: 一.分组函数 1.sum()求和函数.max()求最 ...

  7. Oracle分组函数实例

    分组函数也叫聚合函数.如果在查询只想要查分组函数,那么跟平时的查询语句并无不同: SQL ,,,,) ; SUM(T.PRIZENUM) AVG(T.PRIZENUM) --------------- ...

  8. oracle 分组函数、视图

    组函数 分组函数作用于一组数据,对每一组返回一个值 组函数类型: 1.计数        count(列名 或 表达式)     对满足的行数进行统计 2.求和        sum(列名 或 表达式 ...

  9. Oracle分组函数之ROLLUP

    功能介绍: 首先是进行无字段的聚合,然后在对字段进行从左到右依次组合后聚合 创建表: Create Table score ( classID Int, studentName ), subject ...

随机推荐

  1. VC++中CEdit控件实现回车换行

    1.通过回车Enter换行: 这里要有两个设置 <1>.将控件的属性设置为Mutilines->true; <2>.将控件的另一个属性设置为Want return-> ...

  2. 编程之美 set 14 小飞的电梯调度算法

    题目 电梯每次上升只停一次, 求问电梯停在哪一楼能够保证乘坐电梯的所有乘客爬楼层的层数之和最小 思路 假设电梯的层数是 m, 乘客人数是 n 1. 枚举, 时间复杂度是 o(mn) 2. 滚动解法. ...

  3. Splash界面完美实现

    Flash闪烁界面的实现原理 1.首先 new一个数组里面放一些Random图片 private int[] drawables = new int[]{R.drawable.a,R.adable.b ...

  4. DistroWatch评估XStream桌面153版本

    导读 XStreamOS是一个由Sonicle创建的Solaris的一个版本.XStream桌面将Solaris的强大带给了桌面用户,同时新手用户很可能有兴趣体验一下.DistroWatch对于XSt ...

  5. 用VS不同版本打开项目,报错:MS Build Error MSB4019: Microsoft.WebApplication.targets was not found

    本例是在用VS2008打开项目是报错 未找到C:\Program Files\MSBuild\Microsoft\VisualStudio\V10.0 In the last article Buil ...

  6. 用Java向数据库中插入大量数据时的优化

    使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试: public void ex ...

  7. 160415、sql语句sort排序,sort为空的在后面

    按sort排序,sort为空的在后面 select * from 表名 order by (case when sort is null or sort='' then 1 else 0 end),s ...

  8. Struts2数据验证与使用Java代码进行数据验证

    Struts2数据验证 使用Java代码进行数据验证 重写ActionSupport的validate()方法 对Action类的中所有请求处理方法都会进行验证! 对Action类的数据属性进行检查, ...

  9. HDU5667—Sequence(对数转化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5667 题目意思:f1=1,i=1 f2=2 ,i=2 fi=a^b*f[i-1]^c*f[i-2] i ...

  10. disable的错误使用

    表单中的input设为disable后数据无法提交. 如果需要设置无法修改效果,但又想表单提交数据,可以设置readonly.