首頁 >資料庫 >mysql教程 >MySQL 查詢:WHERE 與 HAVING – 何時應該對自訂列使用 HAVING?

MySQL 查詢:WHERE 與 HAVING – 何時應該對自訂列使用 HAVING?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-19 22:32:14615瀏覽

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