`
yde986
  • 浏览: 97762 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle分组函数学习小结

阅读更多

一、Group by
   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子句时,必须满足下面的一些原则:
   a、在select子句的后面,只能有两种类型的表达式,一种是组函数,一种是出现在group by子句后面的列名。
   b、没有出现在group by子句后面的列名不能出现在select子句中非组函数表达式中,但是出现在group by子句后面的列名可以不出现在select子句中非组合函数表达式中。
   c、如果使用了where子句,那么所有参加分组计算的数据必须首先满足where子句指定的条件。
   d、在默认情况下,系统按照group by子句中指定的列升序排列,但是可以使用order by子句指定新的排列顺序。
   使用group by 常见的错误:
   a、如果在select语句中没有出现group by子句,那么不能在select子句中同时出现单个列名和组函数的混合现象。
   b、如果希望限制分组中的数据,那么可以使用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
   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;

 

三、组函数:
1、Oracle 服务器按下面的顺序求子句的值:
   a. 如果语句包含一个 WHERE 子句,服务器建立侯选行。
   b. 服务器确定在 GROUP BY 子句中指定的组。
   c. HAVING 子句进一步约束不满足在 HAVING 子句中分组标准的结果分组。

2、组函数的类型:
   •AVG 平均值
   •COUNT 计数
   •MAX 最大值
   •MIN 最小值
   •STDDEV 标准差
   •SUM 合计
   •VARIANCE 方差
   a.所有组函数忽略空值。为了用一个值代替空值,用 NVL、NVL2 或 COALESCE 函数。
   b.DISTINCT 使得函数只考虑不重复的值;ALL 使得函数考虑每个值,包括重复值。默认值是 ALL ,因此不需要指定。
   c.用于函数的参数的数据类型可以是 CHAR、VARCHAR2、NUMBER 或 DATE。
   d.当使用 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;

 

四、多于一个列的分组
   显示在每个部门中付给每个工作岗位的合计薪水的报告。(先按部门分组,再按部门下工作岗位分组)
Java代码
   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 line 1: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代码
   ELECT 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 line 3: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、单行函数:表的每行都会有一个结果(字符函数、数字函数、日期函数、转换函数) 单行函数可以嵌套。嵌套函数的执行顺序是由内到外。 2、多行函数:表...

    ORACLE 常用分析函数

    PLSQL开发笔记和小结;分析函数简述  ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值...

    Oracle之分析函数.pdf

    分析函数是 Oracle 专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计。本文总结了若干分析函数的使用方式,供大家学习参考,有...

    oracle11g

    第五章:分组函数 第六章:数据限定和排序 第七章:复杂查询(上):多表连接技术 第八章:复杂查询(下):子查询 第二部分:用户及数据库对象 第九章:用户访问控制 第十章:Oracle的事务和锁 第十一章:...

    Oracle SQL高级编程

    1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    Oracle_Database_11g完全参考手册.part3/3

    通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...

    Oracle_Database_11g完全参考手册.part2/3

    通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...

    oracle实验报告

    (1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

     1.6 小结  第2章使用SQL*Plus工具  2.1 启动、退出SQL*Plus  2.1.1启动、退出SQL*Plus  2.1.2 设置操作界面风格  2.1.3 获取SQL*Plus命令的帮助  2.2 编辑、运行语句和命令  2.3 DESCRIBE命令  2.4...

    Oracle 错误代码整理总结

    常见错误: ORA-00001:违反唯一约束条件(主键错误) ORA-00028:无法连接数据库进程 ORA-00900:无效sql语句 ORA-00904:字段名写错或是建表时最后一个字段有逗号 ...ORA-00937:不是单组分组函数 ORA-00942:

    Oracle数据库、SQL

    4.3字符串是大小写敏感的,在比较时严格区分大小写 8 4.4 where子句后面可以跟多个条件表达式 8 4.5 between and运算符 8 4.6 in运算符(多值运算符) 8 4.7 like运算符 9 4.8 is null运算符 9 4.9比较和逻辑运算符...

    OCA认证考试指南1Z0-051

    1.6 认证小结 1.7 本章 测试题 1.7.1 自测题 1.7.2 实验题 1.7.3 自测题答案 1.7.4 实验题答案 第2章 使用SQLSELECT语句检索数据 2.1 列出SQLSELECT语句的性能 2.1.1 SQLSELECT语句介绍 2.1.2 ...

    (E文)基于成本的Oracle优化法则.pdf

    1.5 本章小结 8 1.6 测试用例 8 第2章 表扫描 9 2.1 入门 10 2.2 提高 14 2.2.1 块大小的影响 14 2.2.2 CPU成本计算 16 2.2.3 CPU成本计算的作用 22 2.3 BCHR 24 2.4 并行执行 27 2.5 索引快速全扫描 30 2.6 分区 32...

    关系型数据库管理系统之MySql学习总结

    文章目录数据库介绍MySql介绍添加数据导入数据查询数据内连接左外连接/右外连接子查询约束函数聚合函数分组函数数学函数字符串函数日期时间函数条件判断函数系统信息函数加密函数格式化函数自定义函数视图事务存储...

    SQL必知必会(第3版)--详细书签版

    1.4 小结 7 第2章 检索数据 8 2.1 SELECT语句 8 2.2 检索单个列 9 2.3 检索多个列 10 2.4 检索所有列 11 2.5 小结 12 第3章 排序检索数据 13 3.1 排序数据 13 3.2 按多个列排序 15 3.3 按列位置排序 15 ...

    精通SQL 结构化查询语言详解

    17.5 小结  第18章 事务控制与并发处理 18.1 SQL事务控制  18.1.1 事务控制的引入  18.1.2 事务的特性  18.1.3 SQL中与事务有关的语句  18.2 事务控制的具体实现 18.2.1 开始事务  18.2.2 SET ...

    SQL 数据分析:销售数据的小计/合计/总计以及数据透视表

    学习过 SQL 的人都知道,使用聚合函数(AVG、SUM、COUNT、MIN/MAX 等)和分组操作(GROUP BY)可以对数据进行基本的统计分析,例如统计公司员工的人数、每个部门的平均月薪等。如果想要回顾这些基础概念,可以参考这...

Global site tag (gtag.js) - Google Analytics