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中文網其他相關文章!