首页 >数据库 >mysql教程 >MySQL 查询:WHERE 与 HAVING – 何时应该对自定义列使用 HAVING?

MySQL 查询:WHERE 与 HAVING – 何时应该对自定义列使用 HAVING?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-19 22:32:14572浏览

MySQL Queries: WHERE vs. HAVING – When Should I Use HAVING for Custom Columns?

MySQL 查询中自定义列的位置:WHERE 与 HAVING

问题:

为什么必须将 SELECT 语句中创建的列放在 HAVING 子句之后,而不是 MySQL 中的 WHERE 子句之后?此外,使用 WHERE 1 代替指定列的完整定义是否有任何缺点?

答案:

虽然其他答案已经触及了这个主题,但关键的区别如下:

WHERE 子句:在选择之前过滤数据,允许使用任何表列。它不能使用别名或聚合函数。

HAVING 子句:在选择之后过滤数据,允许使用选定的列、别名或聚合函数。

位置:

自定义列应放在 HAVING 子句之后,因为:

  • HAVING 过滤选择后的结果数据,其中包括自定义列。
  • WHERE 过滤选择前的结果数据,不包括自定义列。

效率:

对于过滤大型数据集,使用 WHERE 子句效率更高,因为它会在执行选择之前消除不相关的行。

示例:

考虑以下表格:

<code class="language-sql">CREATE TABLE `table` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `value` int(10) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8</code>

包含 10 行数据,id 和 value 值从 1 到 10。

查询:

<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- 获取 5 行
SELECT `value` v FROM `table` HAVING `value`>5; -- 获取 5 行</code>

结果:

两个查询返回相同的结果,这表明 HAVING 子句可以在没有 GROUP BY 子句的情况下工作。

EXPLAIN:

<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
|  1 | SIMPLE      | table | range | value         | value | 4       | NULL |    5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+</code>
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` having `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
|  1 | SIMPLE      | table | index | NULL          | value | 4       | NULL |   10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+</code>

正如您所看到的,WHERE 和 HAVING 都使用了索引,但是返回的行数不同。WHERE 在选择之前过滤数据,减少行数,而 HAVING 过滤选择后的行。

结论:

  • 将自定义列放在 HAVING 子句之后以过滤选择的数据。
  • 使用 WHERE 子句通过排除不相关的行来有效地过滤大型数据集。

以上是MySQL 查询:WHERE 与 HAVING – 何时应该对自定义列使用 HAVING?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn