HAVING和WHERE子句 有什么区别?

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 【8月更文挑战第2天】

在 SQL 中,HAVINGWHERE 子句是用于筛选数据的重要工具。尽管它们都用于过滤数据,但它们在使用场景和应用时机上存在显著区别。

一、基本概念

1. WHERE 子句

WHERE 子句用于从数据库表中筛选记录,它在 SQL 查询中指定条件,以过滤掉不满足条件的记录。WHERE 子句只能用于原始数据的过滤,即在聚合函数计算之前进行数据筛选。

SELECT column1, column2, ...
FROM table_name
WHERE condition;

2. HAVING 子句

HAVING 子句通常与 GROUP BY 子句一起使用,用于对分组后的数据进行过滤。它在聚合函数计算之后应用,以便根据聚合结果筛选分组。

SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;

二、使用场景和差异

1. 使用时机

  • WHERE 子句:在数据分组之前过滤数据。它用于在聚合函数计算之前筛选原始数据。
  • HAVING 子句:在数据分组之后过滤数据。它用于在聚合函数计算之后筛选分组结果。

2. 适用范围

  • WHERE 子句:可以用于任何非聚合的条件表达式。
  • HAVING 子句:可以用于任何条件表达式,包括聚合函数的结果。

3. 示例分析

以下示例通过一个名为 Sales 的表来说明 WHEREHAVING 子句的使用。假设 Sales 表的结构如下:

CREATE TABLE Sales (
    SaleID INT,
    Product VARCHAR(50),
    Quantity INT,
    Price DECIMAL(10, 2),
    SaleDate DATE
);

数据如下:

SaleID Product Quantity Price SaleDate
1 A 10 20.00 2023-01-01
2 B 5 15.00 2023-01-02
3 A 8 22.00 2023-01-03
4 C 12 10.00 2023-01-04
5 B 7 15.00 2023-01-05
示例 1:使用 WHERE 子句

我们想要查找销售日期在 2023 年 1 月 2 日之后的所有销售记录。

SELECT *
FROM Sales
WHERE SaleDate > '2023-01-02';

结果:

SaleID Product Quantity Price SaleDate
3 A 8 22.00 2023-01-03
4 C 12 10.00 2023-01-04
5 B 7 15.00 2023-01-05
示例 2:使用 HAVING 子句

我们想要查找每种产品的总销售量大于 15 的产品。

SELECT Product, SUM(Quantity) AS TotalQuantity
FROM Sales
GROUP BY Product
HAVING SUM(Quantity) > 15;

结果:

Product TotalQuantity
A 18
B 12

三、 WHERE 和 HAVING 的组合使用

在一些复杂查询中,我们可能需要同时使用 WHEREHAVING 子句。以下示例展示了如何结合使用这两个子句:

我们想要查找销售日期在 2023 年 1 月 2 日之后的所有销售记录中,每种产品的总销售量大于 10 的产品。

SELECT Product, SUM(Quantity) AS TotalQuantity
FROM Sales
WHERE SaleDate > '2023-01-02'
GROUP BY Product
HAVING SUM(Quantity) > 10;

结果:

Product TotalQuantity
A 8
C 12

在这个示例中,WHERE 子句首先过滤掉销售日期在 2023 年 1 月 2 日之前的记录,然后 HAVING 子句进一步筛选每种产品的总销售量大于 10 的分组。

四、 WHERE 和 HAVING 子句的执行顺序

理解 WHEREHAVING 子句的执行顺序有助于更好地应用它们:

  1. FROM:首先从指定的表中检索数据。
  2. WHERE:然后应用 WHERE 子句过滤记录。
  3. GROUP BY:接着对过滤后的记录进行分组。
  4. HAVING:之后应用 HAVING 子句对分组结果进行过滤。
  5. SELECT:最后返回满足条件的记录。

五、详细示例和应用

以下示例进一步说明 WHEREHAVING 子句在实际应用中的差异和结合使用。

示例 1:统计每种产品的总销售量和总收入,并过滤掉总销售量小于 10 的产品。

SELECT Product, SUM(Quantity) AS TotalQuantity, SUM(Quantity * Price) AS TotalRevenue
FROM Sales
GROUP BY Product
HAVING SUM(Quantity) >= 10;

结果:

Product TotalQuantity TotalRevenue
A 18 420.00
B 12 180.00

示例 2:统计销售日期在 2023 年 1 月 2 日之后的每种产品的总销售量和总收入,并过滤掉总销售量小于 10 的产品。

SELECT Product, SUM(Quantity) AS TotalQuantity, SUM(Quantity * Price) AS TotalRevenue
FROM Sales
WHERE SaleDate > '2023-01-02'
GROUP BY Product
HAVING SUM(Quantity) >= 10;

结果:

Product TotalQuantity TotalRevenue
C 12 120.00

示例 3:在包含子查询的复杂查询中使用 WHERE 和 HAVING

我们想要查找每种产品的平均销售价格,并筛选出平均价格高于 15 的产品,同时只考虑总销售量大于 10 的产品。

SELECT Product, AVG(Price) AS AvgPrice
FROM (
    SELECT Product, SUM(Quantity) AS TotalQuantity, AVG(Price) AS Price
    FROM Sales
    GROUP BY Product
    HAVING SUM(Quantity) > 10
) AS FilteredSales
GROUP BY Product
HAVING AVG(Price) > 15;

结果:

Product AvgPrice
A 21.00

在这个示例中,内部查询首先使用 HAVING 子句过滤出总销售量大于 10 的产品,然后外部查询计算这些产品的平均销售价格,并使用 HAVING 子句进一步筛选出平均价格高于 15 的产品。

六、总结

WHEREHAVING 子句在 SQL 查询中的使用有着显著的区别。WHERE 子句用于在数据分组和聚合计算之前进行数据筛选,而 HAVING 子句用于在分组和聚合计算之后进行数据筛选。理解它们的区别和适用场景,可以帮助我们在实际工作中更有效地进行数据查询和分析。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
17天前
|
SQL 数据库
|
3月前
|
SQL 关系型数据库 MySQL
常用的子句和关键字
常用的子句和关键字
|
4月前
|
SQL 前端开发 关系型数据库
MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
100 0
数据查询语句:包括SELECT语句、WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句等,用于从数据表中检索数据。
数据查询语句:包括SELECT语句、WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句等,用于从数据表中检索数据。
44 1
|
SQL 关系型数据库 MySQL
SQL进阶之子句、关键字和操作符
本实验带您学习SQL的子句、关键字和操作符等使用方法。
588 0
|
存储 索引
如何优化 WHERE 子句?
如何优化 WHERE 子句?
87 0
|
SQL 关系型数据库 MySQL
|
SQL 关系型数据库 MySQL
避免在where子句中使用 or 来连接条件
避免在where子句中使用 or 来连接条件
|
关系型数据库 MySQL 索引
避免在where子句中使用!=或<>操作符
避免在where子句中使用!=或<>操作符