【Access】SQL语句中WHERE子句和HAVING 子句的异同
初学SQL语句的时候,很多朋友总是无法理解HAVING 子句和WHERE子句之间区别,今天我们就来细细谈一谈这个问题。首先列出它们之间的相同和区别,然后我们举例说明。
一、相同点:
二者的相同点是在功能上来说的,HAVING子句和WHERE子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
二、区别如下:
1、WHERE是先分组再筛选记录,WHERE在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选。
2、在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。而HAVING子句中可以。HAVING 子句是聚组函数唯一出现的地方。
3、在查询过程中聚合语句(SUM,MIN,MAX,AVG,COUNT)要比HAVING子句优先执行。而WHERE子句在查询过程中执行优先级高于聚合语句。
4、HAVING 子句中的每一个元素必须出现在SELECT列表中。
例如,下图是一份销售业绩表:
现在假如我们想要查询销售额大于4000的记录,我们可以建立如下的SQL查询:
SELECT 销售编号, 姓名, 销售额
FROM 销售表
WHERE 销售额>4000
运行的到如下的结果:
那么现在假如我们想要查询销售额总额大于4000的员工以及它们的销售总额,怎么办呢?这时候我们可以建立如下的SQL查询:
SELECT 姓名, Sum([销售额]) AS 该员工的销售总额
FROM 销售表
GROUP BY 姓名
HAVING Sum([销售额]) >4000
运行的到如下的结果:
看到这里,请仔细想一想以上两个查询是不是明显感觉不一样啊?第二个查询就是以姓名来分组,求出每个员工的销售总额,然后再以这个销售总额为条件进行判断,而第一个查询并没有涉及到分组聚合,直接使用WHERE筛选记录。你Get到了嘛?