在 Hive SQL 中,HAVING
子句用于在分组聚合操作之后对分组结果进行筛选。它和 WHERE
子句有些类似,但作用时机和使用场景不同。下面详细介绍 HAVING
子句的相关内容。
基本语法
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
- SELECT
:指定要查询的列,可以包含分组列和聚合函数。
- FROM
:指定要查询的表。
- GROUP BY
:对结果集进行分组操作。
- HAVING
:对分组后的结果进行筛选,只返回满足 condition
的分组。
与 WHERE
子句的区别
-
作用时机:
WHERE
子句在分组操作之前对行进行筛选,而HAVING
子句在分组操作之后对分组结果进行筛选。 -
使用限制:
WHERE
子句不能使用聚合函数,而HAVING
子句可以使用聚合函数。
示例
假设有一个名为 sales
的表,包含 product_name
(产品名称)和 sales_amount
(销售金额)两列,示例数据如下:
-- 创建示例表
CREATE TABLE sales (
product_name STRING,
sales_amount DOUBLE
);
-- 插入示例数据
INSERT INTO sales VALUES
('Product A', 100.0),
('Product B', 200.0),
('Product A', 150.0),
('Product C', 300.0),
('Product B', 250.0);
示例 1:筛选分组后的销售总额大于 300 的产品
SELECT product_name, SUM(sales_amount) as total_sales
FROM sales
GROUP BY product_name
HAVING SUM(sales_amount) > 300;
解释:
- 首先使用
GROUP BY product_name
对产品进行分组。 - 然后使用
SUM(sales_amount)
计算每个产品的销售总额。 - 最后使用
HAVING
子句筛选出销售总额大于 300 的产品。
示例 2:结合 WHERE
和 HAVING
子句
SELECT product_name, SUM(sales_amount) as total_sales
FROM sales
WHERE sales_amount > 100 -- 先筛选出销售金额大于 100 的记录
GROUP BY product_name
HAVING SUM(sales_amount) > 400; -- 再筛选出分组后的销售总额大于 400 的产品
解释:
WHERE
子句在分组之前筛选出销售金额大于 100 的记录。GROUP BY
对筛选后的记录按产品名称进行分组。HAVING
子句在分组之后筛选出销售总额大于 400 的产品。
通过以上示例可以看出,HAVING
子句在处理分组聚合结果的筛选时非常有用,可以帮助我们更灵活地查询数据。