SQL分组指南

article/2025/10/18 13:15:20

目录

什么是SQL分组?

SQL GROUP BY和Sum

排序分组结果

HAVING和GROUP BY

包含多个表的GROUP BY

按SUM()排序

带有表达式的GROUP BY

SQL GROUP BY与DISTINCT

结论


什么是SQL分组?

SQL中,分组是唯一的列值组合。当查询具有GROUP BY, 而不是返回满足过滤条件的每一行时,首先将值分组在一起。返回的行是列中的唯一组合。

GROUP BY的整体语法是:

SELECT   colum1, column2, column3, .. 
FROM     table1 
GROUP BY column1, column2, column3,… 

在本文中,我们将重点放在HumanResources.Employee表上。

在此示例中,我按JobTitleGender对表格进行了排序。

在这里,您可以看到小组的开始。最后一步是在语句中添加一个SQL  GROUP BY子句来创建分组。

SELECT JobTitle, MaritalStatus, COUNT(*) NumberEmployees
FROM HumanResources.Employee
GROUP BY JobTitle, MaritalStatus
ORDER BY JobTitle, MaritalStatus

你在这里看到结果:

我想让你注意几件事:

我删除了属于组或摘要的列,例如COUNT(*)select中仅允许在GROUP BY中列出的列。除了这些之外,您还可以使用聚合函数,例如SUMCOUNTMINMAXAVG

我在声明中保留了ORDER BY,因为GROUP BY不保证对组进行排序。

现在您已经很好地掌握了它的工作原理,让我们看看更多与GROUP BY的信息。

SQL GROUP BYSum

让我们做一些总结!对于更改,我们将汇总SalesOrderDetail记录。对于每个SalesOrder,让我们计算OrderTotal、一个SalesOrder的平均SalesOrderDetail总行数以及订单中的SalesOrderDetail行数。

我们将使用group bySUMAVGCOUNT函数来提供帮助。

SELECT SalesOrderID     ,SUM(LineTotal) AS OrderTotal,AVG(LineTotal) AS AverageLineTotal,COUNT(LineTotal) AS NumberOfLines
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderIDORDER BY SalesOrderID;

由于每个Sales Order有一行或多行,我们将按SalesOrderID group by。查看结果:

以下是使用这些功能时需要考虑的一些提示。你可以:

  1. SQL中使用多个函数。
  2. 在表达式中包含函数。
  3. 别名表达式。

您还可以使用聚合函数创建新表达式。为了证明这一点,让我们计算平均线总计,知道平均值=线总计之和/计数。

这是使它成为这样的查询:

SELECT SalesOrderID,SUM(LineTotal) AS OrderTotal,COUNT(LineTotal) AS NumberOfLines,SUM(LineTotal) / COUNT(LineTotal) AS AverageLineTotal,AVG(LineTotal) AverageFunctionLineTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;

和结果。注意如何计算AverageLineTotal等于函数的值。

排序分组结果

分组不按排序顺序返回。为此,您需要包含该ORDER BY子句。将该子句添加ORDER BYSQL语句的末尾。

修改此语句,使其按SalesOrderIDCarrierTrackingNumber​​对组进行排序。

/* Answer */
SELECT SalesOrderID, CarrierTrackingNumber, COUNT(1) as NumberofLines 
FROM Sales.SalesOrderDetail 
GROUP BY SalesOrderID, CarrierTrackingNumber 
ORDER BY SalesOrderID, CarrierTrackingNumber 

HAVINGGROUP BY

HAVING 子句过滤使用GROUP BY创建的分组。该HAVING子句确定结果中是否包含分组。

WHERE过滤单个记录的子句不同,HAVING子句过滤分组;但是,请记住SQL同时包含WHEREHAVING两个进程!

在这种情况下,首先处理WHERE子句,然后过滤这些记录。然后将HAVING应用于 中指定的GROUP BY分组。

通常HAVINGGROUP BY一起使用,但如果GROUP BY不包含该子句,则将整个结果集作为一个隐式分组进行HAVING操作。

考虑我们前面的例子。在这里,我们计算OrderTotals

SELECT SalesOrderID     ,SUM(LineTotal) AS OrderTotal,AVG(LineTotal) AS AverageLineTotal,COUNT(LineTotal) AS NumberOfLines
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;

假设我们需要展示总额超过100,000.00美元的大订单。我们怎么能这样做?

使用HAVING子句过滤SUM(LineTotal)

这是显示大订单的查询:

SELECT SalesOrderID     ,SUM(LineTotal) AS OrderTotal,AVG(LineTotal) AS AverageLineTotal,COUNT(LineTotal) AS NumberOfLines
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
HAVING SUM(LineTotal) > 100000.00
ORDER BY SalesOrderID;

HAVING有什么好

HAVING子句的主要优点是它能够使用聚合函数进行GROUPS过滤。这是您不能在SELECT语句中执行的操作。

提示:如果你很难理解HAVINGWHERESELECT中的作用,我建议先了解SELECT语句的执行顺序。

