关注回复“8”获取SQL必知必会
接着上一节,我们学习了数据聚合以及相关的函数用法,今天我们来讲讲聚合后的结果如何过滤。
基于之前运行的结果,我们使用SELECT COUNT语句、AVG函数、WHERE过滤语句以及GROUP BY数据聚合,统计出我们想要的结果,计算出每一位供应商售价小于30的产品平均单价。
在此基础上,我们遇到了新的需求,要求筛选出产品平均单价小于20的供应商。
也就是说,要基于数据聚合结果进行过滤,我们之前学过的核心语句是WHERE,现在是否可使用呢?我们可以试验一下:
此时,系统报错,说明用WHERE来过滤聚合之后的数据是行不通的,语句中已经出现了1次WHERE在聚合之前,为了分清楚过滤的执行顺序,我们要用到新的过滤语句HAVING。
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SELECT 列名称,aggregate_function列名称
FROM 表名称
WHERE 列名称 运算符 值
GROUP BY 列名称
HAVING 自定义聚合类别 运算符 值
注释:Aggregate 函数的操作面向一系列的值,并返回一个单一的值。
需求:列出平均单价大于20的供应商号码。
这个需求是基于前面的结果,过滤出平均单价>20的数据,此时我们要用到HAVING子句进行聚合后的过滤。如下图所示:
然后点击运行按钮,我们可以得到:
此时我们得到返回的结果,准确地统计了聚合之后平均单价>20的供应商号码,达成需求。
举一反三:
如果没有WHERE语句的过滤,只要是聚合后的过滤,都要用HAVING来执行。
需求:查找出平均价格介于20到30之间的供应商号码。如下所示:
此时我们可以看到,虽然聚合数据之前,没有WHERE语句,只要是出现在GROUP BY后面的过滤,只能用HAVING来执行。我们可以得出结果:
至此,我们可以总结出WHERE和HAVING的区别。
最后,让我们来回顾一下SQL核心语句的构成及执行顺序
在过滤语句中,where只能用在数据源,不能用在聚合数据之后,HAVING用在聚合数据的过滤。如下图所示:
千万不要弄错咯~
SQL数据分析的学习,贵在坚持,切忌三天打鱼两天晒网,希望我们都能利用SQL分析工具,早点实现我们的业务目标。
发表评论