SQL中WHERE和HAVING之间的区别[重复]

||                                                                                                                   这个问题已经在这里有了答案:                                                      
已邀请:
        
HAVING
指定对
SELECT
语句中使用的内容的搜索。 换一种说法。
HAVING
适用于组。
WHERE
适用于行。     
        “ 0”仅适用于涉及与“ 5”子句一起使用的聚集的条件。例如。
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: 原来,我不了解a0的非汇总用法。以下使用别名的查询仅适用于
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: 我现在已经在SQL Server上测试了ѭ0的新颖用法,但是它不起作用。因此,这可能是仅MySQL的功能。另外,@ Denis在评论中指出,该技巧仅在列/别名可以消除歧义的情况下有效,并且仅在某些引擎上有效。     
        
WHERE
子句用于限制记录,并且也由 查询优化器以确定要使用的索引和表。
HAVING
是最终结果集上的“过滤器”,并在之后
GROUP BY
,因此sql不能使用它来优化查询。 提取时每行应用3ѭ。
HAVING
提取所有行,然后过滤结果。 因此,
WHERE
不能用于聚合函数,因为它们需要提取完整的行集。     
        当您有一个
GROUP BY
子句并尝试根据分组字段之一进行过滤时,将使用
HAVING
WHERE
否则用于过滤。 例如。
select StudentName from students where Age > 20

select className, count(studentId) from classes group by className 
                                      having count(studentId) > 10
    

要回复问题请先登录注册