本文章为 SQL Server 的详细学习大纲 里面的一个子章节的详细介绍,如果想了解相关的其他内容,可以从这里面查看,或者查看SQL Server专栏,里面有些文章可能并不在 SQL Server 的详细学习大纲 里面,是一些补充内容。
在 SQL Server 中,HAVING
子句和 WHERE
子句都用于筛选数据,但它们的作用场景和使用时机有所不同。下面详细介绍 HAVING
子句的作用,并与 WHERE
子句进行区分。
HAVING
子句的作用
HAVING
子句用于在使用 GROUP BY
子句对数据进行分组后,对分组结果进行条件筛选。它允许你指定筛选条件,只有满足这些条件的分组才会出现在最终的查询结果中。HAVING
子句通常与聚合函数(如 SUM
、COUNT
、AVG
、MAX
、MIN
等)一起使用。
基本语法
SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition -- 可选的行级筛选条件
GROUP BY column1
HAVING condition; -- 分组后的筛选条件
HAVING
子句示例
假设我们有一个 Orders
表,记录了客户的订单信息,表结构如下:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderAmount DECIMAL(10, 2)
);
INSERT INTO Orders (OrderID, CustomerID, OrderAmount) VALUES
(1, 1, 100.00),
(2, 1, 200.00),
(3, 2, 150.00),
(4, 2, 300.00),
(5, 3, 50.00);
现在我们要找出总订单金额大于 250 的客户。
SELECT CustomerID, SUM(OrderAmount) AS TotalAmount
FROM Orders
GROUP BY CustomerID
HAVING SUM(OrderAmount) > 250;
解释:
GROUP BY CustomerID
:按照CustomerID
对数据进行分组。SUM(OrderAmount)
:计算每个客户的总订单金额。HAVING SUM(OrderAmount) > 250
:对分组后的结果进行筛选,只保留总订单金额大于 250 的分组。
HAVING
子句与 WHERE
子句的区别
1. 作用对象不同
WHERE
子句:作用于行级数据,在数据分组之前对原始表中的行进行筛选。它不能使用聚合函数,因为聚合函数是在分组后才计算的。HAVING
子句:作用于分组后的数据,对分组结果进行筛选。它可以使用聚合函数,因为它是在分组操作之后执行的。
2. 使用时机不同
WHERE
子句:通常在GROUP BY
子句之前使用,用于过滤不需要参与分组的行。HAVING
子句:必须在GROUP BY
子句之后使用,用于筛选分组后的结果。
示例对比
假设我们要找出订单金额大于 80 的客户,并且这些客户的总订单金额大于 250。
使用 WHERE
子句进行行级筛选
SELECT CustomerID, SUM(OrderAmount) AS TotalAmount
FROM Orders
WHERE OrderAmount > 80 -- 行级筛选,只考虑订单金额大于 80 的行
GROUP BY CustomerID
HAVING SUM(OrderAmount) > 250; -- 分组后筛选,只保留总订单金额大于 250 的分组
只使用 HAVING
子句的情况
如果不使用 WHERE
子句进行行级筛选,直接使用 HAVING
子句,会对所有数据进行分组,然后再筛选分组结果。
SELECT CustomerID, SUM(OrderAmount) AS TotalAmount
FROM Orders
GROUP BY CustomerID
HAVING SUM(OrderAmount) > 250 AND MIN(OrderAmount) > 80; -- 这里使用 MIN 函数模拟行级筛选,但效率可能较低
通过上述示例可以看出,合理使用 WHERE
子句和 HAVING
子句可以提高查询效率,并且清晰地表达筛选条件。在实际应用中,通常先使用 WHERE
子句过滤不需要的行,再使用 GROUP BY
进行分组,最后使用 HAVING
子句对分组结果进行筛选。