当'有'时,为什么你有'哪里'?

Set*_*ath 7 mysql sql where where-clause having-clause

我知道这个问题已经讨论得很多了,但是我的研究都没有让我相信MySQL中的' where'和' having'条款之间的区别.根据我的理解,我们可以使用' having' 来实现'where'子句可以完成的所有事情.例如.select * from users having username='admin'.那为什么你需要' where'条款?使用哪里可以产生任何性能差异?

mel*_*okb 6

WHERE子句在聚合之前过滤来自源的数据,而HAVING子句GROUP BY在应用之后过滤数据.通常,这意味着任何非聚合过滤器都可以出现在任何一个位置,但如果您的查询中没有引用的列,则只能在WHERE子句中对其进行过滤.

例如,如果您有以下表格:

| ID | VALUE |
--------------
|  1 |    15 |
|  2 |    15 |
|  3 |    20 |
|  4 |    20 |
|  5 |    25 |
|  6 |    30 |
|  7 |    40 |
Run Code Online (Sandbox Code Playgroud)

假设您要应用以下查询:

select value, count(value)
from Table1
group by value
Run Code Online (Sandbox Code Playgroud)

但是你只想在其中包含行ID > 2.如果将其放在HAVING子句中,则会出现错误,因为该ID列在聚合后不可用,因为它不在SELECT子句中.在这种情况下,您将需要使用一个WHERE子句:

select value, count(value)
from Table1
where id > 2
group by value
Run Code Online (Sandbox Code Playgroud)

演示:http://www.sqlfiddle.com/#!2/ f6741/16