我正在学习sql语法,我无法理解这一点。
问题的后半部分是技术性问题。在WHERE和HAVING之间数据库的幕后实际发生了什么?哪一个使用更多的资源?它们是否适用于不同的数据集?
谢谢!
答案 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)
WHERE
过滤FROM
联接的行。 Check out this example。HAVING
过滤与GROUP BY
汇总后返回的行。结帐this example。答案 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是将哪些行分组到行。