SQL中的 WHERE 和 HAVING 子句 有什么区别 ,这是SQL和数据库面试中最常问的问题之一,尤其是对初学者而言?由于编程工作需要不止一种技能,所以在Java和.NET面试中看到一些SQL面试问题 是很常见的。与其他问题不同的是,没有多少Java程序员或dot net开发人员,应该有基本的SQL知识,却不能回答这个问题。尽管几乎一半的程序员说WHERE 用于任何 SELECT 查询,而 HAVING 子句只用于SELECT查询,其中包含聚合函数或group by子句,这是正确的。
尽管 WHERE 和 HAVING 子句在SQL中 都 是用来指定过滤条件的,但它们之间有细微的区别。在面试中,当他们被要求解释 包含 WHERE 和 HAVING子句的 SELECT查询 的结果时 ,我看到很多人在那里感到困惑。
关键点,也是 SQL中WHERE和HAVING子句的 主要区别 在于,WHERE 子句 中指定的条件 在从表中获取数据(行)时使用,不通过条件的数据将不会被获取到结果集中,另一方面 ,HAVING 子句后来被用来过滤汇总的数据或分组的数据。
简而言之,如果 在一个 带有聚合函数 或GROUP BY 子句 的 SELECT查询 中同时 使用 WHERE 和 HAVING子句 ,它将在 HAVING 子句 之前执行 。当我们看到 WHERE、 HAVING、 JOIN 和 GROUP BY 子句在一起的 例子时,这一点就会更加清楚 。
SQL中的WHERE与HAVING子句示例
在这个 WHERE 和 HAVING 子句 的例子中 ,我们有两个表 Employee 和 Department。 Employee 包含员工的详细信息,如ID、姓名、年龄、工资和部门ID,而 Department 包含ID和部门名称。 为了 显示哪个员工在哪个部门工作,我们需要在 DEPT_ID 上 连接两个表 ,以获得部门名称。
我们的要求是找到每个部门有多少员工,以及该部门的平均工资。为了使用 WHERE 子句,我们将只包括收入超过5000的员工。在执行我们包含 WHERE HAVING和 GROUP BY 子句 的 查询之前 ,让我们看看 Employee 和 Department 表中 的数据 。
SELECT *FROMEmployee;
EMP_ID | EMP_NAME | EMP_AGE | EMP_SALARY | DEPT_ID |
1 | 维拉特 | 23 | 10000 | 1 |
2 | Rohit | 24 | 7000 | 2 |
3 | 苏雷什 | 25 | 8000 | 3 |
4 | 石克尔 | 27 | 6000 | 1 |
5 | 维贾伊 | 28 | 5000 | 2 |
SELECT *FROM部门。
DEPT_ID | 部门名称 |
1 | 会计 |
2 | 市场部 |
3 | 销售部 |
SELECT d.DEPT_NAME,count(e.EMP_NAME)asNUM_EMPLOYEE,avg(e.EMP_SALARY)asAVG_SALARYFROMEmployee e,
部门dWHEREe.DEPT_ID=d.DEPT_IDANDEMP_SALARY >5000 GROUP BYd.DEPT_NAME;
雇员名称 | 雇员人数 | 平均工资 |
会计 | 1 | 8000 |
市场营销 | 1 | 7000 |
销售部 | 2 | 8000 |
从雇员人数 (NUM_EMPLOYEE)这 一栏中,你可以看到只有在 市场部 工作的Vijay 没有被包括在结果集中,因为他的收入是5000。这个例子表明 ,WHERE 子句 中的条件 是用来在聚合之前过滤行的,然后 HAVING 子句用于最终过滤,从下面的查询中可以看出,现在市场部被排除了,因为它没有通过HAVING子句中的条件,我是说AVG_SALARY > 7000
SELECT d.DEPT_NAME,count(e.EMP_NAME)asNUM_EMPLOYEE,avg(e.EMP_SALARY)asAVG_SALARYFROMEmployee e,
部门dWHEREe.DEPT_ID=d.DEPT_IDANDEMP_SALARY >5000 GROUP BY d.DEPT_NAMEHAVING AVG_SALARY > 7000。
帐户名称:DEPT_NAME | 雇员人数 | 平均工资 |
会计 | 1 | 8000 |
销售 | 2 | 8000 |
SQL中WHERE和HAVING之间的区别
除了我们在这篇文章中看到的这个关键区别外,这里还有一些 WHERE 和 HAVING 子句的区别 ,值得记住,可以用来比较它们。
-
除了SELECT查询,你还可以 在 UPDATE 和 DELETE 子句 中使用 WHERE 子句 ,但 HAVING 子句只能用于SELECT查询。例如下面的查询,涉及到 WHERE 子句的可以工作,但其他使用 HAVING 子句的就不能工作。
update DEPARTMENTsetDEPT_NAME="NewSales" WHEREDEPT_ID=1; // works fine
update DEPARTMENTsetDEPT_NAME="NewSales" HAVINGDEPT_ID=1; // 错误
在关键词'HAVING'附近的语法不正确。:updateDEPARTMENTsetDEPT_NAME='NewSales' HAVINGDEPT_ID=1
-
WHERE 子句是用来过滤记录的,它适用于每一条记录,而 HAVING 子句是用来过滤SQL中的组。
3)WHERE 和 HAVING 子句在语法上的一个区别 是,前者用于 GROUP BY 子句 之前 ,而后者用于 GROUP BY 子句 之后 。
-
当 WHERE 和 HAVING 子句在带有聚合功能的SELECT查询中一起使用时, WHERE 子句首先应用于单个记录,只有通过条件的记录才会被纳入创建组。一旦组被创建, HAVING 子句就被用来根据指定的条件过滤组。
以上就是关于 SQL中 WHERE 和 HAVING子句的 区别 。正如我所说,这是一个非常受欢迎的问题,你不能不准备它。永远记住 SQL中 WHERE 和 HAVING子句的关键区别 ,如果 WHERE 和 HAVING 子句一起使用,首先 应用 WHERE 子句来过滤行,只有在分组后才 应用HAVING 子句。