这是我们使用HAVING
:
select column1 from table1
where condition1
having condition2;
如果我们这样做,不是同样的事情:
select column1 from table1
where condition1 AND condition2;
这两者有什么区别?
答案 0 :(得分:19)
在你的例子中,他们应该做同样的事情。但是WHERE
会在任何GROUP BY
之前处理,因此它无法访问聚合值(即Min()
的结果,{{1等功能)。 Max()
在 HAVING
之后被处理,因此可用于将结果集限制为仅具有与特定谓词匹配的聚合值的结果集。
答案 1 :(得分:6)
HAVING
用于聚合,例如,HAVING SUM(column1) > 200
,WHERE
仅适用于列,例如WHERE column1 < 20
。
答案 2 :(得分:4)
不,他们完全不同。
有条件用于分组聚合函数。它们是在计算聚合值后计算的。
示例:
select id, count(1)
from table
where COND1
having count(1) > 1
此处,在查询计算每个组的count(1)值后,having
部分被评估为。
答案 3 :(得分:4)
在您的示例中,它是相同的,因为您没有GROUP BY
否则,HAVING在 GROUP BY后应用, WHERE后应用 ...
如果说,使用简单的过滤器(x = 2
)使用与x = 2
只有在你的分组上才有意义。您通常在聚合(例如COUNT(*) > 2
)上使用HAVING,只能在GROUP BY之后应用
答案 4 :(得分:3)
不,因为有聚合函数或group by子句。
例如:
SELECT COUNT(ID)
FROM tablexpto
where name = 'a'
having count(ID) > 1
第一个查询无法运行。
答案 5 :(得分:3)
正如其他人(大多数)正确陈述的那样,在SQL中WHERE
子句在SELECT
子句之前被评估,因此set函数的结果是{{1}中的“超出范围” }。clause。
例如,你不能这样做:
WHERE
因为列相关名SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
WHERE TopScore <= 70;
不在TopScore
子句的范围内。
当然我们可以使用子查询:
WHERE
问题是,SQL的早期实现(从IBM的System R开始)缺乏对派生表的支持,因此非直观的SELECT DT1.TopScore
FROM (
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
) AS DT1
WHERE DT1.TopScore <= 70;
诞生了。
你可以通过Hugh Darwen在HAVING A Blunderful Time (or Wish You Were WHERE)阅读整个令人遗憾的故事,我从中借用了上述例子。
答案 6 :(得分:2)
HAVING指定SELECT语句中使用的组或聚合函数的搜索条件。
HAVING子句类似于WHERE子句,但仅适用于整个组,而WHERE子句适用于各个行。
答案 7 :(得分:1)
只能使用group by子句,并在分组后限制记录。
答案 8 :(得分:-1)
使用你需要group by子句。没有一个
你会得到一个错误