在 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:结合 WHEREHAVING 子句

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 子句在处理分组聚合结果的筛选时非常有用,可以帮助我们更灵活地查询数据。