包含多个表的GROUP BY

GROUP BY还可以包括来自多个表的列。在以下查询中,让我们通过ProductName计算销售额。为此,我们将SalesOrderDetail加入Product。我们joinproduct

SELECT p.Name ProductName,SUM(s.OrderQTY) TotalQuantitySold,SUM(s.LineTotal) TotalSales,SUM(s.OrderQTY * p.StandardCost) TotalStandardCost,SUM(s.LineTotal) - SUM(s.OrderQTY * p.StandardCost) GrossMargin
FROM Sales.SalesOrderDetail sINNER JOIN Production.Product p ON  s.ProductID = p.ProductID
GROUP BY p.Name
ORDER BY p.Name

查看两个表中的列如何参与TotalStandardCost计算。

SUM()排序

使用与上面相同的示例,请注意我可以按总数之一进行排序。在这种情况下,我们将按TotalQuantitySold进行排序。

SELECT p.Name ProductName,SUM(s.OrderQTY) TotalQuantitySold,SUM(s.LineTotal) TotalSales,SUM(s.OrderQTY * p.StandardCost) TotalStandardCost,SUM(s.LineTotal) - SUM(s.OrderQTY * p.StandardCost) GrossMargin
FROM Sales.SalesOrderDetail sINNER JOIN Production.Product p ON  s.ProductID = p.ProductID
GROUP BY p.Name
ORDER BY SUM(s.OrderQTY)

由于此列有别名,让我们通过按别名排序来使查询更易于阅读。

带有表达式的GROUP BY

您可以对表达式进行分组。只要SELECT列表中存在相同的表达式,就允许分组。

SELECT Year(OrderDate) OrderYear, Sum(TotalDue) YearlySales
FROM Sales.SalesOrderHeader
GROUP BY YEAR(OrderDate)
ORDER BY OrderYear

在此示例中,让我们按年份对SalesOrder总数进行分组和汇总

没有什么能阻止我们对一个或多个表达式进行分组!让我们通过Month进一步分组销售。

SELECT Year(OrderDate) OrderYear,Month(OrderDate) OrderMonth,SUM (TotalDue) MonthlySales
FROM Sales.SalesOrderHeader
GROUP BY YEAR(OrderDate), MONTH(OrderDate)
ORDER BY OrderYear, OrderMonth

在我忘记之前,看看我是如何对结果进行排序的。我使用列别名来排序而不是重复表达式。两者都是有效的,但是将我们的表达保持在最低限度确实很好!我认为它更容易阅读。如果您想知道,由于SQL操作顺序,这一切都是可能的。

这是结果。我对列进行了颜色编码,以更好地向您展示多个表达式。与前面的示例一样,在GROUP BY中使用的每个表达式也被列为一列。

SQL GROUP BYDISTINCT

在某些方面,GROUP BY类似于使用DISTINCT子句。

SELECT DISTINCT JobTitle, MaritalStatus
FROM HumanResources.Employee
ORDER BY JobTitle, MaritalStatus

使用SQL GROUP BY返回与此SQL相同的结果:

SELECT JobTitle, MaritalStatus
FROM HumanResources.Employee
GROUP BY JobTitle, MaritalStatus
ORDER BY JobTitle, MaritalStatus

DISTINCTGROUP BY之间的主要区别在于,使用GROUP BY时,您还可以汇总值。

在这里,我们包含了确定每个组有多少行的COUNT()函数:

/* Answer */
SELECT SalesOrderID, CarrierTrackingNumber, COUNT(1) as NumberofLines 
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber;

结论

使用SQL GROUP BY时,请记住以下几点:

  • SQL GROUP BY不保证按排序顺序返回组。
  • 您可以使用聚合函数,例如SUMCOUNT来汇总数据。
  • SELECT列表中的非汇总列必须与GROUP BY中列出的列匹配。

本文最初发布于SQL GROUP BY Guide - Essential SQL

https://www.codeproject.com/Articles/5326747/SQL-GROUP-BY-Guide


http://chatgpt.dhexx.cn/article/IacQfDad.shtml

相关文章

单例模式的使用和应用场景

1.概念 标题单例模式:单例指的是单实例,一个类中有且仅有创建一个实例 单例模式的应用场景:windows的任务管理器(不可打开两次吧)、回收站等 单例模式应用一般发现在以下条件下: servlet单例、struts2多例、springmvc单例 &…

单例模式实战应用

理论 什么是单例模式 保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式 常用的 service 和 dao 层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如 action spring 中的 bean 和 spring mvc 中…

单例模式php应用场景,php单例模式 使用场景和使用方法

一个类只有一个对象实例 1、含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 2、单例模式的三个要点&#xff1a…

Java设计模式及应用场景之《单例模式》

文章目录 一、单例模式定义二、单例模式的结构和说明三、懒汉式和饿汉式的实现1、懒汉式2、饿汉式 四、懒汉式和饿汉式的优缺点五、双重检查加锁方式的实现六、类级内部类方式的实现七、枚举方式的实现 (最佳方式)八、单例模式的应用场景 一、单例模式定义 保证一个类只能有一个…

