SQL:使用WHERE AND而不是HAVING

时间:2010-07-01 16:28:50

标签: sql

这是我们使用HAVING

的SQL语句的示例
select column1 from table1
where condition1
having condition2;
如果我们这样做,

不是同样的事情:

select column1 from table1
where condition1 AND condition2;

这两者有什么区别?

9 个答案:

答案 0 :(得分:19)

在你的例子中,他们应该做同样的事情。但是WHERE会在任何GROUP BY之前处理,因此它无法访问聚合值(即Min()的结果,{{1等功能)。 Max() HAVING之后被处理,因此可用于将结果集限制为仅具有与特定谓词匹配的聚合值的结果集。

答案 1 :(得分:6)

HAVING用于聚合,例如,HAVING SUM(column1) > 200WHERE仅适用于列,例如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子句适用于各个行。

具有 http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

答案 7 :(得分:1)

只能使用group by子句,并在分组后限制记录。

答案 8 :(得分:-1)

使用你需要group by子句。没有一个

你会得到一个错误