oracle 组函数
一、组函数嵌套
ORACLE中规定,组函数嵌套只能嵌两层。其实多层嵌套并没有实际的用途,因此ORACLE没有提供组函数的多层嵌套。但是,单行函数是可以多层嵌套的。
二、
1、Oracle包含以下组函数
-AVG([DISTINCT|ALL]n) 返回平均值,忽略空值
-COUNT({*|[DISTINCT|ALL]}expr) 返回记录的数量,用*包含空值,否则不包含空值
-MAX([DISTINCT|ALL]expr) 返回最大值,忽略空值
-MIN([DISTINCT|ALL]expr) 返回最小值,忽略空值
-SUM([DISTINCT|ALL]n) 返回总值,忽略空值
-STDDEV([DISTINCT|ALL]x) 返回标准差,忽略空值
-VARIANCE([DISTINCT|ALL]x) 返回统计方差,忽略空值
2、AVG和SUM的用法
-可以对数值型数据使用AVG和SUM
例:
SELECT AVG(sal),SUM(sal)
FROM EMP
WHERE job LIKE 'SALES%';
3、MIN和MAX的用法
-MIN和MAX可以用于任何数据类型
例:
SELECT MIN(hiredate),MAX(hiredate)
FROM emp;
结果:
MIN(HIREDATE) MAX(HIREDATE)
17-12月-80 23-5月 -87
4、
COUNT的用法
1)COUNT(*)返回表中行的总数
例:
SELECT COUNT(*)
FROM emp
WHERE deptno=30;
结果:
COUNT(*)
6
2)COUNT(expr)返回非空行的数量
例:
SELECT COUNT(comm)
FROM emp
WHERE deptno=30;
结果:
COUNT(*)
4
5.组函数和空值
1)组函数会忽略列中的空值
例:
SELECT AVG(comm)
FROM emp;
结果:
AVG(COMM)
550
2)NVL函数可以使组函数强制包含含有空值的记录
例:
SELECT AVG(NVL(comm,0))
FROM emp;
结果:
AVG(NVL(COMM,0))
157.142857
6、创建数据组
SELECT column,group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[OEDER BY column];
-通过GROUP BY子句将表中的记录划分成若干个小组
-GROUP BY子句中必须包含指定的列
-GROUP BY子句中不能使用列的别名
-当使用GROUP BY子句时Orale服务器会自动对结果集合默认按GROUP BY子句所指定的列升序排列
-在SELECT列表中除了组函数外,所有列都必须包含在GROUP BY子句中
例:
SELECT deptno,AVG(sal)
FROM emp
GROUP BY deptno;
结果:
DEPTNO AVG(SAL)
10 2916.66667
20 2175
30 1566.66667
-GROUP BY所指定的列并不是必须出现在SELECT列表中
例:
SELECT AVG(sal)
FROM emp
GROUP BY deptno;
结果:
AVG(SAL)
2916.66667
2175
1566.66667
7.按多个列分组
例:
SELECT deptno,job,sum(sal)
FROM emp
GROUP BY deptno,job;
结果:
DEPTNO JOB SUM(SAL)
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
8.使用组函数的非法查询
例:
SELECT dept,COUNT(ename)
FROM emp;
结果:
ERROR 位于第 1 行:
ORA-00937: 非单组分组函数
纠正:
SELECT dept,COUNT(ename)
FROM emp
GROUP BY deptno;
结果:
DEPTNO COUNT(ENAME)
10 3
20 5
30 6
9.限制组结果
使用HAVING子句限制组
-对记录分组
-在分组的基础上应用组函数
-与HAVING子句匹配的结果才输出
SELECT column,group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
例1:
SELECT deptno,max(sal)
FROM emp
WHERE max(sal)>2900
GROUP BY deptno;
结果:
ERROR 位于第 3 行:
ORA-00934: 此处不允许使用分组函数
纠正:
SELECT deptno,max(sal)
FROM emp
GROUP BY deptno
HAVING max(sal)>2900;
结果:
DEPTNO MAX(SAL)
10 5000
20 3000
例2:
SELECT job,SUM(sal) PAYROLL
FROM emp
WHERE job NOT LIKE 'SALES%'
GROUP BY job
HAVING SUM(sal)>5000
ORDER BY SUM(sal);
结果:
JOB PAYROLL
ANALYST 6000
MANAGER 8275
10.组函数嵌套
-与单行函数不同,组函数只能嵌套两层
例:显示平均薪水的最大值
SELECT max(avg(sal))
FROM emp
GROUP BY deptno;
结果:
MAX(AVG(SAL))
2916.66667
练习
1.使用emp表显示所有雇员的最多、最少、总和、平均薪水
SELECT ename,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
FROM emp;
2.显示emp表中不同部门编号的数量
SELECT COUNT(DISTINCT deptno)
FROM emp;
3.在emp表中根据job列分组显示雇员的最多、最少、总和、平均薪水
SELECT job,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
FROM emp
GROUP BY job;
4.使用emp表显示job名、每组最多、最少、总和、平均薪水
要求:按job列分组,ename列的名字不是以A开头,且任何组的最少薪水大于1600
SELECT job,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
FROM emp
WHERE ename NOT LIKE 'A%'
GROUP BY job
HAVING MIN(sal)>1600
5.显示部门名和每个部门的累计薪水,要求每个部门的累计薪水大于3000
SELECT dname,SUM(sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY dname
HAVING SUM(sal)>3000;
6.显示每个部门、每个岗位的最高及最低薪水
SELECT deptno,job,MAX(sal),MIN(sal)
FROM emp
GROUP BY deptno,job;
三、sql聚合函数嵌套问题
问题:我现在要查的是top client(买东西总和加起来最多的)
所以我输了 SELECT C.CLIENTNO, C.CNAME, MAX(SUM(P.AMOUNT))
FROM CLIENT C,PURCHASE P
WHERE C.CLIENTNO=P.CLIENTNO
GROUP BY C.CLIENTNO,C.CNAME;
提示说不是单组分组函数,所以 问题应该是出在 max(sum(p.amount))上吧,应该如何分开来写啊
解答:
with t as (SELECT job, deptno, sum(sal) sal FROM emp group by job, deptno)select * from t where sal = (select max(sal) from t)oracle 组函数的更多相关文章
- Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等
count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age ...
- 数据库Oracle组函数和分组函数
组函数: 组函数操作行集,给出每组的结果.组函数不象单行函数,组函数对行的集合进行操作,对每组给出一个结果.这些集合可能是整个表或者是表分成的组. 组函数与单行函数区别: 单行函数对查询到每个结果集做 ...
- Oracle 组函数count()
1.count() 函数的参数除了可以是字段值和表达式外,还可以是“ * ”.如果是字段值或表达式,则忽略空值且考虑重复值:如果是“ * ”,则计算所有的行,也包括空值.如果要查询某字段非重复值的个数 ...
- oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数
花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...
- Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt
PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...
- oracle数据库之组函数
组函数也叫聚合函数,用来对一组值进行运算,并且可以返回单个值 常见的组函数: (1)count(*),count(列名) 统计行数:找到所有不为 null 的数据来统计行数 (2)avg(列名) ...
- Oracle常用sql语句(二)之组函数、多表查询
DML(数据操纵语言) INSERT .UPDATE. DELETE 插入操作:INSERT: 语法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...); 注 ...
- oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数
花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用oracle用 ...
- ORACLE SQL 组函数【weber出品必属精品】
组函数:对一组数据进行加工,每组数据返回一个值 常用的组函数:count() avg() max() min() sum() count()函数 1. count(*) :返回总共的行 ...
随机推荐
- ubuntu挂载磁盘
1.首先查磁盘UUID:sudo blkid 2.打开挂载文件:sudo /etc/fstab 3.写挂载文件: UUID=000860AE000FDD66 /mnt/disk1 ...
- ios开发--编码格式
1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPe ...
- LAMP环境搭建教程
原文:LAMP环境搭建教程 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.M ...
- asp.net+swfupload 多图片批量上传(附源码下载)
asp.net的文件上传都是单个文件上传方式,无法执行一次性多张图片批量上传操作,要实现多图片批量上传需要借助于flash,通过flash选取多个图片(文件),然后再通过后端服务进行上传操作. 本次教 ...
- Android 【问题汇总】列表数组越界的问题
遇到了一个诡异的问题,ListView发生数组越界(偶尔会),程序崩溃. 错误信息如下: W/dalvikvm( ): threadid=: thread exiting with uncaught ...
- Android 时间轴
最近开发的app中要用到时间轴这东西,需要实现的效果如下: 想想这个东西应该可以用listview实现吧.然后最近就模拟着去写了: 首先写 listview的item的布局: listview_it ...
- Oracle ->> 查看分区表的每个分区的数据行分布情况
ora_hash函数用来返回分区号,而dbms_rowid.rowid_object()函数用来返回object_id , ) part_id ,count(*) from sales_fact_pa ...
- WEB前端介绍
1.WEB前端是神马 Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征.在互联网的演化进程中,网页制作是Web1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为 ...
- PHP中对数据库操作的封装
在动态网面设计中很多都要涉及到对数据库的操作,但是有时跟据需要而改用其它后台数据库,就需要大量修改程序.这是一件枯燥.费时而且容易出错的功作.其实我们可以用PHP中的类来实现对数据库操作的封装,从而使 ...
- python类的简单介绍
类是面向对象编程的核心, 它扮演相关数据及逻辑的容器角色.它们提供了创建“真实”对象(也就是实例)的蓝图.因为Python 并不强求你以面向对象的方式编程(与Java 不同), 此刻你也可以不学习类. ...