MySQL 中的 where 與 having
今天,我們將瞭解 MySQL 中的 WHERE 和 HAVING 子句之間的區別。我們將通過程式碼示例單獨理解這些子句,並以表格形式比較它們以突出差異。
MySQL 中的 WHERE 與 HAVING
WHERE 和 HAVING 子句非常相似。這些子句之間的主要區別在於它們與 GROUP BY 一起使用時。
我們不能對聚合資料使用 WHERE 子句,但可以使用 HAVING。
我們可以說 WHERE 在分組之前過濾了記錄(行),但 HAVING 子句排除了分組後的記錄(行)。
要繼續這篇文章,我們應該有一個表格。
因此,建立一個 transactions 表,其中包含名為 ID、Product、MonthOfTransaction 和 AmountInUSD 的四個屬性。
示例程式碼:
#create a table CREATE TABLE `ms20`.`transactions` ( `ID` INT NOT NULL AUTO_INCREMENT, `Product` VARCHAR(45) NOT NULL, `MonthOfTransaction` VARCHAR(20) NOT NULL, `AmountInUSD` INT NOT NULL, PRIMARY KEY (`ID`)); #insert data into a table INSERT INTO ms20.transactions(Product, MonthOfTransaction, AmountInUSD) VALUES ('Air Conditioner', 'January', 500), ('Television', 'January', 600), ('Refrigerator', 'January', 550), ('Television', 'March', 600), ('Air Conditioner', 'March', 500), ('Juicer Machine', 'March', 200); #select all data from the table SELECT * FROM ms20.transactions; 輸出:

MySQL 中的 WHERE 子句
在 MySQL 中,我們使用 WHERE 子句過濾記錄並僅提取那些滿足指定條件的行(記錄)。我們可以將它與 SELECT 語句和 UPDATE、INSERT 和 DELETE 命令一起使用。
WHERE 子句涉及在使用 JOIN 子句從單個或多個表中檢索記錄時放置在選定列上的特定條件。我們可以在 WHERE 子句中執行邏輯運算,例如 AND、NOT、OR。
我們也可以將它們稱為布林條件,在從表中檢索資訊時必須為真(也稱為關係)。這些邏輯運算子使用比較運算子,包括 <、>、<=、>=、= 和 <>。
示例程式碼:
SELECT Product, sum(AmountInUSD) AS Total FROM ms20.transactions WHERE Product in ( 'Television', 'Refrigerator') GROUP BY Product; 輸出:

MySQL 中的 HAVING 子句
在 MySQL 中,HAVING 子句與 GROUP BY 子句結合使用。使用此子句的目的是根據給定條件進行列操作並應用於聚合資料或組。
HAVING 子句僅返回滿足特定條件的組的結果。如果 WHERE 和 HAVING 子句一起使用,WHERE 過濾單個記錄(行)。
然後,記錄(行)被分組,執行聚合計算,最後,HAVING 過濾組。HAVING 子句檢查 GROUP BY 子句建立的組的條件。
在沒有 GROUP BY 子句的情況下,HAVING 子句的行為類似於 WHERE 子句。
我們還可以通過將 HAVING 子句與 SELECT 語句結合使用各種聚合函式。聚合(組)方法包括 SUM、MAX、MIN、COUNT 和 AVG。
我們可以很容易地將聚合函式與 HAVING 子句一起使用,而如果與 WHERE 子句一起使用,我們將收到一個錯誤,即組函式的無效使用。
示例程式碼(沒有聚合函式):
SELECT Product, sum(AmountInUSD) AS Total FROM ms20.transactions GROUP BY Product HAVING Product in ('Television', 'Refrigerator'); 輸出:

示例程式碼(帶有聚合函式):
SELECT Product, sum(AmountInUSD) AS Total FROM ms20.transactions GROUP BY Product HAVING sum(AmountInUSD) > 800; 輸出:

當我們在一個查詢中有多個子句時,瞭解執行順序很重要。我們必須記住順序 FWGHSOL(從 F 開始並在 L 結束)才能知道執行順序,其中 F = FROM,W = WHERE,G = GROUP BY,H = HAVING、S = SELECT、O = ORDER BY 和 L = LIMIT。
MySQL 中 WHERE 和 HAVING 子句之間的區別
在編寫查詢以運算元據時,我們必須考慮以下幾點。
WHERE 子句 | HAVING 子句 |
|---|---|
| 在行(記錄)操作中實現。 | 在列(屬性)操作中實現。 |
| 在聚合計算之前對各個行執行過濾操作。 | 對聚合(組)資料執行過濾操作。 |
| 從滿足給定條件的特定行中檢索特定資料。 | 首先檢索所有資料,然後根據指定條件進行分離。 |
| 我們不能在這個子句中使用聚合方法。 | 我們可以很容易地在這個子句中使用聚合方法。 |
它的行為類似於預過濾器,位於 GROUP BY 子句之前。 | 它的行為類似於後過濾器,位於 GROUP BY 子句之後。 |
它可以與 DELETE、SELECT 和 UPDATE 語句一起使用。 | 它只能與 SELECT 語句一起使用。 |
