`
lcsunjava
  • 浏览: 20348 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Oracle数据库之group by与having子句

阅读更多
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数据库Sql语句详解大全

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

    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中where 子句和having子句中的区别介绍

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

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

    使用having子句 限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。 在带有group by 子句的查询语句中,在select 列表中指定的列...

    Oracle基础之group by和聚合函数

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

    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数据库经典题目

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

    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 ...

    Oracle11g从入门到精通

     Oracle数据库系统是数据库领域最优秀的数据库之一,《Oracle11g从入门到精通》以Oracle最新版本Oracle 11g为蓝本,系统地讲述了Oracle数据库的概念、管理和应用开发等内容。  全书结构合理、内容翔实、示例丰富...

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

    该条语句的意义为:按工作分组查出每一项工作的平均薪水二,having 子句 oracle 规定where子句不可以使用分组函数,这时我们必须使用having子句方可完成功能。 select job,avg(sal) from emp having avg(sal)&gt;1500 ...

    sql/having用法

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

    oracle数据库笔记

    7.Having子句 36 8.练习:表的查询 36 五. 在SQL *Plus中使用函数 37 1.字符串函数 37 2.数字函数 37 3.日期时间函数 38 4.转换函数 38 第五讲 修改SQL数据与SQL*Plus命令 40 一.添加数据 40 1.Insert Into 表名 ...

    Oracle11g从入门到精通2

     Oracle数据库系统是数据库领域最优秀的数据库之一,《Oracle11g从入门到精通》以Oracle最新版本Oracle 11g为蓝本,系统地讲述了Oracle数据库的概念、管理和应用开发等内容。  全书结构合理、内容翔实、示例丰富...

    Oracle数据库系统使用经验六则

     1.having 子句的用法 having 子句对 group by 子句所确定的行组进行控制,having 子句条件中只允许涉及常量,聚组函数或group by 子句中的列. 2.外部联接”+”的用法 外部联接”+”按其在”=”的左边或...

    sql语句生成器+支持各大数据库+说明书

    分组(Group By) 分组条件(Having) 计算字段 SQL查询表 SQL查询子句 丰富的函数 表别名 字段别名(包括计算字段和非计算字段) 联合(Union,对于Oracle 支持Union All,Minus,Intersect) 支持将SQL查询语句,替换为插入...

    Oracle.11g.从入门到精通 (2/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语句 3.5.2 REVOKE语句 3.6 ...

    Oracle.11g.从入门到精通 (1/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语句 3.5.2 REVOKE语句 3.6 ...

    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 关于数据的问题...

Global site tag (gtag.js) - Google Analytics