SQL之where、hiving、group by的使用总结

SQL的执行先后顺序是:from、where 、join 、on、 group by、 having 、select 、distinct、 union、 order by、 limit

执行的过程解释:
from:将数据从硬盘加载到数据缓冲区,方便对接下来的数据进行操作。
where:从基表或视图中选择满足条件的元组。(不能使用聚合函数)
join:连接(如join、right join、left join)
on:连接条件join on实现多表连接查询,推荐该种方式进行多表查询,不使用子查询。
group by:分组,一般和聚合函数一起使用。
having:在元组的基础上进行筛选,选出符合条件的元组。(一般与group by进行连用)
select:查询到得所有元组需要罗列的哪些列。
distinct:去重的功能。
union:将多个查询结果合并(默认去掉重复的记录)。
order by:进行相应的排序。
limit:显示输出数据记录条数。(元组)

group by语句

GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。

ex:
##### 计算emp表每个部门的平均工资
hive (default)> select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;
##### 计算emp每个部门中每个岗位的最高薪水
hive (default)> select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.job;

Having语句

ex:求每个部门的平均薪水大于2000的部门
hive (default)> select deptno, avg(sal) avg_sal from emp where deptno IS NOT NULL group by deptno having avg_sal > 2000;
注:该出的执行顺序是,from将数据emp表数据从硬盘加载到数据缓冲区,然后执行where字句,此时不是对结果集进行过滤,这是直接操作的表(这也是为什么where子句后面不能跟聚合函数的原因),是直接拿着条件对原始表的数据进行过滤,聚合函数还没执行;
然后对返回的`结果集`进行分组操作:group by deptno,接着在每个组内执行聚合函数avg(sal) ,然后执行having过滤条件:avg_sal > 2000,最后才是执行select对结果集进行罗列。

having与where不同点

(1)where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
(2)where后面不能写分组函数,而having后面可以使用分组函数。
(3)having只用于group by分组统计语句。
posted @ 2021-01-19 21:57  Leo-Wong  阅读(1040)  评论(0编辑  收藏  举报