WHERE、GROUP BY 和 HAVING 三者比较

理解应用 WHERE、GROUP BY 和 HAVING 子句的正确序列对编写高效的查询代码会有所帮助:
  WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
  GROUP BY 子句用来分组 WHERE 子句的输出。
  HAVING 子句用来从分组的结果中筛选行。
  对于可以在分组操作之前应用的搜索条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 HAVING 子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。因为HAVING是在查询出的结果集中进行筛选,这个操作需要排序、总计等操作。如果先通过WHERE子句限制查询的记录数,可以减少这方面的开销。
  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值