在MySQL中,WHERE和HAVING都是用于筛选数据的关键字,但它们在使用和作用上有一些区别。本文将详细介绍WHERE和HAVING的区别。
WHERE
WHERE是用于在SELECT语句中指定条件来过滤数据的关键字。它通常出现在FROM子句之后,而在GROUP BY子句之前。WHERE的作用是从表中选择满足特定条件的行,返回符合条件的记录。
WHERE有以下重要特点:
- WHERE用于对行数据进行过滤,只返回满足条件的行;
- WHERE条件可以包含比较运算符、逻辑运算符和通配符等;
- WHERE条件可以组合多个条件,形成复杂的查询条件。
以下是一个使用WHERE进行条件筛选的示例:
SELECT *
FROM customers
WHERE age > 18 AND country = 'China';
以上例子中,WHERE子句使用了两个条件:年龄大于18岁并且国家是中国。只有满足这两个条件的行才会被返回。
HAVING
HAVING是用于在SELECT语句中对分组数据进行过滤的关键字。它通常出现在GROUP BY子句之后。HAVING的作用是从分组数据中选择满足特定条件的分组,返回符合条件的结果。
HAVING有以下重要特点:
- HAVING用于对分组数据进行过滤,只返回满足条件的分组结果;
- HAVING条件可以包含聚合函数、比较运算符和逻辑运算符等;
- HAVING条件通常与GROUP BY子句一起使用。
以下是一个使用HAVING进行条件筛选的示例:
SELECT country, COUNT(*)
FROM customers
GROUP BY country
HAVING COUNT(*) > 100;
以上例子中,HAVING子句使用了一个条件:分组的数量大于100。只有满足此条件的分组才会被返回。
WHERE与HAVING的区别
- 使用位置不同:
WHERE子句通常出现在FROM子句之后,HAVING子句通常出现在GROUP BY子句之后。
- 作用对象不同:
WHERE子句作用于行数据,过滤符合条件的行;HAVING子句作用于分组数据,过滤符合条件的分组。
- 条件传递不同:
WHERE子句的条件在数据进行分组前筛选,即在分组聚合之前生效;HAVING子句的条件在数据完成分组后筛选,即在分组聚合之后生效。
要注意,当不使用GROUP BY子句时,WHERE和HAVING的作用是相同的。但在使用GROUP BY子句时,它们的差异就会显现出来。
总结: WHERE和HAVING都是用于筛选数据的关键字,但WHERE用于过滤行数据,HAVING用于过滤分组数据。它们的关键区别在于使用位置和作用对象不同。正确理解和使用WHERE和HAVING可以帮助我们更好地进行数据筛选与分析。
参考资料:
- https://dev.mysql.com/doc/refman/8.0/en/select.html
- https://dev.mysql.com/doc/refman/8.0/en/group-by.html
本文来自极简博客,作者:黑暗骑士酱,转载请注明原文链接:MySQL中的WHERE和HAVING的区别