个性化阅读
专注于IT技术分析

SQL中的GROUP BY和HAVING子句

本文概述

分析师聚合数据(例如销售, 利润, 成本和薪水)的重要组成部分。数据聚合对于分析师创建可视化, 得出结论和编写报告非常有帮助。在SQL中, GROUP BY子句是聚合或聚合数据系列的工具之一。例如, 总结每日销售额并合并为一个季度, 然后将其显示给高级管理层。同样, 如果你要计算公司每个部门的员工人数。它根据一列或多列对数据库进行分组并聚合结果。

将数据分组后, 可以使用HAVING子句过滤分组的记录。 HAVING子句返回与给定条件匹配的分组记录。你还可以使用ORDER BY对分组的记录进行排序。 ORDER BY在聚集列的GROUP BY之后使用。

在本教程中, 你将通过相关示例详细学习GROUP BY子句。这是你将在本教程中学习的主题列表:

  • group by子句
  • having子句
  • 聚合函数
  • 比较SQL中的Have和Where子句
  • GROUP BY with JOIN示例
  • GROUP BY与其他子句的比较
  • 动手实践作业
  • 总结

group by子句

SQL中的GROUP BY子句与SELECT语句一起使用, 可以将相似的数据组织成组。它使用某些功能将多个记录合并为一个或多个列。通常, 这些函数是聚合函数, 例如min(), max(), avg(), count()和sum()组合成单个或多个列。它使用拆分应用合并策略进行数据分析。

  • 在拆分阶段, 它用其值划分组。
  • 在应用阶段, 它应用聚合函数并生成单个值。
  • 在组合器阶段, 它将具有单个值的组组合为单个值。
SQL中的GROUP BY和HAVING子句1

图片来源

要记住的要点:

  • GROUP BY子句与SELECT语句一起使用。
  • GROUP BY根据所选列聚合结果:COUNT, MAX, MIN, SUM, AVG等。
  • GROUP BY每一组数据仅返回一个结果。
  • GROUP BY子句始终遵循WHERE子句。
  • GROUP BY子句始终位于ORDER BY子句之前。
SQL中的GROUP BY和HAVING子句2

在上面的示例中, 表是根据DeptID列进行分组的, 而薪水是按部门聚合的。

having子句

在SQL中, HAVING子句与GROUP BY子句一起用作条件子句。此条件子句返回的行中聚合函数结果仅与给定条件匹配。它是在SQL中添加的, 因为WHERE子句无法与聚合结果结合使用, 因此它具有不同的用途。 WHERE子句的主要目的是处理非聚合或单个记录。

  • HAVING子句始终与GROUP BY子句结合使用。
  • HAVING子句限制组记录而不是单个记录上的数据。
  • WHERE和HAVING可以在单个查询中使用。
SQL中的GROUP BY和HAVING子句3

在上面的示例中, 根据DeptID列对表进行分组, 并使用条件为AVG(Salary)> 3000的HAVING子句对这些分组的行进行过滤。

聚合函数

用于将组的结果合并为单个的聚合函数, 例如COUNT, MAX, MIN, AVG, SUM, STDDEV和VARIANCE。这些功能也称为多行功能。

  • SUM():返回每个组的总和。
  • COUNT():返回每个组的行数。
  • AVG():返回每个组的平均值和均值。
  • MIN():返回每个组的最小值。
  • MAX():返回每个组的最小值。

比较SQL中的Have和Where子句

  • 在某些情况下, 你需要过滤掉各个记录。在这种情况下, 你可以使用WHERE子句, 而在其他情况下, 则需要使用特定条件过滤组。在这种情况下, 你可以使用HAVING子句。
  • WHERE子句按元组过滤记录元组, 而HAVING子句则过滤整个组。
  • 查询可能同时具有这两个子句(WHERE和HAVING子句)。
  • 子句首先适用于何处, 然后适用具having子句。
  • WHERE子句限制记录在GROUP BY子句之前, 而HAVING子句限制在GROUP BY子句之后的记录。
  • WHERE子句可与SELECT, UPDATE, DELETE和INSERT一起使用, 而HAVING仅可与SELECT语句一起使用。
SQL中的GROUP BY和HAVING子句4

图片来源

GROUP BY with JOIN示例

规范化的关系数据库将复杂的表分解为小表, 这可以帮助你消除数据冗余, 不一致并确保没有信息丢失。规范化表需要联接来自多个表的数据。

SQL中的GROUP BY和HAVING子句5

在上面的示例中, 使用公共列DeptID将Employee和Department连接在一起。

SQL中的GROUP BY和HAVING子句6

在上面的示例中, JOIN和GROUP BY这两个子句在单个查询中一起使用。联接两个表(雇员表和部门表)后, 按部门名称分组表。

GROUP BY与其他子句的比较

比较GROUP BY和DISTINCT

DISTINCT返回列中存在的唯一值, 而GROUP BY返回包含合计结果列的唯一/不同项。在以下示例中, 你可以在dept表中看到DISTINCT值。

SQL中的GROUP BY和HAVING子句7

比较GROUP BY和ORDER BY

ORDER BY返回按升序和降序排序的项目, 而GROUP BY返回具有合计结果列的唯一项目。在下面的示例中, 你可以看到ORDER BY或排序的薪水表。

SQL中的GROUP BY和HAVING子句8

动手实践作业

表名:书籍

栏:ISBN, 标题, 出版日期, 价格, 出版商

为以下语句编写SQL查询, 并在注释中分享你的答案:

  1. 确定每个类别中有几本书。
  2. 确定”管理”类别中有几本书。
  3. 确定每个类别的平均图书价格。
  4. 列出每个类别中最便宜的书的价格。

出处:本作业的灵感来自约翰·卡斯特(John Casteel)的《 Oracle 11g SQL》一书。

总结

恭喜, 你已完成本教程的结尾!

在本教程中, 你涵盖了有关GROUP BY和HAVING子句的许多详细信息。你已经了解了示例的GROUP BY和HAVING子句, SQL中的HAVING和WHERE子句比较, JOIN的GROUP BY和DISTINCT和ORDER BY的GROUP BY比较。在上一节中, 你将有一个动手实践作业来评估你的知识。

希望你现在可以利用GROUP BY和HAVING子句概念来分析自己的数据集。感谢你阅读本教程!

如果你想了解有关SQL的更多信息, 请参加srcmini的中级SQL课程。

赞(0)
未经允许不得转载:srcmini » SQL中的GROUP BY和HAVING子句

评论 抢沙发

评论前必须登录!