HAVING 与 WHERE 效果类似,用于增加过滤条件,区别是:
位置 | 聚合函数 | 出现在 SELECT 字段 | |
---|---|---|---|
WHERE | GROUP BY 之前 | 不支持 | 无所谓 |
HAVING | GROUP BY 之后 | 支持 | 无所谓? |
感知上:
- WHERE 用于原表的筛选,在计算函数之前生效,因此不能处理聚合函数和别名。
- HAVING 用于查询结果的筛选,在计算函数之后生效,可以处理聚合函数和别名。
用法:
SELECT column_name,
aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
ORDER BY column_name
引用文章中说“HAVING 的字段必须出现在 SELECT 语句中”,对此存疑,或许是因为不同 HIVE 版本的实现不一样。
亲测:
SELECT company,
itemId,
count(itemName) AS countItemName,
collect_list(itemName) AS itemList FROM(
SELECT DISTINCT company_name AS company,
item_id AS itemId,
item_name AS itemName
FROM itemTable
HAVING city_name = '石家庄'
)
GROUP BY company,
itemId
HAVING count(itemName) > 1
- city_name 并未出现在内层 SELECT 语句中。
- 引擎报错:SQL_SYNTAX_ERROR(USER_ERROR): Expression ‘city_name’ is not being grouped.
- 但最终还是以 compatible mode 返回了结果,我没找到关于这个模式的说明,也没仔细对比差异在哪里。
结论是,推荐规范化使用 HAVING 语句。