MySQL 中的 where 與 having

Mehvish Ashiq 2023年1月30日 2022年5月13日
  1. MySQL 中的 WHEREHAVING
  2. MySQL 中的 WHERE 子句
  3. MySQL 中的 HAVING 子句
  4. MySQL 中 WHEREHAVING 子句之間的區別
MySQL 中的 where 與 having

今天,我們將瞭解 MySQL 中的 WHEREHAVING 子句之間的區別。我們將通過程式碼示例單獨理解這些子句,並以表格形式比較它們以突出差異。

MySQL 中的 WHEREHAVING

WHEREHAVING 子句非常相似。這些子句之間的主要區別在於它們與 GROUP BY 一起使用時。

我們不能對聚合資料使用 WHERE 子句,但可以使用 HAVING

我們可以說 WHERE 在分組之前過濾了記錄(行),但 HAVING 子句排除了分組後的記錄(行)。

要繼續這篇文章,我們應該有一個表格。

因此,建立一個 transactions 表,其中包含名為 IDProductMonthOfTransactionAmountInUSD 的四個屬性。

示例程式碼:

#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;

輸出:

在哪裡 vs 在 mysql 中 - 交易資料

MySQL 中的 WHERE 子句

在 MySQL 中,我們使用 WHERE 子句過濾記錄並僅提取那些滿足指定條件的行(記錄)。我們可以將它與 SELECT 語句和 UPDATEINSERTDELETE 命令一起使用。

WHERE 子句涉及在使用 JOIN 子句從單個或多個表中檢索記錄時放置在選定列上的特定條件。我們可以在 WHERE 子句中執行邏輯運算,例如 ANDNOTOR

我們也可以將它們稱為布林條件,在從表中檢索資訊時必須為(也稱為關係)。這些邏輯運算子使用比較運算子,包括 <><=>==<>

示例程式碼:

SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
WHERE Product in ( 'Television', 'Refrigerator')
GROUP BY Product;

輸出:

where vs have in mysql - where 子句輸出

MySQL 中的 HAVING 子句

在 MySQL 中,HAVING 子句與 GROUP BY 子句結合使用。使用此子句的目的是根據給定條件進行列操作並應用於聚合資料或組。

HAVING 子句僅返回滿足特定條件的組的結果。如果 WHEREHAVING 子句一起使用,WHERE 過濾單個記錄(行)。

然後,記錄(行)被分組,執行聚合計算,最後,HAVING 過濾組。HAVING 子句檢查 GROUP BY 子句建立的組的條件。

在沒有 GROUP BY 子句的情況下,HAVING 子句的行為類似於 WHERE 子句。

我們還可以通過將 HAVING 子句與 SELECT 語句結合使用各種聚合函式。聚合(組)方法包括 SUMMAXMINCOUNTAVG

我們可以很容易地將聚合函式與 HAVING 子句一起使用,而如果與 WHERE 子句一起使用,我們將收到一個錯誤,即組函式的無效使用

示例程式碼(沒有聚合函式):

SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
GROUP BY Product
HAVING Product in ('Television', 'Refrigerator');

輸出:

where vs have in mysql - having 子句輸出一

示例程式碼(帶有聚合函式):

SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
GROUP BY Product
HAVING sum(AmountInUSD) > 800;

輸出:

where vs have in mysql - having 子句輸出二

當我們在一個查詢中有多個子句時,瞭解執行順序很重要。我們必須記住順序 FWGHSOL(從 F 開始並在 L 結束)才能知道執行順序,其中 F = FROMW = WHEREG = GROUP BYH = HAVINGS = SELECTO = ORDER BYL = LIMIT

MySQL 中 WHEREHAVING 子句之間的區別

在編寫查詢以運算元據時,我們必須考慮以下幾點。

WHERE 子句 HAVING 子句
在行(記錄)操作中實現。 在列(屬性)操作中實現。
在聚合計算之前對各個行執行過濾操作。 對聚合(組)資料執行過濾操作。
從滿足給定條件的特定行中檢索特定資料。 首先檢索所有資料,然後根據指定條件進行分離。
我們不能在這個子句中使用聚合方法。 我們可以很容易地在這個子句中使用聚合方法。
它的行為類似於預過濾器,位於 GROUP BY 子句之前。 它的行為類似於後過濾器,位於 GROUP BY 子句之後。
它可以與 DELETESELECTUPDATE 語句一起使用。 它只能與 SELECT 語句一起使用。
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相關文章 - MySQL Query