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

相关推荐
_Kayo_2 小时前
node.js 学习笔记3 HTTP
笔记·学习
poemyang4 小时前
十年大厂员工终明白:MySQL性能优化的尽头,是对B+树的极致理解
mysql·pagecache·顺序i/o·局部性原理·b tree·b+ tree
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
天宇_任6 小时前
Mysql数据库迁移到GaussDB注意事项
数据库·mysql·gaussdb
星星火柴9366 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
武昌库里写JAVA8 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
xiep14383335108 小时前
Ubuntu 安装带证书的 etcd 集群
数据库·etcd
Cx330❀9 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
小幽余生不加糖9 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频
Java小白程序员9 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring