6

可能重复:
SQL:HAVING 和 WHERE 有什么区别?

我看过关于WHERE和的各种讨论HAVING。我还有一个问题:HAVING仅在考虑聚合时使用,或者它可以用于更一般的术语:每当您在查询中创建或别名字段时?我知道WHERE应该尽可能使用它。

4

4 回答 4

10

HAVING指定搜索SELECT语句中使用的内容。

换句话说。

HAVING适用于团体。

WHERE适用于行。

于 2011-06-15T15:31:05.270 回答
7

WHERE子句用于限制记录,查询优化器也使用该子句来确定要使用哪些索引和表。 HAVING 是最终结果集上的“过滤器”,并且在 之后应用 GROUP BY,因此 sql 无法使用它来优化查询。

WHERE提取时应用于每一行。HAVING提取所有行然后过滤结果。

因此WHERE不能用于聚合函数,因为它们需要提取完整的行集。

于 2011-06-15T15:31:58.623 回答
7

HAVING仅适用于涉及与GROUP BY子句一起使用的聚合的条件。例如。COUNT, SUM, AVG, MAX, MIN. WHERE适用于任何非聚合条件。它们甚至可以在同一个查询中一起使用。例如。

SELECT t1.id, COUNT(*) FROM table1 AS t1
    INNER JOIN table2 AS t2 ON t2.t1_id = t1.id
    WHERE t1.score > 50
    GROUP BY t1.id HAVING COUNT(*) > 2;

更新#1:

原来有一个HAVING我不知道的非聚合用法。下面使用别名的查询仅适用于HAVING关键字,而不适用于WHERE关键字。查看我在 MySQL 中的测试:

mysql> create table my_contacts (
    -> id int unsigned primary key auto_increment,
    -> first_name varchar(32) not null,
    -> last_name varchar(32) not null,
    -> index (last_name, first_name)
    -> ) engine=innodb;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into my_contacts (first_name, last_name)
    -> values ('Randy', 'Jackson'), ('Billy', 'Johnson'), ('Sam', 'Harris'), ('Lenny', 'Benson'), ('Sue', 'Flax');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT last_name AS l FROM my_contacts HAVING l LIKE '%son';
+---------+
| l       |
+---------+
| Benson  |
| Jackson |
| Johnson |
+---------+
3 rows in set (0.00 sec)

mysql> SELECT last_name AS l FROM my_contacts WHERE l LIKE '%son';
ERROR 1054 (42S22): Unknown column 'l' in 'where clause'

更新#2:

我现在已经测试了HAVINGSQL Server 上的新用法,但它不起作用。所以这可能是 MySQL 独有的功能。此外,@Denis 在评论中指出,此技巧仅在列/别名可以消除歧义且仅适用于某些引擎的情况下才有效。

于 2011-06-15T15:30:38.143 回答
4

HAVING当您有一个GROUP BY子句并且您尝试基于其中一个分组字段进行过滤时使用;WHERE否则用于过滤。

例如。

select StudentName from students where Age > 20

select className, count(studentId) from classes group by className 
                                      having count(studentId) > 10
于 2011-06-15T15:31:05.113 回答