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)​。按订单号对结果进行排序。

相关推荐
秃头摸鱼侠37 分钟前
MySQL查询语句(续)
数据库·mysql
MuYiLuck1 小时前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机1 小时前
6. MySQL基本查询
数据库·mysql
qq_408413391 小时前
spark 执行 hive sql数据丢失
hive·sql·spark
黑色的山岗在沉睡1 小时前
《视觉SLAM十四讲》自用笔记 第二讲:SLAM系统概述
笔记
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩2 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
漫谈网络2 小时前
sqlite3 命令行工具详细介绍
sql·sqlite·db