SQL学习八、分组数据

2018-10-24  本文已影响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规定


过滤分组,HAVING子句

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

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子句用在数据分组后进行过滤。这是一个重要的区别

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的组合使用。

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

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 输出排序顺序
上一篇下一篇

猜你喜欢

热点阅读