oracle 多个分组函数,Oracle之分组函数
Group
by
1. Group by子句(利用group by子句分组数据,当select语句中使用到组函数和字段一起连用时会用到group
by,否则会出现错误)
Group by 把select查询的结果集分成几个小组,这个group
by子句可以跟在where后面且在having前面。
Group by子句也会触发排序操作,会按分组字段排序。
Select [组函数和分组的字段].....from 表名 group by[字段1],[字段2],。。。。。。;
Oracle sql语句顺序:
a. Select 显示字段或组函数 from 表名
b. [ Where 过滤条件] (不能使用组函数 ,不能使用列别名)
c. [Group by 分组条件] (不能使用列别名,只可是字段名,不可是组函数)
d. [Having 分组的过滤条件] (可以使用组函数)
e. [ Order by 排序 ] (可以使用列别名,可以使用组函数)
说明:其中的[ ]是可选项 注意:group by分组不能用列的别名
注意:只要写了group by子句,select后就只能用group
by之后的字段或者是组的函数。Having子句可以过滤组函数结果或者分组的信息,并且写在group by子句后。
使用group by子句时,必须满足下面的一些原则:
l 在select子句的后面,只能有两种类型的表达式,一种是组函数,一种是出现在group by子句后面的列名。
l 没有出现在group by子句后面的列名不能出现在select子句中非组函数表达式中,但是出现在group
by子句后面的列名可以不出现在select子句中非组合函数表达式中。
l 如果使用了where子句,那么所有参加分组计算的数据必须首先满足where子句指定的条件。
l 在默认情况下,系统按照group by子句中指定的列升序排列,但是可以使用order by子句指定新的排列顺序。
使用group by 常见的错误:
l 如果在select语句中没有出现group by子句,那么不能在select子句中同时出现单个列名和组函数的混合现象。
l 如果希望限制分组中的数据,那么可以使用having子句而不能使用where子句。即having中可以出现组函数而where不能出现组函数。
注意1:在没有group by时,select后不能把普通字段和组函数同时使用
注意2:where子句只能够过滤记录,放单行函数。Where后面跟随的条件是对所有数据的过滤的条件,在where子句中不能出现组函数。
注意3:如果希望按照多个列分组,那么会在group
by子句后面出现多个列名。这些列名称得顺序非常重要。因为不同的顺序有不同的结果。
例子1:查询求各个部门的最小,最高,工资之和
select dept_id,min(salary),max(salary),sum(salary) from s_emp
group by dept_id;
例子2:查询求各个部门的最小,最高,工资之和,部门名称
select e.dept_id,d.name,min(salary),max(salary),sum(salary) from
s_emp e , s_dept d where e.dept_id=d.id group by
e.dept_id,d.name;
例3:找出各个部门的平均工资
select dept_id,avg(salary) from s_emp group by dept_id;
注:在没有group by时,select后不能把普通字段和组函数同时使用
例4:求各个部门不同职位有多少人
select dept_id,title,count(*) from s_emp group by
dept_id,title;
例5:求除了42部门以外的各个部门的平均工资
select dept_id,avg(salary) from
s_emp where dept_id<>42 group by dept_id;
例7:求各个部门的平均工资
select max(d.name),max(r.name),avg(salary) from
s_emp e,s_dept d,s_region r
where e.dept_id=d.id and
d.region_id=r.id group by dept_id;
Having
2. Having子句(是对分组之后的数据进行过滤,所以使用having时必须用group by先分组)
Having中的组函数可以不是select 中的组函数
利用having子句过滤分组的行
注意:having要先过滤掉不需要的记录,然后再进行分组操作,提高效率。having子句可以过滤组函数结果或是分组的信息,且写在group
by子句后。
例:求平均工资大于2000的部门
select dept_id,avg(salary) from s_emp group by
dept_id having avg(salary)>2000;
组函数:
一、Oracle 服务器按下面的顺序求子句的值:
1. 如果语句包含一个 WHERE 子句,服务器建立侯选行。
2. 服务器确定在 GROUP BY 子句中指定的组。
3. HAVING 子句进一步约束不满足在 HAVING 子句中分组标准的结果分组。
二、组函数的类型:
•AVG 平均值•COUNT 计数•MAX 最大值•MIN 最小值•STDDEV 标准差•SUM 合计•VARIANCE
方差
1.所有组函数忽略空值。为了用一个值代替空值,用 NVL、NVL2 或 COALESCE 函数。
2.DISTINCT 使得函数只考虑不重复的值;ALL 使得函数考虑每个值,包括重复值。默认值是 ALL ,因此不
需要指定。
3.用于函数的参数的数据类型可以是 CHAR、VARCHAR2、NUMBER 或 DATE。
4.当使用 GROUP BY 子句时,Oracle 服务器隐式以升序排序结果集。为了覆盖该默认顺序,DESC 可以被用
于 ORDER BY 子句。
使用类型:可以使用MIN 和MAX 用于任何数据类型,AVG、SUM、VARIANCE 和 STDDEV
函数只能被用于数字
数据类型。
COUNT 函数
COUNT 函数有三中格式:
COUNT(*) 返回select语句的标准行,包括重复行,空值列的行
COUNT(expr) 由 expr 指定的非空值的数。
COUNT(DISTINCT
expr) 返回在列中的由 expr 指定的唯一的非空值的数。 在组函数中使用NVL 函数:
NVL 函数强制组函数包含空值
Java代码
SELECT AVG(NVL(commission_pct,0))FROM employees;
SELECT AVG(NVL(commission_pct, 0))FROM employees;
三、group by子句
GROUP BY 子句把表中的行划分为组。然后你可以用组函数返回每一组的摘要信息。
原则
如果在 SELECT 子句中包含了组函数,就不能选择单独的结果,除非单独的列出现在 GROUP BY 子句中。如
果你未能在 GROUP BY 子句中包含一个字段列表,你会收到一个错误信息。
使用 WHERE 子句,你可以在划分行成组以前过滤行。
在 GROUP BY 子句中必须包含列。
在 GROUP BY 子句中你不能用列别名。
默认情况下,行以包含在 GROUP BY 列表中的字段的升序排序。你可以用 ORDER BY 子句覆盖这个默认值。
在SELECT 列表中的不在组函数中的所有列必须在GROUP BY 子句中
Java代码
SELECT department_id, AVG(salary)FROM employeesGROUP BY department_id ;
SELECT department_id, AVG(salary)FROM employeesGROUP BY department_id ;
SELECT 子句指定要返回的列:
在 EMPLOYEES 表中的部门号
你在 GROUP BY 子句中指定分组的所有薪水的平均值
FROM 子句指定数据库必须访问的表:EMPLOYEES 表。
WHERE 子句指定被返回的行。因为无 WHERE 子句默认情况下所有行被返回。
GROUP BY 子句指定行怎样被分组。行用部门号分组,所以 AVG 函数被应用于薪水列,以计算每个部门的平
均薪水。
注意:分组结果被以分组列隐式排序,可以用 ORDER BY 指定不同的排序顺序,但只能用组函数或分组列。
Java代码
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary);
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary);
四。多于一个列的分组
显示在每个部门中付给每个工作岗位的合计薪水的报告。(先按部门分组,再按部门下工作岗位分组)
Java代码
SELECT department_id dept_id, job_id, SUM(salary)FROM employeesGROUP BY department_id, job_id ;
SELECT department_id dept_id, job_id, SUM(salary)FROM employeesGROUP BY department_id, job_id ;
SELECT 子句指定被返回的列:
部门号在 EMPLOYEES 表中
Job ID 在 EMPLOYEES 表中
你在 GROUP BY 子句中指定的组中所有薪水的合计
FROM 子句指定数据库必须访问的表:EMPLOYEES 表。
GROUP BY 子句指定你怎样分组行:
首先,用部门号分组行。
第二,在部门号的分组中再用 job ID 分组行。
五.非法使用组函数:
1.在SELECT 列表中的任何列或表达式(非计算列)必须在GROUP BY 子句中,在GROUP BY 子句中的列或表
达式不必在SELECT 列表中
Java代码
SELECT department_id, COUNT(last_name)FROM employees;
SELECT department_id, COUNT(last_name)
*
ERROR at line1:ORA-00937: not a single-group group
SELECT department_id, COUNT(last_name)FROM employees;
SELECT department_id, COUNT(last_name)
*
ERROR at line 1:ORA-00937: not a single-group group
无论何时,你在同一个 SELECT 语句中使用单独的列 (DEPARTMENT_ID) 和组函数 (COUNT)
的混合时,你必
须包括一个 GROUP BY 子句来指定单独的列 (在本例中,DEPARTMENT_ID)。如果缺少 GROUP
BY,将会出现
错误信息 “not a single-group group function”,并且一个星号 (*)
位于有问题的列的下面。你可以
添加 GROUP BY 子句来纠正幻灯片中的这个错误。
Java代码
SELECT department_id, count(last_name)
FROM employees
GROUP BY department_id;
SELECT department_id, count(last_name)
FROM employees
GROUP BY department_id;
2.非法使用Group 函数的查询
不能使用WHERE 子句来约束分组
可以使用HAVING 子句来约束分组
在WHERE 子句中不能使用组函数作为条件,只能用非计算列
例子:
Java代码
SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;
WHERE AVG(salary) >8000
*
ERROR at line3:ORA-00934: group function is not allowed here
SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;
WHERE AVG(salary) > 8000
*
ERROR at line 3:ORA-00934: group function is not allowed here
WHERE 子句不能用于限制组。幻灯片中的 SELECT 子句结果出现错误。因为使用 WHERE 子句限制了那些只
有部门的平均薪水大于 $8,000 的分组才能显示。
你可以用 HAVING 约束组来纠正幻灯片中的错误。
Java代码
SELECT department_id, AVG(salary)
FROM employees;
HAVING AVG(salary) >8000
GROUP BY department_id;
SELECT department_id, AVG(salary)
FROM employees;
HAVING AVG(salary) > 8000
GROUP BY department_id;
6.约束分组结果
用HAVING 子句约束分组:
1.行被分组
2.应用组函数
3.匹配HAVING 子句的组被显示
例子:
Java代码
SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE'%REP%'
GROUP BY job_id
HAVING SUM(salary) >13000
ORDER BY SUM(salary);
SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);
7.嵌套组函数
求每个部门的最大平均薪水。
Java代码
select max(avg(salary)) from employees group by department_id;
oracle 多个分组函数,Oracle之分组函数相关推荐
- oracle的高级分组函数,group by 高级函数使用
在使用group by常用的基本函数包括min,max,avg,sum,count等,除了基本函数oracle中提供了一些高级分组函数, Rollup,Cube,Grouping,Grouping s ...
- oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)
oracle的伪列以及伪表 oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Ora ...
- Oracle报错:不是单组分组函数解决
Oracle报错:不是单组分组函数解决 报错:不是单组分组函数 实例:select deptno,count(empno) from emp; 报错:不是单组分组函数 原因: 1, 如果程序中使用了分 ...
- oracle从入门到精通(4)------运算符,分组查询,函数
oracle入门到精通(4) --------------------------------------------- 1.运算符 2.分组查询 3.函数 --------------------- ...
- Oracle报错:不是单组分组函数
sql语句进行分组查询,存在聚合函数 原因:sql 的group by 语句有问题 解决办法:检查group by 后的语句,需要将语句中的非聚合函数部分写到group by中
- oracle数据库怎么分组查询,oracle数据库之分组查询
本章内容和大家分享的是数据当中的分组查询.分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1 多表查询2)而在 ...
- oracle 分组 排名,Oracle数据库之分组查询及排序
分组查询:使用 group by 来设置分组,把该列具有相同值的多条记录当成一组记录来处理,然后只会输出一条记录,得到的结果会默认使用升序的方式进行排列. 规则: (1)如果使用了分组函数,或者是 g ...
- oracle多条件分组查询数量_ORACLE分组查询和统计等
select flow_id,rw from (select t.flow_id ,rownum as rw from apex_030200.wwv_flow_list_templates t) ...
- oracle怎样使用分组查询,Oracle之分组查询
分组查询 分组,将 事物 按某方面 相同性质 进行归类.即在同组事物中,某方面性质是一致的:不同组之间,在指定性质上是不同的.按某指定性质分组后,一个包含有任意个对象的组会以该特性作为标识,整体作为一 ...
最新文章
- python转换数据类型(int、float、str、eval、tuple、list、chr、ord、bin、oct、hex)
- Android自定义progressBar
- css3中变形与动画(三)
- Linux shell的标准输入、输出和错误
- linux suse11 nfs,suse11 nfsserver服务安装
- excel中线性函数_Excel中特别有用的不常用函数之Indirect函数
- 双目相机定位3d python_用深度学习实现 2D 到 3D 的转换
- 转 Hystrix超时实现机制
- SaltStack 修复 Stack minion中的提权漏洞 (CVE-2020-28243)
- Firewalld防火墙转换成Iptables
- SQL Server2000 在 win2003上安装不上,我的解决办法
- 6月8日 论文书写——公式
- java map sort_Map 按值排序 (Map sort by value) – Java | 学步园
- 分享gif录屏与gif图片合成工具
- 苹果真伪查询_拆解报告:山寨版苹果AirPods Pro
- 【项目总结】汽车之家
- 客户画像--指标标签体系设计方案----业务视角
- 下载谷歌浏览器官方正式(稳定)版以及历史各种版本
- css实现白光划过效果
- FPGA:逻辑函数的卡诺图化简法
热门文章
- google搜索引擎的高级用法
- 优秀logo设计解析_优秀logo设计作品及寓意解析,国外精品logo设计图片分享
- 左岸:如何修炼成某一领域的高手
- Invalid HTTP method: PATCH executing PATCH
- js+css制作导航栏下划线跟随动画,App+H5点击效果
- export default (imported as router) was not found_开关插座IEC/EN/AS/NZS澳洲SAA认证
- 计算机视觉论文-2021-06-24
- 最新Linux下QQ和微信的使用(很方便)
- Qt 学习之路 2(15):标准对话框 QMessageBox
- 【T+】畅捷通T+往来单位档案中默认票据类型设置为“必录”