group by+having

本文介绍了在Hive SQL中使用group by进行数据分组的不同方法,包括结合having子句进行条件过滤、嵌套子查询实现同样的目标,并解释了having与where子句的区别及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

对group by语句产生分组结果进行条件过滤方式:

 

1 group by + having

 

hive> select year, avg(price) from stocks  where exchange='nasddaq' group by year having avg(price)>50;

 

 

2 group by + 嵌套子查询

 

hive> select s2.year. s2.avg from

(select year as year , avg(price) as avg from stocks where  exchange='nasddaq' group by year) s2

where  s2.avg > 50;

 

 

 

3  group by 介绍:

 

a) select后要查询的列中,如果列没有使用聚合函数,则对应的列必须出现在 group by后

b) 基于上一条,select后的列经常要和聚合函数搭配使用

 

eg: select A,count(B) as 数量 from table group by A

错误写法: select A,B from table group by A  原因就是列B没有使用聚合函数下也没有出现在group by后。

 

 

4 having 和 where的区别:

 

where: 用于分组之前对数据进行过滤,这样过滤后的数据在进行分组,条件中不能含有聚合函数,where是map阶段的过滤数据条件

having: 分组之后来过滤数据,条件中经常包含聚合函数,是reduce阶段过滤数据条件

 

通常 group by和having是必然绑定出现的,为分组过滤做筛选的,

而 where是将所有未分组数据进行行过滤

having后的筛选条件一般都是 select后面出现的聚合函数或者列,如下, having的筛选就是前面select中出现的聚合函数。

SELECT A, COUNT(B) FROM stu GROUP BY A HAVING COUNT(B)>2

 

 

 

 

### SQL 查询性能对比:`GROUP BY` 结合 `WHERE` 和 `GROUP BY` 结合 `HAVING` #### 使用 `GROUP BY` 和 `WHERE` 的查询 当使用 `GROUP BY` 和 `WHERE` 组合时,`WHERE` 子句用于过滤行数据,在分组操作之前执行。这意味着只有满足条件的数据会被考虑进入后续的聚合计算。 ```sql SELECT department, COUNT(*) AS employee_count FROM employees WHERE salary > 50000 GROUP BY department; ``` 此查询会先筛选出工资大于 50000 的员工记录,再按部门进行统计汇总[^1]。 #### 使用 `GROUP BY` 和 `HAVING` 的查询 而 `GROUP BY` 和 `HAVING` 的组合则是在完成分组之后才应用条件来进一步筛选结果集。因此,`HAVING` 可以基于聚合函数的结果施约束。 ```sql SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 50000; ``` 这段代码将返回平均薪资超过 50000 的各个部门及其对应的平均薪资值。 #### 性能考量因素 对于这两种方式的选择取决于具体的应用场景: - 如果可以提前通过简单条件排除大量不必要参与运算的数据,则应优先采用 `WHERE` 来提高效率; - 当需要依据聚合后的特性做更复杂的判断时,则需依赖于 `HAVING` 进行二次过滤; 另外值得注意的是,SQL Server 的优化器能够自动调整某些情况下语句的实际执行顺序以达到最佳效果,但这并不意味着开发者无需关注逻辑上的先后次序[^2]。 为了验证具体的性能差异,可以通过设置 `SET STATISTICS TIME ON;` 或者利用图形化工具查看实际产生的执行计划来进行分析比较。不过需要注意的是,测试环境应当尽可能模拟生产环境中相似的工作负载情况以便获得可靠结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值