MySQL 查询中自定义列的位置:WHERE 与 HAVING
问题:
为什么必须将 SELECT 语句中创建的列放在 HAVING 子句之后,而不是 MySQL 中的 WHERE 子句之后?此外,使用 WHERE 1 代替指定列的完整定义是否有任何缺点?
答案:
虽然其他答案已经触及了这个主题,但关键的区别如下:
WHERE 子句:在选择之前过滤数据,允许使用任何表列。它不能使用别名或聚合函数。
HAVING 子句:在选择之后过滤数据,允许使用选定的列、别名或聚合函数。
位置:
自定义列应放在 HAVING 子句之后,因为:
效率:
对于过滤大型数据集,使用 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 过滤选择后的行。
结论:
以上是MySQL 查询:WHERE 与 HAVING – 何时应该对自定义列使用 HAVING?的详细内容。更多信息请关注PHP中文网其他相关文章!