`
wangqinqin
  • 浏览: 58820 次
  • 性别: Icon_minigender_2
  • 来自: 江苏
社区版块
存档分类
最新评论

Oracle中的gruop by子句和having子句

阅读更多

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后不能把普通字段和组函数同时使用

注意2where子句只能够过滤记录,放单行函数。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;

 

 

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;

 

分享到:
评论
1 楼 wosxiaoyacongsd 2011-03-07  
谢谢!!!!

相关推荐

    Oracle中分组查询group by用法规则详解

    Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总信息。 使用having子句 限制返回的...

    oracle中where 子句和having子句中的区别介绍

    2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE 3.WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以  Where和Having都是对查询结果的一种筛选,说的书面点...

    Oracle基础之group by和聚合函数

    当我们刚开始学Oracle时,见到group by,常常会来个三连问:为什么要用group by?group by应该怎么用?为什么写了group by运行时会提示“不是单组分组函数;...by语句一般放在where语句的后面,若有having子句,则放

    sql/having用法

    在Oracle中having子句对group by子句所确定的行组进行控制,having子句条件中只允许涉及常量,聚组函数或group by 子句中的列。

    SQL 中having 和where的区别分析

    在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照...

    group by,having,order by的用法详解

    一,如果一个查询中使用了分组函数,任何不在分组函数中的列或表达式必须要在group by中,否则出错。 第一个查询中,deptno没有出现在group by中,也没有出现在分组函数中,因此出错。将deptno改成job就可以了。该条...

    Oracle SQL高级编程

    1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 ...

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

    4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合函数 114 4.4 小结 114 第5章 关于问题 116 5.1 问出好的问题 116 5.2 提问的目的 117 5.3 问题的种类 117 5.4 关于问题的问题 119 5.5 关于数据的问题...

    《Oracle Database编程指南》之15:聚合函数(Aggregate Functions)

    聚合函数可以出现在SELECT列表中,也可以出现在ORDER BY和HAVING子句中,它们通常与SELECT语句中的GROUP BY子句一起使用,但这不是强制的。 首先,在SELECT语句中,Oracle数据库将查询的表或视图的行划分为组。 如果...

    Oracle11g从入门到精通2

    3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 ...

    Oracle数据库、SQL

    十、 having子句 18 10.1语法和执行顺序 18 10.2执行过程 18 10.3 where和having区别 18 十一、 非关联子查询 19 11.1语法 19 11.2子查询的执行过程 19 11.3常见错误 19 11.4子查询与空值 19 11.5多列子查询 20 十二...

    Oracle Database 11g初学者指南--详细书签版

    4.9 group by和having子句 103 4.9.1 group by 103 4.9.2 having 104 4.10 子查询:简单子查询和带连接的相关比较 107 4.10.1 简单子查询 107 4.10.2 带连接的相关子查询 108 4.11 集合操作符:union、...

    Oracle数据库Sql语句详解大全

    使用HAVING子句对分组后的数据进行过滤 第六章 子查询 第七章 数据建模及数据库设计 了解系统开发的步骤 数据关系的定义 理解实体关系映射图(E-R图) 第八章 创建表 掌握创建表的语法 Oracle的数据类型 使用约束...

    oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

    4.9 groupby和having子句 4.9.1 groupby 4.9.2 having 4.10 子查询:简单子查询和带连接的相关比较 4.10.1 简单子查询 4.10.2 带连接的相关子查询 4.11 集合操作符:union、intersect和minus 4.11.1 union 4.11.2 ...

    非常全的oracle文档

    19.10. HAVING子句 117 19.11. 实用方法 118 19.12. 练习 118 二十、 子查询 119 20.1. 使用子查询 120 20.2. IN\NOT IN操作符 122 20.3. ANY和ALL操作符 123 20.4. 常见查询错误 124 20.5. 多列子查询 125 20.6. ...

    Oracle11g从入门到精通

    3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2 REVOKE...

    oracle数据库经典题目

    5.Where子句可以接收From子句输出的数据,而HAVING子句则可以接收来自WHERE、FROM或GROUP BY子句的输入。 6.在SQL语句中,用于向表中插入数据的语句是Insert。 7.如果需要向表中插入一批已经存在的数据,可以在...

    Oracle_Database_11g完全参考手册.part3/3

    12.1 groupby和having的用法 12.1.1 添加一个orderby 12.1.2 执行顺序 12.2 分组视图 12.3 用别名重命名列 12.4 分组视图的功能 12.4.3 对列和分组函数进行排序 12.4.4 连接列 12.5 更多分组可能性 第13章 当一个...

Global site tag (gtag.js) - Google Analytics