mysql - 为什么有 'where'的时候有 'having'

标签 mysql sql where where-clause having-clause

<分区>

我知道这已被广泛讨论,但我的研究都无法说服我区分 MySQL 中的“where”和“having”子句。据我了解,我们可以使用 'having' 实现 'where' 子句可以完成的所有事情。例如。 从用户名='admin' 的用户中选择 *。那你为什么需要'where'子句呢?使用 where 会产生任何性能差异吗?

最佳答案

WHERE 子句在聚合之前从源中过滤数据,而 HAVING 子句在应用 GROUP BY 之后过滤数据。通常这意味着任何非聚合过滤器都可以出现在任何一个地方,但如果您有一个列在您的查询中没有被引用,您只能在 WHERE 子句中过滤它。

例如,如果您有下表:

| ID | VALUE |
--------------
|  1 |    15 |
|  2 |    15 |
|  3 |    20 |
|  4 |    20 |
|  5 |    25 |
|  6 |    30 |
|  7 |    40 |

假设您想应用以下查询:

select value, count(value)
from Table1
group by value

但您只想包含 ID > 2 的行。如果你把它放在 HAVING 子句中,你会得到一个 error ,因为 ID 列在聚合后不可用,因为它不在 SELECT 子句中。在这种情况下,您需要改用 WHERE 子句:

select value, count(value)
from Table1
where id > 2
group by value

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

关于mysql - 为什么有 'where'的时候有 'having',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15090342/

相关文章:

mysql - 删除 MySQL 表列中最多出现 2 次的所有重复项之一

sql - 在数据库中更新/插入/检索重音字符?

sql - T-SQL:检查给定日期是否采用夏令时

mysql - 使用 count() 从另一个表更新一个表

SQL JOIN 在哪里放置 WHERE 条件?

不存在关系时的 Hibernate JOIN FETCH

mysql - SQL 从一个表中选择在另一个表中出现 < 3 次的所有记录

mysql - 观看最新的 mysql 查询而不记录日志

laravel - Laravel 4-如何使用关系列所在的条件

java - Eclipse 使用 while 循环将数据插入 MySQL 没有指定值错误