一.建表和加载数据 1.student表 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 local inpath '/root/data.txt' into table student; 2.course表 create table if not exists course(c_id int,c_course string,t_id int) row format delimited fields terminated by ',' ; load data local inpath '/root/data.txt' into table course; 3.teacher表 create table if not exists teacher(t_id int,t_name string) row format delimited fields terminated by ',' ; load data local inpath '/root/data.txt' into table teacher; 4.score表 create table if not exists score(s_id int,c_id int, s_score DOUBLE) row format delimited fields terminated by ',' ; load data local inpath '/root/data.txt' into table score; 二.查询"01"课程比"02"课程成绩高的学生的信息及课程分数? 答案①: select stu.*,c.* from student stu join score a on a.c_id = '01' and a.s_id= stu.s_id left join score b on b.c_id = '02' and b.s_id= stu.s_id join score c on c.s_id= stu.s_id where a.s_score > b.s_score or b.s_score is null ; 答案②: select stu.*,c.* from student stu left join score a on a.c_id = '02' and a.s_id= stu.s_id join score b on b.c_id = '01' and b.s_id= stu.s_id join score c on c.s_id= stu.s_id where a.s_score < b.s_score or a.s_score is null ; 三.查询"01"课程比"02"课程成绩低的学生的信息及课程分数: 答案①: select stu.*,c.* from student stu join score a on a.c_id = '02' and a.s_id= stu.s_id left join score b on b.c_id = '01' and b.s_id= stu.s_id join score c on c.s_id= stu.s_id where a.s_score > b.s_score or b.s_score is null ; 答案②: select stu.*,c.* from student stu left join score a on a.c_id = '01' and a.s_id= stu.s_id join score b on b.c_id = '02' and b.s_id= stu.s_id join score c on c.s_id= stu.s_id where a.s_score < b.s_score or a.s_score is null ; 总结:对于二题和三题的查询连接的方法:谁大就把谁放在左边,谁小就把谁舍弃。 四.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩? 答案①: select a.s_id,stu.s_name,avg(a.s_score) as avgscore from score a join student stu on a.s_id = stu.s_id group by a.s_id,stu.s_name having avgscore >= 60 ; 答案②: select a.s_id,stu.s_name,avg(a.s_score)>=60 from score a join student stu on a.s_id = stu.s_id group by a.s_id,stu.s_name ; 五.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩? 答案①: select a.s_id,stu.s_name,avg(a.s_score) as avgscore from score a join student stu on a.s_id = stu.s_id group by a.s_id,stu.s_name having avgscore < 60 union all select stu.s_id,stu.s_name,NULL as avgscore from student stu left join score a on stu.s_id = a.s_id where a.s_score is null ; 六.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 答案: select stu.s_id,stu.s_name,count(sc.s_id) as totalSubjects,sum(sc.s_score) as sumScores from student stu left join score sc on stu.s_id=sc.s_id group by stu.s_id,stu.s_name; 七.查询"李"姓老师的数量? select count(1)from teacher where t_name like '李%'; 八.查询学过"张三"老师授课的同学的信息? select distinct stu.* from student stu join score sc on stu.s_id=sc.s_id join course co on sc.c_id=co.c_id join teacher te on co.t_id =te.t_id where te.t_name='张三'; 九.查询没学过"张三"老师授课的同学的信息? select * from student stu join teacher te on te.t_name='张三' join course co on te.t_id=co.t_id left join score sc on stu.s_id=sc.s_id and co.c_id=sc.c_id where sc.s_score is null; 十.查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息? select stu.*,sc.* from student stu,score sc,score sc1 where stu.s_id=sc.s_id and stu.s_id=sc1.s_id and sc.c_id=1 and sc1.c_id=2; 十一.查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息: select stu.* from student stu join score sc on sc.s_id =stu.s_id and sc.c_id = '01' where not exists (select 1 from score sc1 where sc1.c_id = '02' and stu.s_id = sc1.s_id) ; 十二.查询没有学全所有课程的同学的信息? select distinct stu.* from student stu join score sc left join course co on stu.s_id=sc.s_id and sc.c_id=co.c_id where sc.s_score is null; 十三.查询至少有一门课与学号为"01"的同学所学相同的同学的信息? select distinct stu.* from student stu join score sc on stu.s_id=sc.s_id where stu.s_id <> 1 and sc.c_id in (select c_id from score where s_id=1); 十四.查询和"01"号的同学学习的课程完全相同的其他同学的信息? select 十五.查询没学过"张三"老师讲授的任一门课程的学生姓名? select stu.* from student stu join teacher te on te.t_name = '张三' join course co on co.t_id = te.t_id left join score sc on sc.c_id = co.c_id and sc.s_id = stu.s_id where sc.s_score is null; 十六.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩? select * from student stu join score sc on sc.s_id = stu.s_id where sc.s_score < 60 ; 十七.检索"01"课程分数小于60,按分数降序排列的学生信息? select * from student stu join score sc on sc.s_id = stu.s_id where sc.c_id = 1 and sc.s_score < 60 order by sc.s_score desc; 十八.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩? select *, round(avg(sc.s_score) over(distribute by sc.s_id),2) as avg1 from score sc order by avg1 desc,sc.s_score desc; 总结:在这里啊,round是hive的内置函数,其功能是四舍五入。 十九..查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率: -- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90? select co.c_id, co.c_course, max(sc.s_score), min(sc.s_score), round(avg(sc.s_score),3), round(sum(case when sc.s_score >=60 then 1 else 0 end)/count(1) *100,3) as `及格率`, round(sum(case when sc.s_score between 70 and 79 then 1 else 0 end)/count(1) *100,3) as `中等率`, round(sum(case when sc.s_score between 80 and 89 then 1 else 0 end)/count(1) *100,3) as `优良率`, round(sum(case when sc.s_score>=90 then 1 else 0 end)/count(1) *100,3) as `优秀率` from score sc join course co on sc.c_id=co.c_id group by co.c_id,co.c_course; 二十.按各科成绩进行排序,并显示排名:– row_number() over()分组排序功能? select *, row_number() over(distribute by c_id sort by s_score desc) from score; 二十一.查询学生的总成绩并进行排名? select s_id,sum(s_score) as sumScores from score group by s_id order by sumScores desc; 二十二:查询不同老师所教不同课程平均分从高到低显示? select t_id,sc.c_id,round(avg(sc.s_score),2) as avgscore from score sc join course co on sc.c_id=co.c_id group by t_id,sc.c_id order by t_id,avgscore desc; 二十三.查询所有课程的成绩第2名到第3名的学生信息及该课程成绩? select * from ( select *, row_number() over(distribute by c_id sort by s_score desc) as rm from score ) a where a.rm between 2 and 3; 二十四.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比? select c_id, sum(case when s_score>=85 then 1 else 0 end) as 85score, sum(case when s_score between 70 and 84 then 1 else 0 end) as 70score, sum(case when s_score between 60 and 69 then 1 else 0 end) as 60score, sum(case when s_score<60 then 1 else 0 end) as 0score, count(1) as totalscore from score group by c_id; 二十五.查询学生平均成绩及其名次? select *, row_number() over(sort by a.avgscore desc) as rm from ( select s_id,round(avg(s_score),2) as avgscore from score group by s_id) a; 二十六.查询各科成绩前三名的记录三个语句? select * from ( select *, row_number() over(distribute by c_id sort by s_score desc) as rm, rank() over(distribute by c_id sort by s_score desc) as rk, dense_rank() over(distribute by c_id sort by s_score desc) as drk from score) a where a.rm<4; 二十七.查询每门课程被选修的学生数? select c_id,count(1) as `学生人数` from score group by c_id; 二十八.查询出只有两门课程的全部学生的学号和姓名? select stu.s_id,stu.s_name from student stu join score sc on sc.s_id=stu.s_id group by stu.s_id,stu.s_name having count(1)=2; 二十九.查询男生、女生人数? select s_sex,count(1) as totalstu from student group by s_sex; 三十.查询名字中含有"风"字的学生信息? select * from student where s_name like '%风%' ; 三十一.查询同名同性学生名单,并统计同名人数? select s_name,s_sex,count(1) as totalstu from student group by s_name,s_sex having totalstu>1; 三十二.查询1990年出生的学生名单? select * from student where s_birth like '1990%'; select * from student where substr(s_birth,0,4)='1990'; 三十三.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列? select c_id,round(avg(s_score),2) as avgscore from score group by c_id order by avgscore desc,c_id asc; 三十四:查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩? select stu.s_name,avg(sc.s_score) as avgscore from student stu join score sc on stu.s_id=sc.s_id group by stu.s_id,stu.s_name having avgscore>85; 三十五:查询课程名称为"数学",且分数低于60的学生姓名和分数? select stu.s_name,sc.s_score from student stu join score sc on stu.s_id=sc.s_id join course co on sc.c_id=co.c_id and co.c_course='数学' where sc.s_score<60; 三十六:查询所有学生的课程及分数情况? select * from student stu join score sc on stu.s_id=sc.s_id right join course co on sc.c_id=co.c_id ; 三十七:查询任何一门课程成绩在70分以上的学生姓名、课程名称和分数? select stu.s_name,co.c_course,sc.s_score from student stu join score sc on stu.s_id=sc.s_id join course co on sc.c_id=co.c_id group by stu.s_id,stu.s_name,co.c_course,sc.s_score having min(sc.s_score)>=70; 三十八:查询课程不及格的学生? select stu.* from student stu join score sc on stu.s_id=sc.s_id where sc.s_score<60; 三十九:查询课程编号为01且课程成绩在80分以上的学生的学号和姓名? select stu.s_id,stu.s_name,sc.c_id,sc.s_score from student stu join score sc on stu.s_id=sc.s_id where c_id=1 and s_score>=80; 四十:每门课程的学生人数? select sc.c_id,co.c_course,count(1) as stunum from score sc join course co on sc.c_id=co.c_id group by sc.c_id,co.c_course; 四十一:查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩? select * from ( select dense_rank() over(distribute by sc.c_id sort by sc.s_score desc) drk from score sc join course co on sc.c_id=co.c_id join teacher te on co.t_id=te.t_id where te.t_name='张三') aa where aa.drk=1; 四十二:查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩? ①select distinct sc.s_id,sc.c_id,sc.s_score from score sc,score sc1 where sc.c_id<>sc1.c_id and sc.s_score=sc1.s_score and sc.s_id=sc1.s_id; ②select distinct sc.s_id,sc.c_id,sc.s_score from score sc,score sc1 where sc.c_id !=sc1.c_id and sc.s_score=sc1.s_score and sc.s_id=sc1.s_id; 四十三:查询每门课程成绩最好的前三名? select * from (select *, row_number() over(distribute by c_id sort by s_score desc) rn from score) aa where aa.rn<=3; 四十四:统计每门课程的学生选修人数(超过5人的课程才统计)? select c_id,count(*) as stunum from score group by c_id having stunum>5 order by c_id asc,stunum desc; 四十五:检索至少选修两门课程的学生学号? select s_id,count(1) as coursenum from score group by s_id having coursenum >=2; 四十六:查询选修了全部课程的学生信息? select stu.s_id,stu.s_name from student stu join score sc on stu.s_id=sc.s_id left join course co on sc.c_id=co.c_id group by stu.s_id,stu.s_name having sum(case when sc.s_score is null then 1 else 0 end)=0; 四十七:查询各学生的年龄(周岁)? select s_birth, year(current_date())-year(s_birth)- (case when month(current_date())>month(s_birth) then 0 when month(current_date())=month(s_birth) and day(current_date())>=day(s_birth) then 0 else 1 end) from student; 四十八:查询本周过生日的学生? select * from student where weekofyear(s_birth)=weekofyear(current_date()); 四十九:查询下周过生日的学生? select * from student where weekofyear(s_birth)=weekofyear(current_date())+1; 四十九:查询上周过生日的学生? select * from student where weekofyear(s_birth)=weekofyear(current_date())-1; 五十:查询本月过生日的学生? select * from student where month(s_birth)=month(current_date()); 五十:查询上月过生日的学生? select * from student where month(s_birth)=month(current_date())-1; 五十:查询下月过生日的学生? select * from student where month(s_birth)=month(current_date())+1; 五十一:查询12月份过生日的学生? ①select * from student where month(s_birth)=12; ②select * from student where substring(s_birth,4,2)=12;
本文来自博客园,作者:大码王,转载请注明原文链接:https://www.cnblogs.com/huanghanyu/
分类:
离线数据仓库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具