一文带你了解 Java 五种单例模式的实现方式以及应用场景

单例模式 什么是单例模式 类的单例设计模式,就是采取一定的方法保证在整个软件系统中,某个类只能存在一个对象实例,并且这个类会提供一个获取对象实例的方法。 思路:如果让一个类在一个虚拟机里面只能产生一个对象,就…

js设计模式之 单例模式与应用场景

1.介绍 单例模式(Singleton Pattern)是设计模式中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个…

单例模式的理解?单例模式如何实现?单例模式应用场景

说说你对单例模式的理解?如何实现? 一、是什么 单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象&…

设计模式之单例模式应用场景篇

应用场景 我们为什么要使用单例模式呢?它有什么好处? (一)单例模式可以让我们只创建一个对象从而避免了频繁创建对象导致的内存消耗和垃圾回收。 Servlet是单例模式,我们只需要创建一个Servlet,然后接收请求…

关于getText()的小问题

由一个作业开始的,整完广度优先小作业的时候开始是在代码中指定值进行寻找路径,后面想想还是弄两文本框输入起点和终点更灵活一点好了。谁知道这个JTextField真的让我崩溃了 怎么说应该是我对Java的基础知识没有进行深入了解吧,好吧,我是在今天才知道getText()是在监听事件…

js gettext

test.php 1 <?php2 $localezh_CN;3 if(isSet($_GET["locale"]))$locale $_GET["locale"];4 ?>5 <html>6 <head>7 <link rel"gettext" type"application/x-po" href"./locale/<?php echo $locale ?&…

关于Java getText()方法的问题

这是一个登陆界面的鼠标事件&#xff0c;获取文本区t61的内容&#xff0c;与用户姓名比对&#xff0c;同时验证登陆密码&#xff0c;但是用户姓名比对一直不成功&#xff0c;导致鼠标事件不能反映&#xff0c;页面不能跳转&#xff0c;想知道为什么&#xff0c;求大佬指点。 p…

java的gettext_JAVA里 getText() 是什么意思,怎么用?

展开全部 JAVA里 getText() 的意思是&#xff1a;返回数据窗口控件中 悬浮在当前行列之上的32313133353236313431303231363533e4b893e5b19e31333431366266编辑框中的文本。 在用户修改数据窗口中某项的值时&#xff0c;实际上首先在悬浮 在当前项上的编辑框中进行修改&#xff…

python gettext的使用方法

app.py 里面的print函数输出内容&#xff0c;是会更据你选择的语言平台而改变 将app.py生成.po文件(或者生成.pot文件)&#xff0c;如果是.pot文件需要重命名为.po pygettext.py安装python的时候就自己带着有&#xff0c;去你的安装路径找 python &#xff08;这一步&#xff…

getText()和getText().toString()

在deadline只有一根咪咪的距离时&#xff0c;我就直接吐槽了。 一个组件&#xff0c;比方说EditView&#xff0c;它的getText()和getText().toString()这两种想得到这个组件中的内容的方法是不一样的&#xff0c;我在用startActivityForResulr()之后接收到来自另一个activity的…

登陆QQ时总显示QQ安全防护进程,而且点了确定后QQ还是登不上

解决办法&#xff1a;把服务QPcore启动&#xff0c;或者删除掉防护进程&#xff08;QPcore&#xff09;

启动电脑QQ遇到QQ安全防护进程,且Windows无法启动QPCore Server

解决方法 1.winR 输入msconfig, “启动”->打开任务管理器 2.最右面的"服务" 3.下面"打开服务" 4.找到Windows update,双击,在"启动类型"选择"自动"→“应用”→“确定” 5.找到QPCore service,双击,在"启动类型"选择&q…

网络安全之应急响应

应急响应(是有一整套流程的)&#xff1a; 原理&#xff1a; 一个组织为了应对各种意外事件的发生所做的准备以及在事件发生后所采取的措施阶段&#xff1a; 准备->启动->抑制->根除->恢复->跟进准备应急工具&#xff0c;相应的应急文档、合同、保密协议&#xf…

操作系统安全实验

缓冲区溢出与数据执行保护DEP实验 实验环境 虚拟机&#xff1a;VirtualBox 6.1.30 操作系统&#xff1a;Ubuntu21.04 主机OS&#xff1a;Microsoft Windows10 实验要求 在关闭数据执行保护机制下&#xff0c;在Linux系统平台上实现缓冲区溢出攻击开启数据执行保护机制&#x…

网络安全教程(2)

目录 4-计算机病毒 4-1认识计算机病毒 4-1-1计算机病毒的概念 4-1-2计算机病毒的特点和分类 5-防火墙 5-1防火墙概述 5-1-1防火墙的概念 5-1-2防火墙的功能 5-1-3防火墙的分类 5-2防火墙主要技术 5-2-1包过滤技术 5-2-2应用代理技术 5-2-3状态检测技术 5-3防火墙体…