使用 HAVING 子句选择行

  HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。

  下面的查询得到本年度截止到目前的销售额超过 $40,000 的出版商:

  USE pubs

  SELECT pub_id, total = SUM(ytd_sales)

  FROM titles

  GROUP BY pub_id

  HAVING SUM(ytd_sales) > 40000

  下面是结果集:

  pub_id total

  ------ -----------

  0877 44219

  (1 row(s) affected)

  为了确保对每个出版商的计算中至少包含六本书,下面示例使用 HAVING COUNT(*) > 5 消除返回的总数小于六本书的出版商:

  USE pubs

  SELECT pub_id, total = SUM(ytd_sales)

  FROM titles

  GROUP BY pub_id

  HAVING COUNT(pub_id) > 5

  下面是结果集:

  pub_id total

  ------ -----------

  0877 44219

  1389 24941

  (2 row(s) affected)

  理解应用 WHERE、GROUP BY 和 HAVING 子句的正确序列对编写高效的查询代码会有所帮助:

  WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。

  GROUP BY 子句用来分组 WHERE 子句的输出。

  HAVING 子句用来从分组的结果中筛选行。

  对于可以在分组操作之前或之后应用的搜索条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 HAVING 子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。

  Microsoft® SQL Server™ 2000 查询优化器可处理这些条件中的大多数。如果查询优化器确定 HAVING 搜索条件可以在分组操作之前应用,那么它就会在分组之前应用。查询优化器可能无法识别所有可以在分组操作之前应用的 HAVING 搜索条件。建议将所有这些搜索条件放在 WHERE 子句中而不是 HAVING 子句中。

  以下查询显示包含聚合函数的 HAVING 子句。该子句按类型分组 titles 表中的行,并且消除只包含一本书的组:

  USE pubs

  SELECT type

  FROM titles

  GROUP BY type

  HAVING COUNT(type) > 1

  下面是结果集:

  type

  ------------------

  business

  mod_cook

  popular_comp

  psychology

  trad_cook

  (5 row(s) affected)

  以下是没有聚合函数的 HAVING 子句的示例。该子句按类型分组 titles 表中的行,并且消除不是以字母 p 开头的那些类型。

  USE pubs

  SELECT type

  FROM titles

  GROUP BY type

  HAVING type = '%p%'

  下面是结果集:

  type

  ------------------

  popular_comp

  psychology

  (2 row(s) affected)

  如果 HAVING 中包含多个条件,那么这些条件将通过 AND、OR 或 NOT 组合在一起。以下示例显示如何按出版商分组 titles,只包括那些标识号大于 0800、支付的总预付款已超过 $15,000 且销售书籍的平均价格小于 $20 的出版商。

  SELECT pub_id, SUM(advance) AS AmountAdvanced,

  AVG(price) AS AveragePrice

  FROM pubs.dbo.titles

  WHERE pub_id > '0800'

  GROUP BY pub_id

  HAVING SUM(advance) > 15000

  AND AVG(price) < 20

  ORDER BY 可以用来为 GROUP BY 子句的输出排序。下面的示例显示使用 ORDER BY 子句以定义返回 GROUP BY 子句中的行的顺序:

  SELECT pub_id, SUM(advance) AS AmountAdvanced,

  AVG(price) AS AveragePrice

  FROM pubs.dbo.titles

  WHERE pub_id > '0800'

  AND price >= 5

  GROUP BY pub_id

  HAVING SUM(advance) > 15000

  AND AVG(price) < 20

  ORDER BY pub_id DESC

Oracle HAVING子句 - 转的更多相关文章

  1. Oracle Like子句

    Oracle Like子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle LIKE运算符来测试列中的值是否与指定 ...

  2. Oracle Between子句

    Oracle Between子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle BETWEEN运算符来选择值在一 ...

  3. Oracle In子句

    Oracle In子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle IN运算符来确定值是否与列表或子查询中的任 ...

  4. Oracle Fetch子句

    Oracle Fetch子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,将学习如何使用Oracle FETCH子句来限制查询返回的行数. ...

  5. Oracle Or子句

    Oracle Or子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,我们来学习如何使用Oracle OR运算符来组合两个或更多的布尔表达式. ...

  6. Oracle And子句

    Oracle And子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,将学习如何使用Oracle AND运算符来组合两个或更多的布尔表达式. ...

  7. Oracle Where子句

    Oracle Where子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,将学习如何使用Oracle WHERE子句来指定过滤的条件返回符合 ...

  8. oracle排序子句的特殊写法与ORA-01785错误

    刚刚写的SQL语句在执行的时候报[ORA-01785: ORDER BY item must be the number of a SELECT-list expression]错误,于是自己百度了一 ...

  9. oracle SELECT子句中避免使用 ‘ * ‘

    当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法. 不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所 ...

  10. oracle WHERE子句中的连接顺序

    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 例如: (低效,执行时间1 ...

随机推荐

  1. 项目冲刺Fifth

    Fifth Sprint 1.各个成员今日完成的任务 蔡振翼:编写博客,了解php 谢孟轩:无 林凯:优化登录判断逻辑,熟悉相关php及mysql数据库技术的使用 肖志豪:帮助组员 吴文清:实现管理员 ...

  2. IETester是一个免费的Web浏览器调试工具

    功能简介 IETester是一个免费的Web浏览器调试工具,可以模拟出不同的js引擎来帮助程序员设计效果统一的代码.IETester可以在独立的标签页中开启IE5.5.IE6.IE7以及最I新的IE8 ...

  3. navLI鼠标滑上显示下拉导航

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>l ...

  4. Problem D: 指针函数

    Description YHZ自认为很聪明的人, 在C语言课上老师布置了一个作业,让能求正方形和圆的面积, 正当YHZ要跃跃欲试的时候, 老师却要求使用函数指针来实现这个功能,YHZ立马就不会了,他现 ...

  5. Docker machine(Docker 虚拟机)

    安装docker [root@lianxi ~]# yum -y install docker 启动docker [root@lianxi ~]# systemctl start docker 下载D ...

  6. 使用gulp对js、css、img进行合并压缩

    1 概述 最新使用AngularJS框架做单页面项目,其中包括了很多库的和自已写的js.css.img文件,这些文件都不大,但是数量众多,导致web请求文件过多,一次性加载时比较慢.有尝试过使用异步加 ...

  7. android:应用性能优化SparseArray

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  8. Unity Shader-后处理:Bloom全屏泛光

    一.简介   今天来学习一下全屏Bloom效果,有时候也叫Glow效果,中文一般叫做“全屏泛光”,这是一种可以模拟出HDR的全屏后处理效果,但是实现原理与HDR相差很远,效果比HDR差一些,但是比HD ...

  9. Ubuntu16.04下安装和配置Redis

    一.前提条件 需要连接互联网,然后执行sudo apt-get update更新软件包 二.执行安装命令 sudo  apt-get install redis-server 执行后如下图所示,我们输 ...

  10. AWK常用技巧

    1.1 介绍 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK ...