首頁 > 資料庫 > mysql教程 > MySQL 中的 WHERE 與 HAVING:何時應該對計算列使用每個子句?

MySQL 中的 WHERE 與 HAVING:何時應該對計算列使用每個子句?

Linda Hamilton
發布: 2025-01-19 22:42:09
原創
631 人瀏覽過

WHERE vs. HAVING in MySQL: When Should I Use Each Clause for Calculated Columns?

MySQL WHERE 與 HAVING:使用計算列最佳化查詢

在 MySQL 資料庫操作中,WHEREHAVING 子句的選擇會顯著影響處理計算列時的查詢效率。 了解它們的不同角色對於編寫最佳化的 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>
登入後複製
填滿十行(id 和值範圍從 1 到 10):

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板