【Java 进阶篇】深入理解 SQL 分组查询

在这里插入图片描述

SQL 是结构化查询语言(Structured Query Language)的缩写,是用于管理关系型数据库的标准语言。在 SQL 中,查询是其中最重要的部分之一,通过查询,我们可以从数据库中检索所需的数据。分组查询是 SQL 查询中的一项重要功能,它允许我们对数据进行分组、聚合和汇总,以便更好地理解数据的特征和趋势。

在本文中,我们将深入探讨 SQL 中的分组查询,包括其基本语法、常用聚合函数、分组筛选条件、多重分组、分组排序等方面的内容。无论您是初学者还是有一定 SQL 基础的开发者,都将从本文中获得有关 SQL 分组查询的详细信息。

什么是分组查询?

分组查询是 SQL 中的一种数据汇总技术,它将数据库中的数据按照一个或多个列的值进行分组,然后对每个分组应用聚合函数来计算汇总结果。这有助于将大量的数据按照某种特定的标准进行分类和汇总,以便更好地理解数据的分布和特征。

分组查询通常用于回答如下问题:

  • 数据分布:某个列中各个值的分布情况是怎样的?
  • 统计信息:对某个列的数值进行统计,如求和、平均值、最大值、最小值等。
  • 数据透视:将数据按照不同的维度进行切割和聚合,以便进行多维度的分析。
  • 数据筛选:对数据进行筛选,只选择符合条件的数据行。
  • 数据排序:按照某个列或多个列的值对数据进行排序。

接下来,让我们一起学习 SQL 分组查询的基本语法和用法。

基本语法

SQL 分组查询的基本语法如下所示:

SELECT1,2, 聚合函数(3)
FROM 表名
GROUP BY1,2
HAVING 条件

让我们逐步解释每个部分的含义:

  • SELECT 语句:用于选择要显示的列,可以是分组列、聚合函数或其他列。
  • FROM 子句:指定要查询的表名。
  • GROUP BY 子句:指定一个或多个列,用于分组数据。查询的结果将按照这些列的值进行分组。
  • 聚合函数:对于每个分组,可以应用一个或多个聚合函数(如 SUMAVGCOUNTMAXMIN 等)来计算汇总值。
  • HAVING 子句:可选的,用于筛选分组后的结果。只有符合条件的分组才会被包括在结果中。

下面我们通过具体的示例来演示分组查询的用法。

示例:分组查询的基本用法

假设我们有一个名为 orders 的表,记录了一家网上商店的订单信息。表的结构如下:

order_idcustomer_idorder_datetotal_amount
11012022-01-1050.00
21022022-01-1230.00
31012022-01-1520.00
41032022-01-2060.00
51022022-01-2540.00

现在,我们希望进行一些分组查询,以便更好地了解订单数据。

1. 查找每位客户的订单数量和总金额

要实现这个查询,我们可以按照客户ID进行分组,然后使用聚合函数计算每位客户的订单数量和总金额。以下是查询的SQL语句:

SELECT customer_id, COUNT(order_id) AS order_count, SUM(total_amount) AS total_sum
FROM orders
GROUP BY customer_id;

在这个查询中,我们选择了 customer_id 列作为分组的依据,并使用 COUNT 函数计算每位客户的订单数量,使用 SUM 函数计算每位客户的订单总金额。结果如下:

customer_idorder_counttotal_sum
101270.00
102270.00
103160.00

这个结果告诉我们,客户 101 和 102 分别有两个订单,总金额分别为 70.00,客户 103 有一个订单,总金额为 60.00。

2. 查找订单总金额超过 50.00 的客户

要筛选出订单总金额超过 50.00 的客户,我们可以使用 HAVING 子句来筛选分组后的结果。以下是查询的SQL语句:

SELECT customer_id, SUM(total_amount) AS total_sum
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) > 50.00;

这个查询首先按客户ID分组,然后使用 SUM 函数计算每位客户的订单总金额。最后,我们使用 HAVING 子句筛选出总金额大于 50.00 的客户。结果如下:

customer_idtotal_sum
10170.00
10270.00

这个结果显示了总金额大于 50.00 的客户是客户 101 和 102,它们各自的订单总金额为 70.00。

3. 查找每日订单数量和总金额

如果我们希望查找每天的订单数量和总金额,可以按照 order_date 列进行分组,并使用聚合函数计算。以下是查询的SQL语句:

SELECT order_date, COUNT(order_id) AS order_count, SUM(total_amount) AS total_sum
FROM orders
GROUP BY order_date;

在这个查询中,我们选择了 order_date 列作为分组的依据,然后使用 COUNT 函数计算每日的订单数量,使用 SUM 函数计算每日的订单总金额。结果如下:

order_dateorder_counttotal_sum
2022-01-10150.00
2022-01-12130.00
2022-01-15120.00
2022-01-20160.00
2022-01-25140.00

这个结果显示了每日的订单数量和总金额,从而帮助我们了解了订单的分布情况。

多重分组

除了单一列的分组,我们还可以进行多重分组,即按照多个列的值进行分组。这样可以更细粒度地组织数据,获得更详细的分析结果。

以下是一个多重分组的示例查询,我们将按照客户ID和订单日期进行分组:

