HAVING和WHERE子句 有什么区别?

举报
wljslmz 发表于 2024/08/02 23:33:37 2024/08/02
【摘要】 在 SQL 中,HAVING 和 WHERE 子句是用于筛选数据的重要工具。尽管它们都用于过滤数据,但它们在使用场景和应用时机上存在显著区别。 一、基本概念 1. WHERE 子句WHERE 子句用于从数据库表中筛选记录,它在 SQL 查询中指定条件,以过滤掉不满足条件的记录。WHERE 子句只能用于原始数据的过滤,即在聚合函数计算之前进行数据筛选。SELECT column1, colum...

在 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 子句用于在分组和聚合计算之后进行数据筛选。理解它们的区别和适用场景,可以帮助我们在实际工作中更有效地进行数据查询和分析。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。