Where 与 Having / Having 子句和 Where 子句的区别






4.48/5 (17投票s)
SQL 的 Where 和 Having 子句之间的基本区别。
引言
我们总是对 WHERE 和 Having 子句感到困惑,并且会犯错误。在本文中,我将尝试强调 WHERE 和 HAVING 之间的所有主要区别,以及在使用 WHERE 或 HAVING 时您应该注意的事项。
------------------------------------------------------------------------------
大多数情况下,使用 Where 或 Having 会得到相同的结果。下面给出的两个 SQL 命令产生相同的结果集,即,都计算加利福尼亚州和洛杉矶州找到的记录数。
SELECT state, COUNT(*)
FROM Test
WHERE state IN ('CA', 'LA')
GROUP BY state
ORDER BY state
SELECT state, COUNT(*)
FROM Test
GROUP BY state
HAVING state IN ('CA', 'LA')
ORDER BY state
背景
(可选)那么,区别在哪里,哪个更好?稍后我将让您回答这些问题。
使用 WHERE 子句的主要原因是选择要包含在查询中的行。例如,假设表 Test。假设我想要加利福尼亚州和洛杉矶州所有客户的姓名、帐号和到期余额。由于 STATE 是记录格式中的一个字段,因此我可以使用 WHERE 来选择这些客户。
使用代码
SELECT cusnum, lstnam, init
FROM Test
WHERE state IN ('CA', 'LA')
CUSNUM LSTNAM INIT BALDUE
====== ============ ==== ========
938472 John G K 37.00
938485 Mark J A 3987.50
593029 Lily E D 25.00
假设我想要按州划分的客户到期总金额。 在这种情况下,我需要使用 GROUP BY 子句来构建聚合查询。
SELECT state,SUM(baldue)
FROM Test
GROUP by state
ORDER BY state
State Sum(Baldue)
===== ===========
CA 250.00
CO 58.75
GA 3987.50
MN 510.00
NY 589.50
TX 62.00
VT 439.00
WY .00
关注点
假设我想要相同的信息,但我不在乎没有人欠我钱的州。由于各州所欠的总额是一个聚合数字,即该数字是从一组记录生成的,因此您必须使用 HAVING 来选择正确的数据。
SELECT state,SUM(baldue)
FROM Test
GROUP by state
HAVING SUM(baldue) > 0
ORDER BY state
State Sum(Baldue)
===== ===========
CA 250.00
CO 58.75
GA 3987.50
MN 510.00
NY 589.50
TX 62.00
VT 439.00
这是规则。如果条件引用聚合函数,请将该条件放在 HAVING 子句中。 否则,请使用 WHERE 子句。
这是另一个规则:除非您也使用 GROUP BY,否则您不能使用 HAVING。
现在,回到第一个示例,其中 WHERE 和 HAVING 产生相同的结果集。 有什么区别? 第一个查询使用 WHERE 子句来限制计算机必须求和的行数。 但是第二个查询对表中的所有行求和,然后使用 HAVING 丢弃它为德克萨斯州和佐治亚州以外的所有州计算的总和。 第一个查询显然是更好的一个,因为没有必要让计算机计算总和然后丢弃它们。
有关完整的文章,请访问 <a href="http://gouravverma.blogspot.com/2008/04/where-vs-having-difference-between.html">gouravverma.blogspot.com</a>
历史
在此处保持您所做的任何更改或改进的实时更新。