WHERE和HAVING有什么区别

时间:2010-03-10 00:24:08

标签: sql group-by

  

可能重复:
  SQL: What’s the difference between HAVING and WHERE?

我正在学习sql语法,我无法理解这一点。

问题的后半部分是技术性问题。在WHERE和HAVING之间数据库的幕后实际发生了什么?哪一个使用更多的资源?它们是否适用于不同的数据集?

谢谢!

6 个答案:

答案 0 :(得分:2)

位于大多数查询中,并限制查询所关注的记录。

在“分组依据”查询中使用,并对分组结果执行操作。

首先考虑Where子句。如果db中有1000条记录,那么where子句可能只有80条记录。并且假设Group By子句将这80个db记录分组为(例如)15个聚合记录集行。如果没有Having子句,您将获得所有这15个聚合行。如果要对这15个聚合行进行过滤,请使用Having子句。

假设您想要一份德克萨斯州的所有客户名单,这些客户去年的订单超过5个。

  • Where条款,以获取德克萨斯州人员去年的所有订单
  • Group By子句按客户对所有订单进行分组(在您的select子句中使用Count(OrderID) As OrderCount
  • Having条款会将列出的客户限制为有5个或更多订单的客户。

答案 1 :(得分:1)

其中用于直接在表中过滤行。 具有用于在聚合行分组后对其进行过滤。

答案 2 :(得分:1)

它们都是条件运算符,但HAVING仅与GROUP BY语句中的聚合函数有关。

例如

SELECT *
FROM users
WHERE username = 'bob'

将使用用户名'bob'返回所有用户。

SELECT username, COUNT(*)
FROM users
GROUP BY username
HAVING COUNT(*) > 1

将返回多次使用哪些用户名。

答案 3 :(得分:1)

答案 4 :(得分:1)

WHERE用于过滤,在ANSI-89语法中也用于连接表。您可以 WHERE子句中使用聚合函数(MIN,MAX,COUNT等)。 IE:

WHERE x.col = 1    -- valid
WHERE COUNT(*) > 1 -- invalid

HAVING子句也用于过滤,但您只能使用聚合函数进行过滤。 IE:

HAVING COUNT(*) > 1 -- valid
HAVING x.col = 1    -- invalid

只有在定义了HAVING子句时才能定义GROUP BY子句 - 如果使用HAVING或{{1},则不能使用DISTINCT子句(分析函数)。 OVER子句始终在HAVING之后定义。

答案 5 :(得分:1)

我一直认为它是:HAVING是将哪些行分组到行。