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

相关推荐
卓怡学长33 分钟前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5
冰^1 小时前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
电商数据girl1 小时前
产品经理对于电商接口的梳理||电商接口文档梳理与接入
大数据·数据库·python·自动化·产品经理
Spring小子2 小时前
黑马点评商户查询缓存--缓存更新策略
java·数据库·redis·后端
foo1st2 小时前
JDK(Ubuntu 18.04.6 LTS)安装笔记
java·笔记·ubuntu
DKPT2 小时前
常见正则表达式整理与Java使用正则表达式的例子
java·笔记·学习·面试·正则表达式
下雨的Jim2 小时前
前端速成之——Script
前端·笔记
爱码小白2 小时前
wordpress学习笔记
笔记·学习
我的golang之路果然有问题3 小时前
快速上手GO的net/http包,个人学习笔记
笔记·后端·学习·http·golang·go·net
大溪地C3 小时前
HTML5 详细学习笔记
笔记·学习·html5