使用 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
子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。因为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
分享到:
相关推荐
在SQL查询中,`HAVING`子句是用来在分组后的数据上设置过滤条件的,而`WHERE`子句则是在数据分组之前对原始数据进行筛选。这两者虽然都是用于限定查询结果,但作用的对象和时机不同。 首先,`WHERE`子句是SQL查询的...
### 基于TP框架SQL之where与having区别的详细解析 #### 一、Where与Having的区别 在SQL查询语句中,`WHERE`和`HAVING`子句都用于过滤查询结果,但它们的应用场景有所不同。 - **WHERE子句**: - 作用:在对查询...
### SQL_HAVING 使用详解 #### 一、HAVING 子句概述 在 SQL 查询语言中,`HAVING` 子句被用来过滤由 `GROUP BY` 子句产生的结果集。与 `WHERE` 子句不同,`HAVING` 子句在数据经过分组后才应用过滤条件。这意味着 ...
### SQL中的WHERE与HAVING的区别 在SQL查询语句中,`WHERE`子句和`HAVING`子句都是用于过滤数据的,但它们的作用范围和使用场景有所不同。理解这两个子句之间的区别对于编写高效、准确的SQL查询非常重要。 #### ...
然而,对分组后的数据进行条件筛选就需要用到`HAVING`子句。`HAVING`子句在SQL中是用来设定筛选分组的条件,它使得我们可以仅选取满足特定条件的分组数据,这对于数据分析和报表生成是非常有用的。 首先,让我们...
在SQL查询中,GROUP BY和HAVING子句是数据分析和聚合操作的核心部分,它们帮助我们对数据进行分组和过滤,以获得更有意义的结果。在深入理解这两个子句之前,我们首先需要了解聚合函数,如SUM、COUNT、MAX和AVG等。 ...
在SQL查询中,`WHERE`和`HAVING`子句都是用于过滤数据,但它们的应用场景和作用方式有所不同。理解这两个子句的区别对于编写高效的SQL语句至关重要。 首先,`WHERE`子句主要应用于筛选单个或多个字段满足特定条件的...
在SQL查询中,`ORDER BY`、`GROUP BY` 和 `HAVING` 是三个非常重要的子句,它们分别用于不同的数据处理操作。 1. **ORDER BY** 子句: - `ORDER BY` 用于对查询结果进行排序,按照指定的字段进行升序或降序排列。...
### Oracle SQL 中 WHERE 和 HAVING 的区别 在数据库查询语言SQL中,`WHERE`和`HAVING`子句都是用于过滤数据的关键字,但它们的应用场景和语法结构有着明显的不同。下面将详细介绍这两个关键字的区别。 #### 1. ...
在SQL查询中,`order_by_`、`group_by_`和`having`是三个非常重要的关键字,它们分别用于不同的数据处理操作。 1. `ORDER BY`:此关键字用于对查询结果进行排序,默认是升序(ASC),也可以指定降序(DESC)。在`...
### MySQL中的HAVING子句详解 #### 聚合函数简介 在深入探讨`HAVING`子句之前,首先需要了解SQL中的聚合函数。聚合函数是SQL语言中一种特殊的功能,用于处理多条记录并返回单个结果。常见的聚合函数包括: - **SUM*...
"Having Fun with XML Hacking"可能是指通过探索和利用这些漏洞来学习和理解XML注入的原理和技术。 XML注入的常见类型包括: 1. **XXE (XML External Entity Injection)**:攻击者通过定义外部实体来读取服务器上...
order_by_、group_by_、having的用法区别
首先,“Consumer behavior - buying, having, and being, 10th ed”是一本由Michael R Solomon所著的关于消费者行为学的书籍的第十版。这本书籍涵盖的主题不仅限于消费者购买行为,也深入探讨了消费者对产品拥有的...
MySQL中的`HAVING`子句是SQL查询语句中的一个重要组成部分,主要用于在聚合函数结果集上设置条件过滤。与`WHERE`子句不同,`WHERE`通常用于在数据被聚合之前筛选行,而`HAVING`则在数据聚合之后进行过滤。在处理分组...
资源分类:Python库 所属语言:Python 资源全名:behaving-3.0.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在SQL查询中,`HAVING`子句是一个非常重要的部分,尤其在处理分组数据时。这个知识点主要解决如何在对数据进行聚合操作后,基于这些聚合结果进行过滤。让我们深入了解一下`HAVING`子句及其在实际数据库操作中的应用...
在SQL中,GROUP BY子句用于将结果集按照一个或多个列进行分组,而HAVING子句则用于基于这些分组的结果进行条件过滤。与WHERE子句在分组前对数据进行过滤不同,HAVING子句在分组后对分组的结果进行过滤。本文将详细...