美文网首页
SQL 分组数据

SQL 分组数据

作者: 山药鱼儿 | 来源:发表于2022-03-17 23:07 被阅读0次

连载的上一篇文章,我们讲到通过 SQL 聚合函数可以汇总数据,比如对行进行计数,计算和与平均数,获取最大值和最小值。

但目前为止,我们的汇总都是正对所有行或匹配 WHERE 子句的数据上进行的。比如返回供应商 DLL01 提供的产品数目:

SELECT
    COUNT( * ) AS num_prods
FROM
    Products 
WHERE
    vend_id = 'DLL01';

运行结果:

那如果我们想要返回每个供应商提供的产品数目呢?这就需要用到分组聚合了。使用分组可以将数据分为多个逻辑组,然后对每个组进行聚合计算。

分组

分组的创建使用 SELECT 语句中的 GROUP BY 子句,比如下面的 SQL 返回每个供应商提供的产品数目:

SELECT
    vend_id,
    COUNT( * ) AS num_prods 
FROM
    Products 
GROUP BY
    vend_id;

运行结果:

上述 SELECT 语句返回两个列,vend_id 为供应商 ID,是分组字段;num_prods 为计算字段,使用 count(*) 聚合而来。GROUP BY 子句告诉 DBMSvend_id 排序并分组数据,然后对每个分组而不是整个数据集进行聚合。

注 1:GROUP BY 子句可以包含多个列,即允许分组嵌套。此外,除聚合函数返回的计算字段外,SELECT 语句后跟的每一列都必须在 GROUP BY 子句中给出。

注 2:如果分组中存在 NULL 值的行,则 NULL 将作为一个分组返回;多个 NULL 值将被分为一组。

过滤分组

除了使用 GROUP BY 分组数据外,SQL 还允许过滤分组,规定包含哪些分组,排除哪些分组。比如,我们只想列出供应产品数目在 2 种以上的供应商及其供应产品的数目。

这里有个过滤条件:供应产品数目大于 2,条件中的 供应产品数目 是针对分组后进行聚合产生的计算字段,因此无法使用 WHERE 子句。WHERE 子句过滤时指定的是行,而不是分组。

为此,SQL 提供了 HAVING 子句来过滤分组,并且 HAVING 支持所有 WHERE 操作符。下面,我们来完成供应产品数目在 2 种以上的供应商及其供应产品的数目。

SELECT
    vend_id,
    COUNT( * ) AS num_prods 
FROM
    Products 
GROUP BY
    vend_id 
HAVING
    num_prods > 2;

运行结果:

跟前面的结果相比,供应产品数目等于 2 的供应商信息就不见啦~

注:WHERE 过滤行,HAVING 过滤分组。也可以理解为 WHERE 在分组前进行过滤,HAVING 在数据分组后进行过滤。

关于 WHERE 子句和 HAVING 子句的区别,我们可以再通过一个案例理解一下。下面的 SQL 检索具有两个或以上产品且其价格大于等于 4 的供应商。

其中产品表如下:

SQL 语句如下:

SELECT
    prod_id,
    COUNT( * ) AS prod_num 
FROM
    Products 
WHERE
    prod_price >= 4 
GROUP BY
    vend_id 
HAVING
    prod_num >= 2;

运行结果:

附:SELECT 子句顺序

截止目前,我们已经学了不少的 SELECT 子句,下面小鱼针对目前我们已经学习的 SELECT 子句来总结一下他们在 SELECT 语句中的先后顺序。

表中子句的排列顺序即为它们在 SELECT 语句中依次出现的次序:

子句 说明 是否必须使用
SELECT 返回的列或表达式
FROM 从中检索数据的表 仅在从表中检索数据时使用
WHERE 行级过滤
GROUP BY 分组数据 仅在分组聚合时使用
HAVING 组级过滤
ORDER BY 对结果进行排序

还是上面的例子,检索具有两个或以上产品且其价格大于等于 4 的供应商和其供应的产品数目,不过检索检索需要按照产品数目升序排列。

SELECT
    prod_id,
    COUNT( * ) AS prod_num 
FROM
    Products 
WHERE
    prod_price >= 4 
GROUP BY
    vend_id 
HAVING
    prod_num >= 2 
ORDER BY
    prod_num;

运行结果:

总结

本节,我们学习了使用 GROUP BY 子句对多组数据进行汇总计算,并返回每个分组的结果。并实践了如何使用 HAVING 子句过滤分组。

相关文章

  • SQL 分组数据

    连载的上一篇文章,我们讲到通过 SQL 聚合函数可以汇总数据,比如对行进行计数,计算和与平均数,获取最大值和最小值...

  • SQL 学习笔记

    SQL基础 参考书籍: 《SQL必知必会》 检索数据 过滤数据 函数 分组数据 子查询 简单联结 法一: 法二: ...

  • SQL必知必会读书笔记10

    分组数据 数据分组 使用SQL聚集函数可以汇总数据,这样我们就能够不检索所有数据就获得最大值和最小值。通过分组可以...

  • 【SQL】(十):分组数据

    本系列为自己学习时的笔记及心得体会,转载请注明出处。 1、数据分组 如果要返回每个供应商提供的产品数据,那就需要使...

  • 数据库的数据分组GROUP BY

    1、数据分组入门 数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。SQL语句中使用 GROUP B...

  • 中文文档 pyspark.sql.DataFrame

    class pyspark.sql.DataFrame(jdf, sql_ctx) 分布式的收集数据分组到命名列中...

  • 【SQL Server 第1篇】T-SQL概述

    T-SQL是SQL Server系统产品独有的关系数据库系统语言。 T-SQL主要由三部分组成 DDL:数据定义语...

  • Pandas-分组函数和分层索引的展开

    分组函数groupby 在处理数据的时候经常会用到分组,类似于SQL中的group by,按照group by后面...

  • SQL学习八、分组数据

    我们在查询数据时经常会根据数据的某一特性进行分类获取,这就是这篇文章要记录的两个SELECT的子句:GROUP B...

  • _10_ SQL 数据分组

    本文DEMO https://gitee.com/changsanjiang/SQLDemo/tree/maste...

网友评论

      本文标题:SQL 分组数据

      本文链接:https://www.haomeiwen.com/subject/ccybdrtx.html