hive语句练习50题

本文提供了50道关于Hive SQL的查询题目,涵盖了课程成绩对比、平均分筛选、学生选课情况、教师授课关联、成绩排名与分布等多个方面,旨在帮助读者提升Hive查询技能。

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

数据:

student表
s_id s_name s_birth s_sex
01 赵雷 1990-01-01 男
02 钱电 1990-12-21 男
03 孙风 1990-05-20 男
04 李云 1990-08-06 男
05 周梅 1991-12-01 女
06 吴兰 1992-03-01 女
07 郑竹 1989-07-01 女
08 王菊 1990-01-20 女

course表
c_id c_course t_id
01    语文    02
02    数学    01
03    英语    03

teacher表
t_id t_name
01    张三
02    李四
03    王五


score表
s_id c_id s_score
01    01    80
01    02    90
01    03    99
02    01    70
02    02    60
02    03    80
03    01    80
03    02    80
03    03    80
04    01    50
04    02    30
04    03    20
05    01    76
05    02    87
06    01    31
06    03    34
07    02    89
07    03    98

题目:

##hive 50题 ##建表、加载数据: ################################################

create table if not exists student(
s_id int,
s_name string,
s_birth string,
s_sex string
)
row format delimited 
fields terminated by ' '
;
load data inpath '/user/yanqingz/data/student' into table student; 


create table if not exists course(
c_id int,
c_course string,
t_id int
)
row format delimited 
fields terminated by '\t'
;
load data inpath '/user/yanqingz/data/course' into table course ;

create table if not exists teacher(
t_id int,
t_name string
)
row format delimited 
fields terminated by '\t'
;
load data inpath '/user/yanqingz/data/teacher' into table teacher;


create table if not exists score(
s_id int,
c_id int,
s_score int
)
row format delimited 
fields terminated by '\t'
;
load data inpath '/user/yanqingz/data/score' into table score;

 

################################################

1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数:

select student.s_id,student.s_name,s1_score,s2_score from (
select s_id,s_score as s1_score from score where c_id = 01
)s1
join( 
select s_id,s_score as s2_score from score where c_id = 02  
)s2 on s1.s_id = s2.s_id
left join student on s1.s_id = student.s_id
where s1.s1_score > s2.s2_score

2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数:

select student.s_id,student.s_name,s1_score,s2_score from (
select s_id,s_score as s1_score from score where c_id = 01
)s1
 join( 
select s_id,s_score as s2_score from score where c_id = 02  
)s2 on s1.s_id = s2.s_id
left join student on s1.s_id = student.s_id
where s1.s1_score < s2.s2_score

 

3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩:

select score.s_id,student.s_name,avg(score.s_score) from score 
left join student on score.s_id = student.s_id
group by score.s_id,student.s_name
having avg(score.s_score) >= 60

 

4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩: (包括有成绩的和无成绩的)

select * from (
select student.s_id,student.s_name,
case when avg(score.s_score) is null then 0 
else  avg(score.s_score)
end as avgscore
from student 
left join score on  student.s_id = score.s_id
group by student.s_id,student.s_nam
### Hive SQL 练习题及答案 以下是关于Hive SQL的一些练习题目及其解答: #### 目 1: 查询参加了三门课程且其中一门为语文的学生ID和姓名 通过嵌套子查询的方式实现筛选条件。首先找到选修了语文课的学生,再统计这些学生总共参与的课程数量是否等于3。 ```sql SELECT s1.stu_id, s1.stu_name FROM ( SELECT stu_id FROM score_info WHERE stu_id IN ( SELECT stu_id FROM score_info WHERE course_id = ( SELECT course_id FROM course_info WHERE course_name = '语文' ) ) GROUP BY stu_id HAVING COUNT(score) = 3 ) s0 INNER JOIN student_info s1 ON s0.stu_id = s1.stu_id; ``` 此查询逻辑分为两部分:内部子查询用于过滤出选修过语文课程的学生;外部查询则进一步限定该学生的总课程数恰好为3[^2]。 --- #### 目 2: 基于访问日志表 `test2` 的分析 假设有一张记录用户访问行为的日志表 `test2`,其字段包括 `user_id` 和 `shop`。现在需要找出哪些用户的访问次数最多,并按降序排列。 ```sql SELECT user_id, COUNT(*) AS visit_count FROM test2 GROUP BY user_id ORDER BY visit_count DESC; ``` 上述语句利用聚合函数 `COUNT()` 来计算每位用户的访问频次,并按照频率高低排序显示结果[^3]。 --- #### 目 3: 找到只访问特定商店(如 `'b'` 店铺)的用户列表 为了获取仅访问某个指定商铺(比如 `'b'` 商店)而未涉足其他任何商铺的用户集合,可以采用差集操作完成这一目标。 ```sql SELECT DISTINCT t1.user_id FROM test2 t1 LEFT OUTER JOIN test2 t2 ON t1.user_id = t2.user_id AND t2.shop != 'b' WHERE t2.user_id IS NULL AND t1.shop = 'b'; ``` 这里的关键在于构建左外连接来对比同一用户的不同购物地点情况,最终保留那些完全局限于单一商铺的行为模式。 --- #### 目 4: 获取每家店铺对应的唯一访客数目 对于给定的数据结构而言,如果想了解各个商铺分别吸引了多少不同的顾客,则可执行如下指令: ```sql SELECT shop, COUNT(DISTINCT user_id) AS unique_visitors FROM test2 GROUP BY shop; ``` 这段脚本借助去重计数功能得出各商铺所吸引的独特客户群体规模信息。 --- #### 目 5: 查找同时访问两家不同店铺的所有用户 当试图识别既光顾过某些商铺又造访另一些商铺的人群时,可以通过自联接方法达成目的。 ```sql SELECT DISTINCT t1.user_id FROM test2 t1 JOIN test2 t2 ON t1.user_id = t2.user_id AND t1.shop <> t2.shop; ``` 在此处定义了一个交叉参照关系,在保证匹配项之间存在差异性的前提下提取符合条件的目标对象集合。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值