SELECT customer_id, order_date, COUNT(order_id) AS order_count, SUM(total_amount) AS total_sum
FROM orders
GROUP BY customer_id, order_date;

这个查询将会按照客户ID和订单日期进行分组,并计算每位客户每天的订单数量和总金额。多重分组可以帮助我们更清晰地了解客户的购买习惯以及每日订单情况。

分组排序

有时候,我们希望对分组后的结果进行排序,以便更容易地查看数据。可以使用 ORDER BY 子句来实现分组排序。

以下是一个示例查询,我们按照订单总金额降序排序客户的购买总金额:

SELECT customer_id, SUM(total_amount) AS total_sum
FROM orders
GROUP BY customer_id
ORDER BY total_sum DESC;

这个查询将结果按照 total_sum 列(即订单总金额)降序排序,以便查看购买总金额最高的客户。结果如下:

customer_idtotal_sum
10170.00
10270.00
10360.00

在这个结果中,我们可以看到购买总金额最高的客户是客户 101 和客户 102,它们的购买总金额都为 70.00。

总结

SQL 分组查询是对数据库中的数据进行分组、汇总和分析的重要工具。通过合理使用分组查询,我们可以轻松地回答各种关于数据分布、统计信息、数据透视和筛选等问题。在编写分组查询时,重要的是理解基本语法、聚合函数的应用和条件筛选的方法。

在实际应用中,分组查询通常与其他 SQL 查询语句结合使用,以便更全面地分析和报告数据。无论您是数据分析师、数据库管理员还是应用开发者,精通 SQL 分组查询都将是提高数据处理和分析能力的重要一步。

希望本文能够帮助您更好地理解 SQL 分组查询,并在实际工作中应用它来处理和分析数据库中的数据。如果您对 SQL 查询还有其他问题或需要进一步的帮助,请随时咨询或查阅相关文档。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/120308.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus-监控Mysql进阶用法(1)(安装配置)

阿丹: 在开发和生产环境中有可能会出现慢mysql等问题,那么这里就需要我们优秀的程序员来进行监控和解决,那么如何借助云原生的监控系统来完成这个操作呢? 环境描述: 使用一台空白的阿里云服务器2核4G。 服务器基本安装…

[FineReport]安装与使用(连接Hive3.1.2)

一、安装(对应hive3.1.2) 注:服务器的和本地的要同时安装。本地是测试环境,服务器的是生产环境 1、服务器安装 1、下载 免费下载FineReport - FineReport报表官网 向下滑找到 2、解压 [rootck1 /home/data_warehouse/software]# tar -zxvf tomcat…

套接字socket编程的基础知识点

目录 前言(必读) 网络字节序 网络中的大小端问题 为什么网络字节序采用的是大端而不是小端? 网络字节序与主机字节序之间的转换 字符串IP和整数IP 整数IP存在的意义 字符串IP和整数IP相互转换的方式 inet_addr函数(会自…

postgresql pgsql 连接池 pgBouncer(详细)

适用连接池可以有效的降低反复连接造成的损耗 2023.9.28更新,演示:1.20.1版本 没有安装pgsql的可以参考:pgsql编译安装 一、编译安装 包安装更简单,就是不能选版本 1.pgBouncer下载地址 链接:github项目地址 链接&a…

云中网络的隔离GREVXLAN

底层的物理网络设备组成的网络我们称为 Underlay 网络,而用于虚拟机和云中的这些技术组成的网络称为 Overlay 网络,这是一种基于物理网络的虚拟化网络实现。 第一个技术是 GRE,全称 Generic Routing Encapsulation,它是一种 IP-o…

leetcode top100(20) 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,2…

Golang的测试、基准测试和持续集成

在Golang中,内置的垃圾回收器处理内存管理,自动执行内存分配和释放。 单元测试是软件开发中至关重要的一个方面,它确保了代码的正确性并在开发过程中尽早发现错误。在Go中,编写有效的单元测试非常简单,并为开发人员提…

【每日一题】2703. 返回传递的参数的长度

2703. 返回传递的参数的长度 - 力扣(LeetCode) 请你编写一个函数 argumentsLength,返回传递给该函数的参数数量。 示例 1: 输入:args [5] 输出:1 解释: argumentsLength(5); // 1只传递了一个值…

现货白银图表分析的依据

现货白银的行情图表分析其实与股票的差不多,投资者可以结合均线、k线的变化,来分析实时的行情走势。当走势图的均线呈多头排列,即短期、中期、长期均线依次从上到下排列并向右上方运行,且白银价格沿各均线向右上方拉升&#xff0c…

Centos7安装mysql

文章目录 版权声明centos7防火墙[准备]检测防火墙允许3306端口 centos7安装mysql5.7检测安装配置 CentOS7安装MySQL8.0检测安装配置 Centos完全卸载mysql 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员…

如何用Postman做接口自动化测试

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码,属于一种软件开发工作,已经开发完成…

常见的排序算法及时间空间复杂度

排序算法是计算机科学中的基本算法之一,它用于将一组数据按照某种顺序进行排列。下面是一些常见的排序算法,以及它们的思想和时间空间复杂度,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢…