`
liujiekasini0312
  • 浏览: 147579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL HAVING用法详解

 
阅读更多

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

下面的示例按产品 ID 对 SalesOrderDetail 进行了分组,并且只包含那些订单合计大于 $1,000,000 且其平均订单数量小于 3 的产品组。

USE AdventureWorks;

GO

SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING SUM(LineTotal) > $1000000.00

AND AVG(OrderQty) < 3 ;

GO

请注意,如果 HAVING 中包含多个条件,那么这些条件将通过 AND、OR 或 NOT 组合在一起。

若要查看总销量大于 $2,000,000 的产品,请使用下面的查询:

USE AdventureWorks;

GO

SELECT ProductID, Total = SUM(LineTotal)

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING SUM(LineTotal) > $2000000.00 ;

GO

下面是结果集:

ProductID Total

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

781 3864606.54937208

969 2010943.97244001

793 2897478.01200001

784 3699803.72383008

780 3880441.60780208

976 2079038.42948

795 2268057.09000002

783 4548164.01783709

779 4170215.3849281

782 5032968.13026809

794 2679200.01336002

753 2006264.4236

(12 row(s) affected)

若要确保对每种产品的计算中至少包含 1500 项,请使用 HAVING COUNT(*) > 1500 消除返回的销售总数小于 1500 项的产品。该查询类似于下面的示例:

USE AdventureWorks;

GO

SELECT ProductID, SUM(LineTotal) AS Total

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING COUNT(*) > 1500 ;

GO

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

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

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

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

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

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

下面的示例显示了带有聚合函数的 HAVING 子句。它按产品 ID 分组 SalesOrderDetail 表中的行,并消除其平均订单数量小于/等于 5 的产品。

USE AdventureWorks;

GO

SELECT ProductID

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING AVG(OrderQty) > 5

ORDER BY ProductID ;

GO

下面的示例显示了不带聚合函数的 HAVING 子句。它按名称分组 ProductModel 表中的行,并消除那些不以 Mountain 开头的名称。

USE AdventureWorks;

GO

SELECT pm.Name, AVG(ListPrice) AS 'Average List Price'

FROM Production.Product AS p

JOIN Production.ProductModel AS pm

ON p.ProductModelID = pm.ProductModelID

GROUP BY pm.Name

HAVING pm.Name LIKE 'Mountain%'

ORDER BY pm.Name ;

GO

请注意,ORDER BY 子句可用于排序 GROUP BY 子句的输出。

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

下面的示例按产品 ID 对 SalesOrderDetail 进行了分组,并且只包含那些订单合计大于 $1,000,000 且其平均订单数量小于 3 的产品组。

USE AdventureWorks;

GO

SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING SUM(LineTotal) > $1000000.00

AND AVG(OrderQty) < 3 ;

GO

请注意,如果 HAVING 中包含多个条件,那么这些条件将通过 AND、OR 或 NOT 组合在一起。

若要查看总销量大于 $2,000,000 的产品,请使用下面的查询:

USE AdventureWorks;

GO

SELECT ProductID, Total = SUM(LineTotal)

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING SUM(LineTotal) > $2000000.00 ;

GO

下面是结果集:

ProductID Total

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

781 3864606.54937208

969 2010943.97244001

793 2897478.01200001

784 3699803.72383008

780 3880441.60780208

976 2079038.42948

795 2268057.09000002

783 4548164.01783709

779 4170215.3849281

782 5032968.13026809

794 2679200.01336002

753 2006264.4236

(12 row(s) affected)

若要确保对每种产品的计算中至少包含 1500 项,请使用 HAVING COUNT(*) > 1500 消除返回的销售总数小于 1500 项的产品。该查询类似于下面的示例:

USE AdventureWorks;

GO

SELECT ProductID, SUM(LineTotal) AS Total

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING COUNT(*) > 1500 ;

GO

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

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

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

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

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

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

下面的示例显示了带有聚合函数的 HAVING 子句。它按产品 ID 分组 SalesOrderDetail 表中的行,并消除其平均订单数量小于/等于 5 的产品。

USE AdventureWorks;

GO

SELECT ProductID

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING AVG(OrderQty) > 5

ORDER BY ProductID ;

GO

下面的示例显示了不带聚合函数的 HAVING 子句。它按名称分组 ProductModel 表中的行,并消除那些不以 Mountain 开头的名称。

USE AdventureWorks;

GO

SELECT pm.Name, AVG(ListPrice) AS 'Average List Price'

FROM Production.Product AS p

JOIN Production.ProductModel AS pm

ON p.ProductModelID = pm.ProductModelID

GROUP BY pm.Name

HAVING pm.Name LIKE 'Mountain%'

ORDER BY pm.Name ;

GO

请注意,ORDER BY 子句可用于排序 GROUP BY 子句的输出。

分享到:
评论

相关推荐

    SQL_HAVING_使用详解

    ### SQL_HAVING 使用详解 #### 一、HAVING 子句概述 在 SQL 查询语言中,`HAVING` 子句被用来过滤由 `GROUP BY` 子句产生的结果集。与 `WHERE` 子句不同,`HAVING` 子句在数据经过分组后才应用过滤条件。这意味着 ...

    SQL问题详解之_having_Group by

    在SQL查询中,GROUP BY和HAVING子句是数据分析和聚合操作的核心部分,它们帮助我们对数据进行分组和过滤,以获得更有意义的结果。在深入理解这两个子句之前,我们首先需要了解聚合函数,如SUM、COUNT、MAX和AVG等。 ...

    精彩SQL语句用法详解

    ### 精彩SQL语句用法详解 #### 一、引言 SQL(Structured Query Language,结构化查询语言)是一种用于管理和处理关系型数据库的标准计算机语言。它被广泛应用于数据库查询、更新、管理和控制等方面。本文将详细...

    基于TP框架SQL之where与having区别

    ### 基于TP框架SQL之where与having区别的详细解析 #### 一、Where与Having的区别 在SQL查询语句中,`WHERE`和`HAVING`子句都用于过滤查询结果,但它们的应用场景有所不同。 - **WHERE子句**: - 作用:在对查询...

    SQL Server 2000详解教程

    总之,SQL Server 2000详解教程全面介绍了这款数据库系统的所有重要方面,包括安装、配置、数据库管理、查询语言、安全性以及性能优化。结合提供的习题文档,学习者能够系统地学习并掌握SQL Server 2000的使用,从而...

    sql 语句汇总详解

    ### SQL语句汇总详解 #### 1、CREATETABLE 创建表 - **定义**: `CREATE TABLE` 语句用于创建新的表。 - **语法**: ```sql CREATE TABLE 表名 ( 字段1 类型, 字段2 类型, ... ); ``` - **示例**: ```sql ...

    sqlite 支持的 sql 语法详解

    使用GROUP BY进行数据分组,HAVING用于过滤分组后的结果,聚合函数如COUNT、SUM、AVG、MIN、MAX: ```sql SELECT subject, COUNT(*) FROM courses GROUP BY subject HAVING COUNT(*) &gt; 1; ``` 七、事务处理 SQLite...

    SQL语句select用法详解

    ### SQL语句SELECT用法详解 #### 一、概述 SQL(Structured Query Language)是一种用于管理关系数据库的标准语言。在SQL中,`SELECT`语句是最常用的操作之一,主要用于从数据库表中检索数据。通过使用不同的子句...

    sql优化规则详解(一些小总结)

    11. **用WHERE子句替换HAVING子句**:WHERE子句在数据检索前进行过滤,而HAVING子句在聚合操作后过滤,因此在可以的情况下,使用WHERE子句更高效。在多表联接时,ON、WHERE和HAVING的执行顺序分别是ON、WHERE和...

    sqlsqlsqlsqlsqlsqlsql

    随着对SQL的深入学习,你还将接触到更多的概念,如JOIN操作用于连接多个表,GROUP BY和HAVING用于分组和过滤聚合数据,以及更复杂的子查询和视图等。 总的来说,SQL语言是数据管理和分析的强大工具,掌握好SQL的...

    精通SQL—结构化查询语言详解

    - 单表查询:学习如何选择特定列,指定排序方式,使用WHERE子句过滤数据,以及使用GROUP BY和HAVING子句进行分组和过滤。 - 联合查询:使用UNION, UNION ALL, INTERSECT和EXCEPT操作合并多表结果。 - 复杂查询:...

    SQL语法实例详解文档

    除了基础查询,SQL还支持`GROUP BY`用于对结果进行分组,`HAVING`用于在分组后过滤数据,以及`ORDER BY`用于排序结果。`INTO`子句用于创建新表并插入数据,`JOIN`操作用于连接多个表,`PROCEDURE`则涉及存储过程的...

    SQL高级用法

    ### SQL高级用法详解 #### 一、提升SQL查询效率的方法 为了提高SQL查询的效率,我们可以采用多种高级技巧来优化查询性能。本章节将详细解释这些方法,并通过实例加以说明。 ##### 1. 内联视图子查询 内联视图子...

    Hive中SQL详解

    Hive中SQL详解 Hive是一个基于Hadoop构建的数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。 Hive SQL支持绝大多数的语句,如DDL、DML、聚合函数、连接查询、条件查询等。 ...

    精通SQL-结构化语言查询与详解.rar

    4. **查询操作**:深入学习如何使用WHERE子句进行条件筛选,GROUP BY和HAVING子句进行分组和过滤,JOIN操作连接多个表,以及UNION和INTERSECT用于合并或找出两个查询结果的交集。 5. **聚合函数**:如COUNT、SUM、...

    sql语言详解参考大全

    - `SELECT`:从一个或多个表中检索数据,是最常用的SQL语句,可以结合WHERE子句进行条件筛选,使用GROUP BY进行分组,使用HAVING过滤分组后的结果,使用ORDER BY进行排序。 4. **SQL数据查询语言(DQL)**: - `...

    SQL GROUP BY 语句详解

    GROUP BY 语句还有其他高级用法,比如配合 HAVING 子句进行分组后的条件筛选,或者与子查询和联接操作结合使用,以实现更复杂的分析需求。总的来说,理解并熟练运用 GROUP BY 语句对于在 SQL 查询中进行数据分析至关...

    sqlserver 2008 数据查询 详解

    本文将深入探讨SQL Server 2008中的数据查询技术,特别是使用SELECT语句进行复杂数据操作的方法。 SELECT语句是T-SQL(Transact-SQL)的核心组成部分,用于从数据库中提取数据并按用户需求呈现结果。它支持多种查询...

    精通SQL--结构化查询语言详解

    2.3.4 使用sql*plus执行sql语句 31 2.4 pl/sql简介 32 2.4.1 pl/sql的特点 32 2.4.2 pl/sql程序结构 33 第3章 创建、修改和删除表 37 3.1 表的基础知识 37 3.1.1 表的基本结构 37 3.1.2 表的种类 38 3.2 sql...

Global site tag (gtag.js) - Google Analytics