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 語句一起使用。 |