美文网首页
_10_ SQL 数据分组

_10_ SQL 数据分组

作者: changsanjiang | 来源:发表于2018-07-14 11:26 被阅读23次

本文DEMO

https://gitee.com/changsanjiang/SQLDemo/tree/master

上一节汇总数据时, 每个示例都是在表所有数据或匹配特定的WHERE子句的数据上进行的.
如果要返回每个供应商提供的产品数目, 该怎么办? 或者返回只提供一项产品的供应商, 或者返回提供10个以上产品的供应商?

这时, 我们就需要使用分组GROUP BY子句了, 使用分组可以将数据分为多个逻辑组, 从而对每个组进行聚集计算.

创建分组

到底什么是分组, 我们先看例子:

输入:

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

输出:

image.png

分析:

vend_id 为产品供应商的 ID, num_prods 为计算字段(用 COUNT(*) 函数建立).
GROUP BY子句指示 DBMS 按 vend_id 排序并分组. 因此DBMS对每个 vend_id 计算 num_prods. 从输出可看出, BRS01有3个产品.


过滤分组

除了能用GROUP BY分组数据外, SQL还允许过滤分组, 规定包括哪些分组, 排除哪些分组. 例如, 你可能想列出至少有两个订单的所有顾客. 为此, 必须基于完整的分组进行过滤, 而不是个别的行.

我们之前使用WHERE子句, 但在此处, WHRER并不能完成任务, 因为WHERE过滤指定的是行而不是分组. 事实上, WHERE没有分组的概念.

完成这个任务需要使用HAVING子句, HAVING非常类似于WHERE. 事实上目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代. 唯一的差别是, WHERE过滤行, HAVING过滤分组.

输入:

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

输出:

image.png

分析:

HAVING子句过滤COUNT(*) >= 2的那些分组. 如图返回结构, 可以看到: WHERE子句在这里不起作用, 因为过滤是基于分组, 而不是特定行的值.

那么, 有么有在一条语句中同时使用WHEREHAVING子句的需求呢? 事实上有, 例如: 列出具有两个以上产品且价格大于等于4的供应商 如下:

SELECT vend_id, COUNT(*) AS num_pods -- 查询产品个数
FROM Products
WHERE prod_price >= 4 -- 需价格大于等于4美元的产品
GROUP BY vend_id  -- 根据供应商ID进行分组
HAVING count(*) >= 2; -- 过滤出提供两个以上产品的供应商

输出:

image.png

分组+排序

一般在使用Group BY子句时, 应该也给出ORDER BY子句. 这是保证数据正确排序的唯一方法. 千万不要依赖GROUP BY排序数据.

输入:

SELECT order_num, COUNT(*) AS items 
FROM OrderItems 
GROUP BY order_num 
HAVING COUNT(*) >= 3 
ORDER BY items, order_num;

输出:

image.png

分析:

order_num -> 订单号
items -> 每个订单的物品数目

此例中, 使用GROUP BY子句按订单号(order_num列)将数据进行分组, 使得COUNT(*)函数能够返回每个订单中的物品数目. HAVING子句过滤数据, 使得只返回包含三个以上的订单. 最后ORDER BY子句进行排序输出.

相关文章

  • _10_ SQL 数据分组

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

  • Python(七十一)数据入库

    10_数据入库/01_MySQL查找.py: 10_数据入库/02_MySQL插入数据.py: 10_数据入库/0...

  • 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后面...

网友评论

      本文标题:_10_ SQL 数据分组

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