使用 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. POJ.1160.Post Office(DP 四边形不等式)

    题目链接 \(Description\) 一条直线上有n个村庄,位置各不相同.选择p个村庄建邮局,求每个村庄到最近邮局的距离之和的最小值. \(Solution\) 先考虑在\([l,r]\)建一个邮 ...

  2. Sphinx(coreseek)一些记录

    之前用Sphinx(coreseek)几次,相对正常 这次用到,记录些问题 1.coreseek好像没人维护了吗,有点可惜. 2.centOS7 编译和coreseek版本有点问题,需要修改编译文件 ...

  3. Windows 文件名的书写规范

    下面是不能用于文件名的: / \ : * " < > | windows系统下文件名长度为: 255个英文字符(DOS下8.3格式),包括文件名和扩展名在内,或者是255/2=1 ...

  4. “IT学子成长指导”专栏及文章目录 —贺利坚

    迂者专栏关键词 就 业 大一 大二 大三 大四 自学 职 场 专业+兴趣 研究生 硕士 规 划 考 研 大学生活 迷 茫 计算机+专业 基本功 学习方法 编程 基 础 实践 读书 前 途 成 长 社团 ...

  5. WindowManager$BadTokenException: Unable to add window permission denied for this window type

    10-11 11:47:27.472: E/AndroidRuntime(12804): java.lang.RuntimeException: Unable to start activity Co ...

  6. 关于three.js中添加文字的方式[转]

    https://blog.csdn.net/qq563969790/article/details/76584976 网上资料大部分是通过引入外部font库进行文字效果的载入,但是在实际运行的时候发现 ...

  7. 谷歌Chrome浏览器无法安装插件的解决方法

    Chrome浏览器已替代了个人多年使用的遨游浏览器,但众所周知,国内的环境无法正常登录谷歌账户.无法访问应用商店,而Chrome主版本号大于66的只能从Chrome应用商店下载并安装插件,这不是死结吗 ...

  8. Spark操作:Aggregate和AggregateByKey

    1. Aggregate Aggregate即聚合操作.直接上代码: import org.apache.spark.{SparkConf, SparkContext} object Aggregat ...

  9. LeetCode Permutations问题详解

    题目一 permutations 题目描述 Given a collection of numbers, return all possible permutations. For example,[ ...

  10. Linux编译步骤概述

    Linux,一切皆文件! linux环境下,编译源码文件步骤总结 01.下载解压 一遍在开源网站有download/下载页面 02.安装基本编译环境 yum install -y gcc gcc-c+ ...