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

相关推荐
云和数据.ChenGuang1 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys2 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi2 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据2 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi3 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀4 小时前
Redis梳理
数据库·redis·缓存
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天4 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺4 小时前
分布式系统架构:服务容错
数据库·架构
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget