我不是在问这两个条款之间有什么区别。我知道WHERE子句在表中的行内搜索,并且HAVING子句在select语句中分组的项目中搜索。
示例:
SELECT x, Count(*)
FROM table
WHERE x IS NOT NULL
GROUP BY x
HAVING Count(*) > 1
ORDER BY x
返回与
相同的内容 SELECT x, Count(*)
FROM table
GROUP BY x
HAVING x <> NULL
AND Count(*) > 1
ORDER BY x
HAVING子句是否可以在每次没有WHERE子句时返回相同的结果,例如在本例中,还是有时间需要WHERE子句?或者这仅仅是效率问题?
答案 0 :(得分:1)
在您的第一个查询中,WHERE x IS NOT NULL
过滤掉列x
具有空值的所有行,然后执行分组。
然而,在第二个查询中,您首先执行分组,然后应用相同的过滤器。
我更喜欢第一个,过滤掉不需要的行,然后执行分组。
答案 1 :(得分:1)
在分组完成之前,您可以使用where子句按表中的任何列进行过滤。例如。
SELECT x, COUNT()
FROM table
WHERE y IS NOT NULL
GROUP BY x HAVING COUNT() > 1
ORDER BY x
所以答案绝对是肯定的,你有时需要where子句。正如Rahul指出的那样,即使在你的例子中,我也更喜欢带有where子句的那个。