迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > MySQL >

MySQL 中的 where 与 having

作者:迹忆客 最近更新:2023/03/13 浏览次数:

今天,我们将了解 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 子句之后。
它可以与 DELETE、SELECT 和 UPDATE 语句一起使用。 它只能与 SELECT 语句一起使用。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Mysqldump 备份 MySQL 中的数据

发布时间:2023/05/09 浏览次数:192 分类:MySQL

本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。

更新 MySQL 表中的主键

发布时间:2023/05/09 浏览次数:61 分类:MySQL

本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。

在 MySQL 中获取命令历史记录

发布时间:2023/05/09 浏览次数:150 分类:MySQL

本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史

Oracle 的 decode 函数在 MySQL 中的等价物

发布时间:2023/05/09 浏览次数:115 分类:MySQL

本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。

在 Linux 中安装 MySQL 客户端

发布时间:2023/05/09 浏览次数:72 分类:MySQL

在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。

在 MySQL 中转换为十进制

发布时间:2023/05/09 浏览次数:150 分类:MySQL

有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。

在 MySQL 中获取当前日期和时间

发布时间:2023/05/09 浏览次数:145 分类:MySQL

本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间

更改 MySQL 服务器中的 max_allowed_packet Size

发布时间:2023/05/09 浏览次数:142 分类:MySQL

本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便