数分能力栈 | SQL的where 和 having 的区别你搞明白了吗?
一、where和having的区别
- where:
where 是一个约束声明,使用 where 来约束来自数据库的数据; where 是在结果返回之前起作用的; where 中不能使用聚合函数; - having:
having 是一个过滤声明; 在查询返回结果集以后,对查询结果进行的过滤操作; 在 having 中可以使用聚合函数;
二、聚合函数 和 group by
聚合函数就是例如 SUM、COUNT、MAX、AVG 等对一组(多条)数据操作的函数,需要配合 group by 来使用;如:
SELECT
SUM(population),
region
FROM
T01_Beijing
GROUP BY region;
//计算北京每个分区的人数
如果 SELECT 后跟多个字段名,并且这些字段不再聚合函数内,则要将所有的字段名都跟在 GROUP BY 后; 如果 GROUP BY 后只跟其中的一个字段,则分组后会随机在其它字段中选择一个;
例:
SELECT col_1, col_2, col_3
FROM tbl_name
GROUP BY col_1;
注:按 col_1 分组后,针对每一个分组,只会随机从col_2 和 col_3 中选择一个;因此要在 GROUP BY 后跟上 3 个字段名;
三、where 和 having 的执行顺序
where 早于 group by 早于 having;
where 子句在聚合前先筛选记录,也就是说作用在 group by 子句和 having 子句前,而 having 子句在聚合后对组记录进行筛选;
四、where 不能使用聚合函数、having 中可以使用聚合函数
例 1:筛选出北京西城、东城、海淀及各区学校数量
SELECT region,count(school)
FROM T02_Bejing_school
WHERE region IN ('海淀' , '西城' , '东城') GROUP BY region;
例 2:筛选出北京西城、东城、海淀三个区中学校数量超过10所的区及各区学校数量
SELECT region,count(school)
FROM T02_Bejing_school
WHERE region IN ('海淀' , '西城' , '东城')
GROUP BY region HAVING count(school) > 10;
注:
不能用 where 来筛选超过学校数量超过10 的区,因为表中不存在这样一条记录;而 HAVING 子句可以让我们筛选成组后的各组数据;
添加小统微信,围观小统朋友圈~
关键词
结果
字段名
聚合函数
col_1
col_2
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。