Hive QL 50道挑战题第三部分详解

一.数据准备

---------------------表名和字段-----------------
--学生表
--Student(s_id,s_name,s_birth,s_sex) 学生编号,学生姓名, 出生年月,学生性别
--课程表
--Course(c_id,c_name,t_id) 课程编号, 课程名称, 教师编号
--教师表
--Teacher(t_id,t_name) 教师编号,教师姓名
--成绩表
--Score(s_id,c_id,s_score) 学生编号,课程编号,分数
​
​
create database if not exists exercise;
use exercise;
​
---------------------建表------------------
--学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`s_id` varchar(20),
`s_name` varchar(20),
`s_birth` varchar(20),
`s_sex` varchar(10)
)
row format delimited
fields terminated by ','
lines terminated by '\n';
load data local inpath './student.csv' into table student;
​
--课程表
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `c_id` varchar(20),
  `c_name` varchar(20),
  `t_id` varchar(20)
)
row format delimited
fields terminated by ','
lines terminated by '\n';
load data local inpath 'course.csv' into table course;
​
--教师表
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`(
`t_id` varchar(20),
`t_name` varchar(20)
)
row format delimited
fields terminated by ','
lines terminated by '\n';
load data local inpath 'teacher.csv' into table teacher;
​
--成绩表
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score`(
`s_id` varchar(20),
`c_id` varchar(20),
`s_score` int
)
row format delimited
fields terminated by ','
lines terminated by '\n';
load data local inpath 'score.csv' into table score;
​
​
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,女
09,张飞,1990-9-25,男
10,刘备,1990-01-25,男
11,关羽,1990-01-25,男
​
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
09,01,85
09,02,80
09,04,99
10,01,80
10,02,56
10,03,30
10,04,90
11,04,90
​
​
01,语文,02
02,数学,01
03,英语,03
04,物理,04
​
​
01,张三
02,李四
03,王五
04,赵六

二.练习题

19、按各科成绩进行排序,并显示排名

​
正确答案:使用排名函数 dense_rank()代表的是重复不间断
select
*,
dense_rank() over(distribute by c_id sort by s_score desc)
from score;
​
result:
09      01      85      1
10      01      80      2
03      01      80      2
01      01      80      2
05      01      76      3
02      01      70      4
04      01      50      5
06      01      31      6
01      02      90      1
07      02      89      2
05      02      87      3
09      02      80      4
03      02      80      4
02      02      60      5
10      02      56      6
04      02      30      7
01      03      99      1
07      03      98      2
03      03      80      3
02      03      80      3
06      03      34      4
10      03      30      5
04      03      20      6
09      04      99      1
10      04      90      2
11      04      90      2
​

20、查询学生的总成绩并进行排名

分析:
score: s_score s_id
student: s_name
​
select a.s_id,a.s_name,sum(s_score) total
from score b join student a on a.s_id = b.s_id  
group by a.s_id,a.s_name order by total;
​
result:
06      吴兰    65
11      关羽    90
04      李云    100
05      周梅    163
07      郑竹    187
02      钱电    210
03      孙风    240
10      刘备    256
09      张飞    264
01      赵雷    269
​
正确答案:
使用分组函数rank() 特点是不间断不重复 分数一样也分12名
select s_id,sum(s_score)
,rank() over(sort by sum(s_score) desc)
from score
group by s_id;
​
result:
01      269     1
09      264     2
10      256     3
03      240     4
02      210     5
07      187     6
05      163     7
04      100     8
11      90      9
06      65      10
​

21、查询不同老师所教不同课程平均分从高到低显示

分析:
score: a c_id
course: b.c_id
teacher:t_name
​
select
a.c_id,
b.c_name,
c.t_name,
round(avg(a.s_score),2) as avg_score 
from score a join course b on a.c_id = b.c_id 
join teacher c on b.t_id =c.t_id
group by a.c_id,b.c_name,c.t_name
order by avg_score desc;
​
result:
04      物理    赵六    93.0
02      数学    张三    71.5
01      语文    李四    69.0
03      英语    王五    63.0
​

22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比

24、查询学生平均成绩及其名次(学到hive再做)

25、查询各科成绩前三名的记录

26、查询每门课程被选修的学生数

select c_name,count(*) stunum
from score a left join course b on a.c_id = b.c_id
group by a.c_id,c_name;
​
rusult:
语文    8
数学    8
英语    7
物理    3
​

27、查询出只有两门课程的全部学生的学号和姓名

select a.S_id,a.s_name
from student a left join score b on a.s_id = b.s_id
group by a.s_id,a.s_name
having count(1)=2;
​
result:
05      周梅
06      吴兰
07      郑竹

28、查询男生、女生人数

select count(1) man
from student a
where s_sex='男'
union all
select count(1) man
from student b
where s_sex='女';
​
result:
7
4

29、查询名字中含有"风"字的学生信息

select s_id,s_name,s_birth,s_sex
from student 
where s_name like '%风%';
​
result:
03      孙风    1990-05-20      男

30、查询同名同性学生名单,并统计同名人数

分析:
student: a join b where a.s_name = b.s_name
​
select count(a.s_id),a.s_id
from student a join student b on a.s_name = b.s_name where a.s_id != b.s_id
group by a.s_id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值