SQL自学:分组数据GROUP BY子句和HAVING子句

一、GROUP BY 子句

GROUP BY 子句用于将数据按照一个或多个列进行分组。通过指定分组的列,数据库引擎会将具有相同值的行组合在一起。

例如,假设有一个销售数据表,包含销售日期、产品名称和销售金额等字段。如果我们想要了解每个产品的总销售金额,可以使用以下 SQL 语句:

sql 复制代码
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales_table
GROUP BY product_name;

在这个例子中,我们按照 "product_name" 列进行分组,然后使用聚合函数 SUM 计算每个产品的总销售金额。结果将返回每个产品名称及其对应的总销售金额。

GROUP BY 子句可以同时对多个列进行分组。例如,如果我们想要了解每个产品在每个销售日期的总销售金额,可以使用以下 SQL 语句:

sql 复制代码
SELECT product_name, sales_date, SUM(sales_amount) AS total_sales
FROM sales_table
GROUP BY product_name, sales_date;

这样,结果将按照产品名称和销售日期进行分组,显示每个组合的总销售金额。

二、HAVING 子句

HAVING 子句用于在分组后对数据进行筛选。它与 WHERE 子句类似,但 WHERE 子句是在分组之前对数据进行筛选,而 HAVING 子句是在分组之后对聚合结果进行筛选。

例如,我们想要找出总销售金额大于 1000 的产品,可以使用以下 SQL 语句:

sql 复制代码
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales_table
GROUP BY product_name
HAVING SUM(sales_amount) > 1000;

三、总结

GROUP BY 子句和 HAVING 子句是 SQL 中非常强大的工具,它们可以帮助我们对数据进行高效的分组和筛选。在使用这些子句时,需要注意以下几点:

  1. GROUP BY 子句必须放在 WHERE 子句之后,ORDER BY 子句之前。
  2. 在 GROUP BY 子句中指定的列必须是在 SELECT 子句中出现的列,或者是聚合函数的参数。
  3. HAVING 子句只能用于筛选聚合结果,不能用于筛选单个行。
  4. 在使用 HAVING 子句时,可以使用聚合函数和逻辑运算符来构建复杂的筛选条件。

四、注意

在 SQL 中,SELECT子句的顺序通常遵循以下规则:

  1. SELECT关键字:首先明确这是一个查询语句,用于选择要返回的列。
  2. 列名或表达式:列出你想要从数据库中检索的具体列名,或者可以使用表达式进行计算得出新的列值。例如,可以使用列的算术运算、函数调用等。
  3. FROM子句:指定要从中检索数据的表或视图。在选择列之前,必须明确数据的来源。
  4. WHERE子句:用于筛选满足特定条件的行。在确定了数据来源后,可以通过条件过滤出需要的数据。
  5. GROUP BY子句:如果需要对数据进行分组,则在筛选后进行分组操作。根据一个或多个列的值将数据分成不同的组。
  6. HAVING子句:用于对分组后的数据进行筛选。与WHERE子句不同,它是在分组操作之后应用的筛选条件。
  7. ORDER BY子句:用于对查询结果进行排序。可以按照一个或多个列的值升序或降序排列结果。

例如,以下是一个具有完整SELECT子句顺序的 SQL 查询示例:

sql 复制代码
SELECT column1, column2, function(column3) AS new_column
FROM table_name
WHERE condition1 AND condition2
GROUP BY column4
HAVING group_condition
ORDER BY column5 DESC;

从名为 "table_name" 的表中,挑选出 "column1""column2" 以及对 "column3" 进行函数运算后得到的新列(命名为 "new_column")。首先,根据 "condition1" 和 "condition2" 这两个条件筛选出符合要求的行。接着,按照 "column4" 进行分组。然后,通过 "group_condition" 对分组后的结果进行进一步筛选。最后,按照 "column5" 降序排列查询结果并返回。

练习题

1.OrderItems表包含每个订单的每个产品。编写SQL语句,返回每个订单号(order_num)各有多少行数(order_lines)​,并按order_lines对结果进行排序。

2.编写SQL语句,返回名为cheapest_item的字段,该字段包含每个供应商成本最低的产品(使用Products表中的prod_price)​,然后从最低成本到最高成本对结果进行排序。

3.确定最佳顾客非常重要,请编写SQL语句,返回至少含100项的所有订单的订单号(OrderItems表中的order_num)​。

4.确定最佳顾客的另一种方式是看他们花了多少钱。编写SQL语句,返回总价至少为1000的所有订单的订单号(OrderItems表中的order_num)​。提示:需要计算总和(item_price乘以quantity)​。按订单号对结果进行排序。

相关推荐
逻辑驱动的ken18 分钟前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
qq_3926906622 分钟前
Redis怎样应对Redis集群整体宕机带来的雪崩
jvm·数据库·python
zhangrelay28 分钟前
三分钟云课实践速通--模拟电子技术-模电--SimulIDE
linux·笔记·学习·ubuntu·lubuntu
木木_王34 分钟前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
lkforce39 分钟前
MiniMind学习笔记(三)--train_pretrain.py(预训练)
笔记·机器学习·ai·预训练·minimind·train_pretrain
OSwich1 小时前
【 Godot 4 学习笔记】数组(Array)
笔记·学习·godot
数据皮皮侠AI1 小时前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
快乐非自愿1 小时前
Redis--SDS字符串与集合的底层实现原理
数据库·redis·缓存
这儿有一堆花1 小时前
住宅代理(Residential Proxy)技术指南
开发语言·数据库·php
其实防守也摸鱼1 小时前
面试常问问题总结--护网蓝队方向
网络·笔记·安全·面试·职场和发展·护网·初级蓝队