本文概述
分析师聚合数据(例如销售, 利润, 成本和薪水)的重要组成部分。数据聚合对于分析师创建可视化, 得出结论和编写报告非常有帮助。在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()组合成单个或多个列。它使用拆分应用合并策略进行数据分析。
- 在拆分阶段, 它用其值划分组。
- 在应用阶段, 它应用聚合函数并生成单个值。
- 在组合器阶段, 它将具有单个值的组组合为单个值。
图片来源
要记住的要点:
- GROUP BY子句与SELECT语句一起使用。
- GROUP BY根据所选列聚合结果:COUNT, MAX, MIN, SUM, AVG等。
- GROUP BY每一组数据仅返回一个结果。
- GROUP BY子句始终遵循WHERE子句。
- GROUP BY子句始终位于ORDER BY子句之前。
在上面的示例中, 表是根据DeptID列进行分组的, 而薪水是按部门聚合的。
having子句
在SQL中, HAVING子句与GROUP BY子句一起用作条件子句。此条件子句返回的行中聚合函数结果仅与给定条件匹配。它是在SQL中添加的, 因为WHERE子句无法与聚合结果结合使用, 因此它具有不同的用途。 WHERE子句的主要目的是处理非聚合或单个记录。
- HAVING子句始终与GROUP BY子句结合使用。
- HAVING子句限制组记录而不是单个记录上的数据。
- WHERE和HAVING可以在单个查询中使用。
在上面的示例中, 根据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语句一起使用。
图片来源
GROUP BY with JOIN示例
规范化的关系数据库将复杂的表分解为小表, 这可以帮助你消除数据冗余, 不一致并确保没有信息丢失。规范化表需要联接来自多个表的数据。
在上面的示例中, 使用公共列DeptID将Employee和Department连接在一起。
在上面的示例中, JOIN和GROUP BY这两个子句在单个查询中一起使用。联接两个表(雇员表和部门表)后, 按部门名称分组表。
GROUP BY与其他子句的比较
比较GROUP BY和DISTINCT
DISTINCT返回列中存在的唯一值, 而GROUP BY返回包含合计结果列的唯一/不同项。在以下示例中, 你可以在dept表中看到DISTINCT值。
比较GROUP BY和ORDER BY
ORDER BY返回按升序和降序排序的项目, 而GROUP BY返回具有合计结果列的唯一项目。在下面的示例中, 你可以看到ORDER BY或排序的薪水表。
动手实践作业
表名:书籍
栏:ISBN, 标题, 出版日期, 价格, 出版商
为以下语句编写SQL查询, 并在注释中分享你的答案:
- 确定每个类别中有几本书。
- 确定”管理”类别中有几本书。
- 确定每个类别的平均图书价格。
- 列出每个类别中最便宜的书的价格。
出处:本作业的灵感来自约翰·卡斯特(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课程。
评论前必须登录!
注册