HOWTO · MySQL

MySQL 中的 where 与 having

本教程使用代码示例分别介绍 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;

输出:

在哪里 vs 在 mysql 中 - 交易数据

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;

输出:

where vs have in mysql - where 子句输出

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');

输出:

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