美文网首页
SQL学习八、分组数据

SQL学习八、分组数据

作者: 沐左 | 来源:发表于2018-10-24 10:49 被阅读0次

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

GROUP BY

其实我们在上一篇文章中已经使用了GROUP BY子句,在SQL学习七、聚合函数 ——> SUM()函数 - 返回指定列值的和(总计)中我们计算各类水果的销售额时使用的

SELECT goodsName, SUM(quantity*item_price) AS totalPrice 
FROM "oderlist" 
GROUP BY goodsName 
查询结果

GROUP BY 子句指示 DBMS按 goodsName 排序并分组数据,并计算每个goodsNametotalPrice 而不是整个表的 totalPrice

GROUP BY规定

  • 1、GROUP BY子句可以包含任意数目的列,因此可以对分组进行嵌套(GROUP BY子句中嵌套GROUP BY子句)
  • 2、如果在GROUP BY子句中进行了分组嵌套,数据将在最后知道的分组上进行汇总(即最小分组单元)
  • 3、GROUP BY子句中用来分组的必须是检索列或者有效的表达式(这个表达式不能是汇总函数),如果在SELECT中使用了表达式,则必须在GROUP BY子句中指定相同的表达式,且不能使用别名
  • 4、大多数SQL实现不允许GROUP BY指定的列带有长度可变的数据类型(如文本或备注型字段)
  • 5、如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回,如果列中有多行NULL值,它们将分为一组
  • 6、GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前

过滤分组,HAVING子句

使用场景:
当我们需要过滤分组聚集值而不是特定行值的时候,WHERE子句就不起作用了,这时候我们就需要使用HAVING子句了,也就是说HAVING子句一般需要结合GROUP BY子句使用。

  • 1、例如:我们想查询销售总额大于250元的水果类型,使用HAVING子句我们可以这样查询
SELECT goodsName, SUM(quantity*item_price) AS totalPrice 
FROM "oderlist" 
GROUP BY goodsName HAVING SUM(quantity*item_price) >250
过滤分组的结果

HAVING子句一般支持使用别名,例如我们可以这样写SQL,查询的结果是一样的

SELECT goodsName, SUM(quantity*item_price) AS totalPrice 
FROM "oderlist" 
GROUP BY goodsName HAVING totalPrice >250

如果使用WHERE子句,就会报错

SELECT goodsName, SUM(quantity*item_price) AS totalPrice 
FROM "oderlist" 
GROUP BY goodsName WHERE SUM(quantity*item_price) >250
查询报错

我们也可以这么理解,WHERE子句用在数据分组前进行过滤,HAVING子句用在数据分组后进行过滤。这是一个重要的区别

  • 2、例如:我们想查询销售总额大于150元的水果类型,但是要排除userId=13的订单(可能是自己下的单或者刷的单,不能反馈市场需求),这时我们就可以使用HAVING子句和WHERE子句结合的SQL
SELECT goodsName, SUM(quantity*item_price) AS totalPrice 
FROM "oderlist" 
WHERE userId != 13 
GROUP BY goodsName HAVING SUM(quantity*item_price) >150
查询结果

userId != 13 也可以换成 NOT IN (13)

SELECT goodsName, SUM(quantity*item_price) AS totalPrice 
FROM "oderlist" 
WHERE userId NOT IN (13) 
GROUP BY goodsName HAVING SUM(quantity*item_price) >150

分组和排序

第四章笔记记录了排序子句ORDER BY的使用,这里记录一下排序子句ORDER BY和分组子句GROUP BY的组合使用。

  • ORDER BY ---- 对满足条件的的输出数据进行排序
  • GROUP BY ---- 对满足条件的输出数据进行分组,但是输出可能不是分组的顺序

一般在使用 GROUP BY 子句时,应该也给出 ORDER BY 子句。这是保证数据正确排序的唯一方法

  • 1、例如:我们想查询销售总额大于150元的水果类型和销售额,但是要排除userId=13的订单(可能是自己下的单或者刷的单,不能反馈市场需求),并按照销售额排序
SELECT goodsName, SUM(quantity*item_price) AS totalPrice 
FROM "oderlist" 
WHERE userId NOT IN (13) 
GROUP BY goodsName HAVING SUM(quantity*item_price) >150 
ORDER BY  totalPrice DESC

SELECT 子句的顺序

子句 功能说明 是否必须使用
SELECT 要返回的列或表达式
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤
ORDER BY 输出排序顺序

相关文章

  • SQL学习八、分组数据

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

  • SQL学习09 分组数据

    创建分组 SELECT vend_id,COUNT(*)AS num_prodsFROMProductsGROUP...

  • SQL 分组数据

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

  • 用SQL语句操作数据

    第八章 用SQL语句操作数据 一.SQL 语言主要有以下几部分组成。 1.DML (DateManipulatio...

  • 轻松搞定数据分析之MySQL——汇总分析-2

    2.分组 学完了基本的汇总函数,接下来我们来学习如何对数据进行分组。在SQL中我们用group by语句来对数据进...

  • 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学习八、分组数据

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