`

深入Group By分组查询

 
阅读更多
GROUP BY 子句用来为结果集中的每一行产生聚合值。如果聚合函数没有使用 GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。

以下示例返回分类 2 中每种产品已销售的单位数量:

USE Northwind
SELECT OrdD.ProductID AS ProdID,
           SUM(OrdD.Quantity) AS AmountSold
FROM [Order Details] AS OrdD JOIN Products as Prd
         ON OrdD.ProductID = Prd.ProductID
         AND Prd.CategoryID = 2
GROUP BY OrdD.ProductID下面是结果集:

ProdID          AmountSold     
----------- -----------
3               328            
4               453            
5               298            
6               301            
8               372            
15              122            
44              601            
61              603            
63              445            
65              745            
66              239            
77              791            

(12 row(s) affected)GROUP BY 关键字后面跟着列的列表,称为分组列。GROUP BY 子句限制结果集中的行;对于分组列中的每个非重复值只有一行。每个结果集行都包含与其分组列中特定值相关的汇总数据。

当 SELECT 语句中包含 GROUP BY 关键字时,对可以在选择列表中指定的项有一些限制。在该选择列表中所允许的项目是:

分组列。
为分组列中的每个值只返回一个值的表达式,例如将列名作为其中一个参数的聚合函数。这些函数称为矢量聚合。
例如,TableX 包含:

ColumnA ColumnB ColumnC
------- ------- -------
1 abc 5
1 def 4
1 ghi 9
2 jkl 8
2 mno 3


如果 ColumnA 是分组列,则结果集中将有两行,其中一行汇总值 1 的信息,而另一行汇总值 2 的信息。

如果 ColumnA 是分组列,要引用 ColumnB 或 ColumnC,这两列必须能为 ColumnA 中的每个值返回单个值的聚合函数中的参数。选择列表中包含诸如 MAX (ColumnB)、SUM (ColumnC) 或 AVG (ColumnC) 之类的表达式是合法的:

SELECT ColumnA,
           MAX(ColumnB) AS MaxB,
           SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA该选择语句返回两行,为 ColumnA 中的每个唯一值各返回一行:

ColumnA         MaxB SumC           
----------- ---- -----------
1               ghi      18             
2               mno      11             

(2 row(s) affected)但是,选择列表中只包含 ColumnB 表达式是不合法的:

SELECT ColumnA,
           ColumnB,
           SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA由于 GROUP BY 关键字只能返回一行,该行 ColumnA 中的值为 1,因此无法返回与 ColumnA 中的值 1 关联的 ColumnB 的三个值(abc、def 和 ghi)。

不能对 ntext、text、image 或 bit 列使用 GROUP BY 或 HAVING 子句,除非它们所在的函数返回的值具有其它数据类型。这样的函数包括 SUBSTRING 和 CAST。

使用 HAVING 子句选择行

HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。

下面的查询得到本年度截止到目前的销售额超过 $40,000 的出版商:

USE pubs
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING SUM(ytd_sales) > 40000下面是结果集:

pub_id total        
------ -----------
0877     44219        

(1 row(s) affected)为了确保对每个出版商的计算中至少包含六本书,下面示例使用 HAVING COUNT(*) > 5 消除返回的总数小于六本书的出版商:

USE pubs
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING COUNT(*) > 5下面是结果集:

pub_id total        
------ -----------
0877     44219        
1389     24941        

(2 row(s) affected)理解应用 WHERE、GROUP BY 和 HAVING 子句的正确序列对编写高效的查询代码会有所帮助:

WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
GROUP BY 子句用来分组 WHERE 子句的输出。
HAVING 子句用来从分组的结果中筛选行。
对于可以在分组操作之前或之后应用的搜索条件,在 WHERE 子句中指定它们更有效。这样可以减少必须分组的行数。应当在 HAVING 子句中指定的搜索条件只是那些必须在执行分组操作之后应用的搜索条件。

Microsoft® SQL Server™ 2000 查询优化器可处理这些条件中的大多数。如果查询优化器确定 HAVING 搜索条件可以在分组操作之前应用,那么它就会在分组之前应用。查询优化器可能无法识别所有可以在分组操作之前应用的 HAVING 搜索条件。建议将所有这些搜索条件放在 WHERE 子句中而不是 HAVING 子句中。

以下查询显示包含聚合函数的 HAVING 子句。该子句按类型分组 titles 表中的行,并且消除只包含一本书的组:

USE pubs
SELECT type
FROM titles
GROUP BY type
HAVING COUNT(*) > 1下面是结果集:

type
------------------
business
mod_cook
popular_comp
psychology
trad_cook

(5 row(s) affected)以下是没有聚合函数的 HAVING 子句的示例。该子句按类型分组 titles 表中的行,并且消除不是以字母 p 开头的那些类型。

USE pubs
SELECT type
FROM titles
GROUP BY type
HAVING type LIKE 'p%'下面是结果集:

type
------------------
popular_comp
psychology

(2 row(s) affected)如果 HAVING 中包含多个条件,那么这些条件将通过 AND、OR 或 NOT 组合在一起。以下示例显示如何按出版商分组 titles,只包括那些标识号大于 0800、支付的总预付款已超过 $15,000 且销售书籍的平均价格小于 $20 的出版商。

SELECT pub_id, SUM(advance) AS AmountAdvanced,
         AVG(price) AS AveragePrice
FROM pubs.dbo.titles
WHERE pub_id > '0800'
GROUP BY pub_id
HAVING SUM(advance) > $15000
     AND AVG(price) < $20ORDER BY 可以用来为 GROUP BY 子句的输出排序。下面的示例显示使用 ORDER BY 子句以定义返回 GROUP BY 子句中的行的顺序:

SELECT pub_id, SUM(advance) AS AmountAdvanced,
         AVG(price) AS AveragePrice
FROM pubs.dbo.titles
WHERE pub_id > '0800'
    AND price >= $5
GROUP BY pub_id
HAVING SUM(advance) > $15000
     AND AVG(price) < $20
ORDER BY pub_id DESC
分享到:
评论

相关推荐

    sqlserver+group by分组查询分页存储过程

    根据给定的SQL Server存储过程代码片段,我们可以深入解析与SQL Server中的`GROUP BY`分组查询、存储过程以及分页技术相关的知识点。 ### SQL Server中的`GROUP BY`分组查询 `GROUP BY`子句在SQL查询语言中用于将...

    使用Group by分组统计.rar

    在SQL查询中,`GROUP BY`语句是一个非常重要的部分,它用于对数据进行分组,以便我们可以对每个组执行聚合函数,如`COUNT`, `SUM`, `AVG`, `MAX`, `MIN`等。这个概念在数据分析和数据库管理中至关重要,因为它允许...

    oracle_11gR2_08 分组查询GROUP BY,模糊查询LIKE

    在Oracle 11g Release 2数据库管理系统中,掌握分组查询GROUP BY、模糊查询LIKE、连接查询JOIN以及IN()和NOT IN()等查询技术是至关重要的,它们为数据分析师和开发人员提供了强大的数据筛选与汇总能力。以下是对这些...

    SQL之分组统计和子查询专题

    李兴华老师的ORACLE数据库课程中,对分组统计和子查询进行了深入详解。本课程涵盖了分组统计的重点和难点、子查询的概念和应用场景,以及在实际开发中需要注意的细节。 分组统计 在SQL中,分组统计是对数据进行...

    Python数据分析实践:数据处理操作groupby分组new.pdf

    在Python数据分析领域,`groupby`操作是pandas库中的核心功能之一,它允许我们将数据按照特定的键或条件进行分组,以便进行更深入的分析。`groupby`操作通常涉及三个主要步骤:拆分(Split)、应用(Apply)和合并...

    数据分组的艺术:深入探索MySQL中的GROUP BY

    本文将深入探讨如何使用GROUP BY进行数据分组,包括其基本概念、语法结构、应用场景以及最佳实践。 GROUP BY是MySQL中进行数据分组的强大工具,它与聚合函数一起使用,可以轻松实现复杂的数据分析。理解GROUP BY的...

    SqlServer中Group By高级使用--Inner Join分组统计

    今天我们将深入探讨如何在SQL Server中使用Group By与Inner Join结合来实现更复杂的分组统计。 首先,理解Group By的基本用法至关重要。Group By语句将结果集按照一个或多个列进行分组,这样我们可以对每个组应用...

    Python在groupby分组后提取指定位置记录方法

    具体到本篇文章所提到的技术点,首先我们来了解groupby分组后如何提取指定位置的记录。在使用groupby进行分组后,pandas返回的是一个分组对象,这个对象是分组数据的集合,而不是单个数据的集合。在这种情况下,我们...

    Mysql利用group by分组排序

    本文将深入探讨Mysql中`GROUP BY`的分组排序功能,并通过一个实际的例子来说明其工作原理。 首先,`GROUP BY`的基本用法是在查询中对特定列进行分组,以便对每个分组应用聚合函数,如`COUNT()`, `SUM()`, `AVG()`, ...

    MySQL数据库中group by语句与update语句的用法研究.pdf

    本论文对 MySQL 数据库中的 group by 语句和 update 语句进行了深入研究,讨论了这些语句在数据库查询和修改中的应用,并给出了具体的解决方案。 一、MySQL 数据库中 group by 语句的用法 Group by 语句的作用是对...

    java实现分组聚合

    在Java编程中,分组聚合是一项重要的数据处理技术,它允许我们按照特定的规则将数据组织成多个逻辑组,然后对这些组进行...在Java的集合框架和流API中,分组聚合是一个强大而灵活的工具,值得开发者深入研究和应用。

    《Pro Oracle SQL》Chapter7--7.10GROUP BY Restrictions

    在7.10 GROUP BY Restrictions这一部分,作者深入探讨了在使用GROUP BY子句时的一些限制和注意事项,这对于理解和编写高效、正确的SQL查询至关重要。 1. GROUP BY基础:GROUP BY子句用于将数据集按照一个或多个列...

    如何在datatable中使用groupby进行分组统计

    首先,让我们深入理解一下GroupBy方法。在LINQ中,GroupBy用于将源序列按照一个或多个键进行分组,返回一个IGrouping, TSource&gt;的集合,其中TKey是分组的键类型,TSource是原始元素类型。每个分组都包含一组具有相同...

    清晰解读GroupBy

    在数据库查询语言SQL中,`GROUP BY`是一个非常重要的概念,它可以帮助我们对数据进行分组并执行聚合操作,从而得出更有价值的信息。本文将从`GROUP BY`的基础概念出发,通过一系列示例和深入分析,帮助读者更清晰地...

    第十一章连接查询和分组查询.zip

    分组查询是通过GROUP BY语句实现的,它允许我们按一个或多个列对数据进行分类,并可以与聚合函数(如COUNT、SUM、AVG、MAX和MIN)一起使用,以计算每个组的统计信息。 1. GROUP BY语句:根据一个或多个列对结果集...

    C#数据库分组条件查询代码

    在SQL中,一个基本的分组查询可能如下所示: ```sql SELECT Column1, Column2, COUNT(*) FROM TableName WHERE Condition GROUP BY Column1, Column2 ``` 这个查询将根据`Column1`和`Column2`的值对`TableName`...

    group by 后 使用 rollup 子句 总结.doc

    在 SQL 查询语言中,`GROUP BY` 语句被广泛应用于对数据进行分组处理,以便能够更好地汇总和分析数据。而在 `GROUP BY` 语句后加上 `ROLLUP` 子句,则能进一步扩展数据分组的能力,使得查询结果更加灵活多变。 **...

    Linq Grouping GroupBy 用法详解

    本文将深入探讨`GroupBy`方法的使用,包括其基本用法、多键分组以及在实际开发中的应用示例。 ### 1. 基本用法 `GroupBy`方法接收一个函数作为参数,该函数用于从每个元素中提取分组键。例如,如果你有一个`...

    查询(多表查询,嵌套查询,分组查询)

    根据给定的关系模式和SQL查询语句,我们可以深入地探讨多表查询、嵌套查询以及分组查询等数据库操作中的关键技术点。 ### 关系模式分析 #### 职员表 (Emp) - **主码**: `eid` (唯一标识每个员工) - **属性**: - `...

Global site tag (gtag.js) - Google Analytics