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之分组函数相关推荐

  1. oracle的高级分组函数,group by 高级函数使用

    在使用group by常用的基本函数包括min,max,avg,sum,count等,除了基本函数oracle中提供了一些高级分组函数, Rollup,Cube,Grouping,Grouping s ...

  2. oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)

    oracle的伪列以及伪表 oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Ora ...

  3. Oracle报错:不是单组分组函数解决

    Oracle报错:不是单组分组函数解决 报错:不是单组分组函数 实例:select deptno,count(empno) from emp; 报错:不是单组分组函数 原因: 1, 如果程序中使用了分 ...

  4. oracle从入门到精通(4)------运算符,分组查询,函数

    oracle入门到精通(4) --------------------------------------------- 1.运算符 2.分组查询 3.函数 --------------------- ...

  5. Oracle报错:不是单组分组函数

    sql语句进行分组查询,存在聚合函数 原因:sql 的group by 语句有问题 解决办法:检查group by 后的语句,需要将语句中的非聚合函数部分写到group by中

  6. oracle数据库怎么分组查询,oracle数据库之分组查询

    本章内容和大家分享的是数据当中的分组查询.分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1  多表查询2)而在 ...

  7. oracle 分组 排名,Oracle数据库之分组查询及排序

    分组查询:使用 group by 来设置分组,把该列具有相同值的多条记录当成一组记录来处理,然后只会输出一条记录,得到的结果会默认使用升序的方式进行排列. 规则: (1)如果使用了分组函数,或者是 g ...

  8. oracle多条件分组查询数量_ORACLE分组查询和统计等

    select flow_id,rw from (select t.flow_id ,rownum as rw from apex_030200.wwv_flow_list_templates t)  ...

  9. oracle怎样使用分组查询,Oracle之分组查询

    分组查询 分组,将 事物 按某方面 相同性质 进行归类.即在同组事物中,某方面性质是一致的:不同组之间,在指定性质上是不同的.按某指定性质分组后,一个包含有任意个对象的组会以该特性作为标识,整体作为一 ...

最新文章

  1. python转换数据类型(int、float、str、eval、tuple、list、chr、ord、bin、oct、hex)
  2. Android自定义progressBar
  3. css3中变形与动画(三)
  4. Linux shell的标准输入、输出和错误
  5. linux suse11 nfs,suse11 nfsserver服务安装
  6. excel中线性函数_Excel中特别有用的不常用函数之Indirect函数
  7. 双目相机定位3d python_用深度学习实现 2D 到 3D 的转换
  8. 转 Hystrix超时实现机制
  9. SaltStack 修复 Stack minion中的提权漏洞 (CVE-2020-28243)
  10. Firewalld防火墙转换成Iptables
  11. SQL Server2000 在 win2003上安装不上,我的解决办法
  12. 6月8日 论文书写——公式
  13. java map sort_Map 按值排序 (Map sort by value) – Java | 学步园
  14. 分享gif录屏与gif图片合成工具
  15. 苹果真伪查询_拆解报告:山寨版苹果AirPods Pro
  16. 【项目总结】汽车之家
  17. 客户画像--指标标签体系设计方案----业务视角
  18. 下载谷歌浏览器官方正式(稳定)版以及历史各种版本
  19. css实现白光划过效果
  20. FPGA:逻辑函数的卡诺图化简法

热门文章

  1. google搜索引擎的高级用法
  2. 优秀logo设计解析_优秀logo设计作品及寓意解析,国外精品logo设计图片分享
  3. 左岸:如何修炼成某一领域的高手
  4. Invalid HTTP method: PATCH executing PATCH
  5. js+css制作导航栏下划线跟随动画,App+H5点击效果
  6. export default (imported as router) was not found_开关插座IEC/EN/AS/NZS澳洲SAA认证
  7. 计算机视觉论文-2021-06-24
  8. 最新Linux下QQ和微信的使用(很方便)
  9. Qt 学习之路 2(15):标准对话框 QMessageBox
  10. 【T+】畅捷通T+往来单位档案中默认票据类型设置为“必录”