MySQL WHERE 與 HAVING:使用計算列最佳化查詢
在 MySQL 資料庫操作中,WHERE
和 HAVING
子句的選擇會顯著影響處理計算列時的查詢效率。 了解它們的不同角色對於編寫最佳化的 SQL 至關重要。
計算列的策略放置
計算列,例如在 SELECT
語句中建立的列(例如 SELECT 1 AS "number"
),通常應遵循 HAVING
子句,而不是 WHERE
。 這是因為 WHERE
在任何計算或聚合之前過濾數據,而HAVING
在這些操作之後過濾數據。
WHERE 子句的限制
將 WHERE
與計算列一起使用通常會導致錯誤。 WHERE
條件必須引用現有的表列或別名;它不能直接對計算值進行操作。
WHERE 和 HAVING 之間的主要區別
WHERE
子句: 在 語句執行SELECT
之前過濾行。 條件可以套用於任何表格列,但不能應用於 SELECT
清單中定義的計算列。
HAVING
子句: 在套用 語句和聚合函數之後過濾行。 條件可以應用於選定的列、別名或聚合函數結果。 SELECT
效能注意事項
對於大型資料表,將計算列放在 子句中可能會導致計算成本高昂。 WHERE
在這些場景中提供了效能優勢,因為它在縮減的資料集(HAVING
語句的結果)上運行,最大限度地減少了不必要的行過濾。 SELECT
說明性範例
讓我們考慮一個範例表:
<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>
<code class="language-sql">INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);</code>
<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- Returns 5 rows SELECT `value` v FROM `table` HAVING `value`>5; -- Returns 5 rows</code>
揭示了一個關鍵的效能差異:EXPLAIN
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5; -- Uses index but scans more rows EXPLAIN SELECT `value` v FROM `table` HAVING `value`>5; -- Uses index efficiently, scans fewer rows</code>
掃描表的較大部分進行過濾,而 WHERE
在較小的預過濾子集上運行更有效。隨著資料集的增大,這種差異變得越來越明顯。 因此,對於計算列,HAVING
通常可以提供更好的效能。 HAVING
以上是MySQL 中的 WHERE 與 HAVING:何時應該對計算列使用每個子句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!