设为首页 收藏本站
查看: 2033|回复: 0

[经验分享] Oracle HAVING子句

[复制链接]

尚未签到

发表于 2015-6-17 09:24:36 | 显示全部楼层 |阅读模式
  where -->group by --> having -->order by
  使用 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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-78064-1-1.html 上篇帖子: OCP-1Z0-051-题目解析-第28题 下篇帖子: 【转】set unused
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表