SQL HAVING用法详解

SQL HAVING用法详解

HAVING子句对GROUPBY子句设置条件的方式与WHERE和SELECT的交互方式类似。WHERE搜索条件在进行分组操作之前应用;而HAVING搜索条件在进行分组操作之后应用。HAVING语法与WHERE语法类似,但HAVING可以包含聚合函数。HAVING子句可以引用选择列表中显示的任意项。
 
下面的示例按产品ID对SalesOrderDetail进行了分组,并且只包含那些订单合计大于$1,000,000且其平

大家好,又见面了,我是你们的朋友全栈君。

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 子句的输出。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150484.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 美国福克斯Fox热式流量计[通俗易懂]

    福克斯Fox热式流量计英维思集团的美国Foxboro公司是一家为工业过程自动化提供仪表、系统和服务的制造商,在全球同行业中处于**地位。它为用户提供的解决方案包括一切典型的智能型现场仪表,自动化系统以及先进的软件应用,以及与之相配套的综合工程。美国FOXBORO福克斯波罗因其产品的高智能和质量稳定性在电力、石油、化工、天然气、冶金、水泥、造纸、采矿、轻纺、食品、医药等行业中大量使用,获得了用户的广泛好评,产品行销全球,销售业绩在全球自动化领域内稳居前列。公司可提供从简单的需求到**的过程控制仪表,

    2022年4月11日
    158
  • 求一个点在平面上的投影_unity获取物体坐标

    求一个点在平面上的投影_unity获取物体坐标Unity计算投影点主要内容新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入主要内容本文旨在求得点在某一平面的投影点,主要包括Unity中InverseTransformPoint和TransformPoint方法。主要

    2025年8月12日
    3
  • WinForm学习

    WinForm学习C#学习

    2022年10月7日
    5
  • ElasticSearch数据库安装与配置[通俗易懂]

    ElasticSearch数据库安装与配置[通俗易懂]1、安装去官网下载安装包:https://www.elastic.co/cn/downloads/elasticsearch解压改压缩包就行,解压后的目录如下2、配置进入bin目录,双击elasticsearch.bat即可启动数据库服务。在浏览器中输入localhost:9200即可查看是否启动成功:显示上面的json串则表示启动成功。下面介绍如何配置可远程连接:需要修改config目录下的elasticsearch.yml文件在elastcisearch.yml文件中加上如下配

    2022年5月3日
    120
  • springboot上传文件到文件夹

    springboot上传文件到文件夹springboot上传文件至项目当前路径下的文件夹关键代码,之后会分享完整代码到gitee默认上传文件到文件夹/***默认上传文件到文件夹**@paramfolder默认文件夹*@paramfile上传的文件*@return*/privateStringmyfileUp(Stri…

    2022年5月30日
    29
  • navicat15手动激活码【2021.7最新】

    (navicat15手动激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSWQi…

    2022年3月21日
    534

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号