如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。