经典SQL50练习题Hive版

it2025-04-09  8

建表与数据导入

create database if not exists sql50; use sql50; //创建外部表(否则默认为内部表) 指定分隔符 create external table teacher(tid int,tname string) row format delimited fields terminated by '\t'; create external table student(sid int,sname string,sage string,ssex string)row format delimited fields terminated by '\t'; create external table sc(sid int,cid int,score int)partitioned by (month string)row format delimited fields terminated by '\t'; create external table course(cid int,cname string,tid int)row format delimited fields terminated by '\t'; load data local inpath '/export/sql50_data/student.csv' into table student; load data local inpath '/export/sql50_data/techer.csv' into table teacher; load data local inpath '/export/sql50_data/course.csv' into table course; load data local inpath '/export/sql50_data/score.csv' into table sc; 设置hive本地模式运行 set hive.exec.mode.local.auto=true;

student.csv

 

 

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 女

techer.csv

 

01  张三 02  李四 03  王五

course.csv

01  语文     02 02  数学     01 03  英语     03

score.csv

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

SQL

1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 SELECT s.*,sc1.score ,sc2.score FROM student s,sc sc1,sc sc2 WHERE s.sid=sc1.sid AND s.sid=sc2.sid AND sc1.cid='01' AND sc2.cid='02' AND sc1.score>sc2.score 需要考虑01与02课程不同时存在,适合用外连接,不适合使用内连接,因为内连接会去掉空值 SELECT * FROM student s LEFT JOIN sc sc1 ON s.sid=sc1.sid AND sc1.cid='01' LEFT JOIN sc sc2 ON s.sid=sc2.sid AND sc2.cid='02' WHERE nvl(sc1.score,0) > nvl(sc2.score,0) -- nvl(sc1.score,0) 如果 sc1.score 值为NULL就返回 0,否则返回 sc1.score 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 方式一 select sc.sid,avg(sc.score) avg from sc group by sc.sid having avg>=60 select s.sid,s.sname,a.avg from student s join (select sid,avg(sc.score) avg from sc group by sc.sid having avg>=60) a on s.sid = a.sid 方式二 select *,avg(score) over(partition by sid) avg from sc select sid,round(avg(score) over(partition by sid),2) avg from sc select distinct sid,round(avg(score) over(partition by sid),2) avg from sc select s.sid,s.sname,a.avg from student s,() a where s.sid=a.sid and a.avg>=60 select s.sid,s.sname,a.avg from student s,(select distinct sid,round(avg(score) over(partition by sid),2) avg from sc) a where s.sid=a.sid and a.avg>=60 select s.sid,s.sname,a.avg from student s,(select sid,avg from (select sid,round(avg(score) over(partition by sid),2) avg from sc )t group by t.sid,t.avg) a where s.sid=a.sid and a.avg>=60 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 select s.sid,s.sname,count(sc.cid),sum(sc.score) from student s join sc sc on s.sid=sc.sid group by s.sid ,s.sname select distinct sc.sid,count(sc.sid) over(partition by sc.sid),sum(sc.score) over(partition by sc.sid) from student s join sc sc on s.sid=sc.sid 6、查询"李"姓老师的数量 select count(*) from teacher t where t.tname like "李%" 7、查询学过"张三"老师授课的同学的信息 select * from sc sc join course c on sc.cid=c.cid join teacher t on c.tid=t.tid and t.tname="张三" 8、查询没学过"张三"老师授课的同学的信息 select sc.sid sid from sc sc join course c on sc.cid=c.cid join teacher t on c.tid=t.tid and t.tname="张三" select * from sc where sc.sid not in () select * from sc where sc.sid not in (select sc.sid sid from sc sc join course c on sc.cid=c.cid join teacher t on c.tid=t.tid and t.tname="张三") 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息 方式一 并行:利用学生ID相等关联两张表 然后分别给不同的条件 select * from sc sc1,sc sc2 where sc1.sid = sc2.sid and sc1.cid="01" and sc2.cid="02" select sc1.sid from sc sc1,sc sc2 where sc1.sid = sc2.sid and sc1.cid="01" and sc2.cid="02" select * from student s where s.sid in () select * from student s where s.sid in (select sc1.sid from sc sc1,sc sc2 where sc1.sid = sc2.sid and sc1.cid="01" and sc2.cid="02") 方式二 串行:先查出学过01课程的学生 然后到这个结果集中查学过02课程的学生 select sid from sc where sc.cid ="01" select * from sc sc,() a where sc.sid = a.sid and sc.cid="02" select * from sc sc,(select sid from sc where sc.cid ="01") a where sc.sid = a.sid and sc.cid="02" 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息 select sid from sc where sc.cid ="01" select sid from sc where sc.cid ="02" select sid from sc where sc.cid ="01" and sc.sid not in() select sid from sc where sc.cid ="01" and sc.sid not in(select sid from sc s where s.cid ="02") select sid from sc sc where sc.cid ="01" and not exists(select 1 from sc s where s.sid=sc.sid and s.cid ="02") hive 11、查询没有学全所有课程的同学的信息 在成绩表中查询课程总数小于总课程的同学 select sid from sc group by sc.sid having count(cid) <3 关联学生表 显示相关信息 方式一:in子查询 Total jobs = 3 number of mappers: 1; number of reducers: 1 Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 1 Hadoop job information for Stage-3: number of mappers: 1; number of reducers: 0 select * from student s where s.sid in () select * from student s where s.sid in (select sid from sc group by sc.sid having count(cid) <3) 方式二:join连接查询 Total jobs = 2 Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 1 Hadoop job information for Stage-3: number of mappers: 1; number of reducers: 0 select * from student s join () a on s.sid=a.sid select * from student s join (select sid from sc group by sc.sid having count(*) <3) a on s.sid=a.sid 方式三:where 提前 Total jobs = 1 Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 1 select s.sid from student s join sc sc where s.sid = sc.sid group by s.sid having count(sc.cid)<3 explain select s.sid from student s join sc sc where s.sid = sc.sid group by s.sid having count(sc.cid)<3 select * from (select sid,count(cid) count from sc group by sid) a , (select count(cid) count from course) b where a.count<b.count 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息 思路 1查询01号学生所学课程ID 2在成绩表中查找课程ID与学号为"01"的同学所学相同的同学的信息 1查询01号学生所学课程ID select cid from sc where sid='01' 2在成绩表中查找课程ID至少有一门课与学号为"01"的同学所学相同的同学的信息 select b.sid from sc b where cid in (select a.cid from sc a where a.sid='01') group by b.sid select * from student s join () c where s.sid=c.sid select * from student s join (select b.sid sid from sc b where b.cid in (select a.cid from sc a where a.sid='01') group by b.sid) c on s.sid=c.sid 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息 select sid,cid from sc where sid='01' select count(cid) count from sc where sid='01' select sid,cid from sc where sid!='01' select sid,count(cid) count from sc where sid!='01' group by sid select * from ()a join ()b on join ()c on join() d on select a.sid from (select sid,count(cid) count from sc where sid!='01' group by sid) a join (select count(cid) count from sc where sid='01') b on a.count =b.count join (select sid,cid from sc where sid!='01') c on a.sid=c.sid join(select sid,cid from sc where sid='01') d on c.cid=d.cid group by a.sid 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息 select sid,cid from sc where sid='01' select count(cid) count from sc where sid='01' select sid,cid from sc where sid!='01' select sid,count(cid) count from sc where sid!='01' group by sid select * from ()a join ()b on join ()c on join() d on select a.sid from (select sid,count(cid) count from sc where sid!='01' group by sid) a join (select count(cid) count from sc where sid='01') b on a.count =b.count join (select sid,cid from sc where sid!='01') c on a.sid=c.sid join(select sid,cid from sc where sid='01') d on c.cid=d.cid 14、查询没学过"张三"老师讲授的任一门课程的学生姓名 查询学过张三老师课程的学生ID select sc.sid from sc sc,course c ,teacher t where sc.cid = c.cid and c.tid = t.tid and t.tname ='张三' 查询没学过张三老师课程的学生 select s.* from student s where s.sid not in () select s.* from student s where s.sid not in (select sc.sid from sc sc,course c ,teacher t where sc.cid = c.cid and c.tid = t.tid and t.tname ='张三') 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 查询两门及其以上不及格课程的同学 查询满足上不条件的学生学号,姓名及其平均成绩 select s.sname,sc.sid,avg(sc.score) avg from student s,sc sc,(select sid from sc sc where sc.score<'60' group by sc.sid having count(sid) >= 2) a where s.sid =sc.sid and sc.sid=a.sid group by sc.sid,s.sname 16、检索"01"课程分数小于60,按分数降序排列的学生信息 检索"01"课程分数小于60的学生 显示相关学生信息 检索"01"课程分数小于60的学生 select * from sc s where s.cid ='01' and s.score < 60 order by s.score desc 显示相关学生信息 select * from student a join () b on a.sid = b.sid order by b.score desc select a.sid sid,a.sname name,b.score score from student a join (select s.sid sid,s.score score from sc s where s.cid ='01' and s.score < 60) b on a.sid = b.sid order by score desc\ 17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 select * from sc s join course c on s.cid = c.cid 列转行 语文 数学 英语 select s.sid sid , max(case when c.cname='语文' then s.score else null end) `语文`, max(case when c.cname='数学' then s.score else null end) `数学`, max(case when c.cname='英语' then s.score else null end) `英语`, avg(s.score) `平均成绩` from sc s join course c on s.cid = c.cid group by s.sid 18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 select * from sc s join course c on s.cid=c.cid group by s.cid select c.cid cid,c.cname name, max(s.score) max, min(s.score) min, avg(s.score) avg, sum(case when s.score>=60 then 1 else 0 end)/count(1) `及格率`, sum(case when s.score>=70 and s.score<80 then 1 else 0 end)/count(1) `中等率`, sum(case when s.score>=80 and s.score<90 then 1 else 0 end)/count(1) `优良率`, sum(case when s.score>=90 then 1 else 0 end)/count(1) `优秀率` from sc s join course c on s.cid=c.cid group by c.cid,c.cname select c.cid cid,c.cname name, max(s.score) max, min(s.score) min, bround(avg(s.score),2) avg, bround(sum(case when s.score>=60 then 1 else 0 end)/count(1)*100,2) `及格率`, bround(sum(case when s.score>=70 and s.score<80 then 1 else 0 end)/count(1)*100,2) `中等率`, bround(sum(case when s.score>=80 and s.score<90 then 1 else 0 end)/count(1)*100,2) `优良率`, bround(sum(case when s.score>=90 then 1 else 0 end)/count(1)*100,2) `优秀率` from sc s join course c on s.cid=c.cid group by c.cid,c.cname 19、按各科成绩进行排序,并显示排名 select b.cid id,b.cname name,a.score score, row_number() over(partition by a.cid order by a.score desc) rank from sc a join course b on a.cid = b.cid select b.cid id,b.cname name,a.score score, rank() over(partition by a.cid order by a.score desc) rank from sc a join course b on a.cid = b.cid select b.cid id,b.cname name,a.score score, dense_rank() over(partition by a.cid order by a.score desc) rank from sc a join course b on a.cid = b.cid 20、查询学生的总成绩并进行排名 计算总成绩 排名 计算总成绩 select a.sid sid,sum(a.score) tatal from sc a group by a.sid order by tatal desc 排名 select *,row_number() over(order by b.tatal desc) rank from () b select *,row_number() over(order by b.tatal desc) rank from (select a.sid sid,sum(a.score) tatal from sc a group by a.sid) b 21、查询不同老师所教不同课程平均分从高到低显示 select c.tname tname,b.cname cname,bround(avg(a.score) ,2) avg from sc a join course b on a.cid=b.cid join teacher c on b.tid = c.tid group by c.tname,b.cname 22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩 1产生排名 ==>t1 2查询第二名到第三名的成绩 ==>t2 3关联学生表,课程表与t2显示相关学生信息 1产生排名 使用窗口函数 ==>t1 select *,(row_number() over(partition by cid order by score desc)) rank from sc 2查询第二名到第三名的成绩 ==>t2 select * from () t1 where rank between 2 and 3 SELECT * FROM ( SELECT *,( row_number () over ( PARTITION BY cid ORDER BY score DESC )) rank FROM sc ) t1 WHERE rank BETWEEN 2 AND 3 3关联学生表,课程表与t2显示相关学生信息 SELECT s.sname, c.cname, t2.* FROM student s, course c,( SELECT * FROM ( SELECT *,( row_number () over ( PARTITION BY cid ORDER BY score DESC )) rank FROM sc ) t1 WHERE rank BETWEEN 2 AND 3 ) t2 WHERE s.sid = t2.sid AND c.cid = t2.cid ORDER BY t2.cid, t2.rank 23、统计各科成绩各分数段人数:课程编号,课程名称, 100-85 , 85-70 , 70-60 , 0-60 及所占百分比 思路 1.观察表结构需要新增多列,先统计各分段人数 2.再算出所占百分比 方式二(横向) 1.先统计各分段人数 select sc.* from sc group by sc.cid select *, sum(case when sc.score >= 85 then 1 else 0 end) `100-85` from sc group by sc.cid select sc.cid, sum(case when sc.score >= 85 then 1 else 0 end) `85-100`, sum(case when sc.score >= 70 and sc.score < 85 then 1 else 0 end) `70-85`, sum(case when sc.score >= 60 and sc.score < 70 then 1 else 0 end) `60-70`, sum(case when sc.score < 60 then 1 else 0 end) `0-60` from sc group by sc.cid select sc.cid `课程编号`,course.cname `课程名称`, sum(case when sc.score >= 85 then 1 else 0 end) `85-100人数`, sum(case when sc.score >= 70 and sc.score < 85 then 1 else 0 end) `70-85人数`, sum(case when sc.score >= 60 and sc.score < 70 then 1 else 0 end) `60-70人数`, sum(case when sc.score < 60 then 1 else 0 end) `0-60人数` from sc left join course on sc.cid = course.cid group by sc.cid,course.cname 2.再算出所占百分比 bround(DOUBLE a, INT d) Returns a rounded to d decimal places using HALF_EVEN rounding mode (as of Hive 1.3.0, 2.0.0). Example: bround(8.25, 1) = 8.2, bround(8.35, 1) = 8.4. 银行家舍入法,保留d位小数 bround(, 2) bround(sum(case when sc.score >= 70 and sc.score <= 85 then 1 else 0 end), 2) select sc.cid `课程编号`,course.cname `课程名称`, sum(case when sc.score >= 85 then 1 else 0 end) `85-100人数`, bround(sum(case when sc.score >= 85 then 1 else 0 end)/count(sc.score)*100, 2) `85-100百分比`, bround(sum(case when sc.score >= 70 and sc.score < 85 then 1 else 0 end), 2) `70-85人数`, bround(sum(case when sc.score >= 70 and sc.score < 85 then 1 else 0 end)/count(sc.score)*100, 2) `70-85百分比`, sum(case when sc.score >= 60 and sc.score < 70 then 1 else 0 end) `60-70人数`, bround(sum(case when sc.score >= 60 and sc.score < 70 then 1 else 0 end)/count(sc.score)*100, 2) `60-70百分比`, sum(case when sc.score < 60 then 1 else 0 end) `0-60人数`, bround(sum(case when sc.score < 60 then 1 else 0 end)/count(sc.score)*100, 2) `0-60百分比` from sc left join course on sc.cid = course.cid group by sc.cid,course.cname 24、查询学生平均成绩及其名次 1.统计平均成绩=>t1 2.排名 3.关联学生表,显示相关信息 1.统计平均成绩=>t1 select *,(avg(sc.score) over(partition by sc.sid)) avg from sc select sid,bround((avg(sc.score) over(partition by sc.sid)), 2) avg from sc 2.排名 select *,() rank from () t1 SELECT *,(row_number () over ( ORDER BY avg DESC )) rank FROM ( SELECT sid, bround (( avg( sc.score ) over ( PARTITION BY sc.sid )), 2 ) avg FROM sc ) t1 3.关联学生表,显示相关信息 SELECT s.sname NAME, t1.sid id, t1.avg, (row_number () over ( ORDER BY avg DESC )) rank FROM ( SELECT sid, bround (( avg( sc.score ) over ( PARTITION BY sc.sid )), 2 ) avg FROM sc ) t1 LEFT JOIN student s ON t1.sid = s.sid 25、查询各科成绩前三名的记录 思路 1排名 =>t1 2选出前三名 1排名 =>t1 select *,() rank from sc select *,(row_number() over(partition by sc.cid order by sc.score desc)) rank from sc 2选出前三名 select * from () t1 where t1.rank<=3 26、查询每门课程被选修的学生数 select *,count(sc.sid) over(partition by sc.cid) from sc 27、查询出只有两门课程的全部学生的学号和姓名 思路 1统计学生选课数量=>t1 2找出只有两门课的学生 3关联 1统计学生选课数量=>t1 select *,count(sc.sid) over(partition by sc.sid) amount from sc 2找出只有两门课的学生 select * from () t1 where t1.amount = 2 select * from (select *,count(sc.sid) over(partition by sc.sid) amount from sc) t1 where t1.amount = 2 3关联 select s.sid,s.sname from (select *,count(sc.sid) over(partition by sc.sid) amount from sc) t1 left join student s on t1.sid = s.sid and t1.amount = 2 -- left join会产生null值 改进 select s.sid,s.sname from (select *,count(sc.sid) over(partition by sc.sid) amount from sc) t1 inner join student s on t1.sid = s.sid and t1.amount = 2 28、查询男生、女生人数 -- 28、查询男生、女生人数 -- 横向 select () `男生人数`,() `女生人数` from student select sum(case when s.ssex='男' then 1 else 0 end) `男生人数`,sum(case when s.ssex='女' then 1 else 0 end) `女生人数` from student s -- 纵向 select () `性别`,() `人数` from student s select (case when s.ssex = '男' then '男' else '女' end) `性别`,count(s.ssex) `人数` from student s group by (case when s.ssex = '男' then '男' else '女' end) 29、查询名字中含有"风"字的学生信息 select * from student s where s.sname like '%风%' 30、查询同名同性学生名单,并统计同名人数 -- 这里的1代表第一列,2代表第二列 直接写列名效果也是一样的 -- GROUP BY 1,2 的意思是先按第一列分组 第一列相同再按第二列分组 两列都相同就在同一组 -- 同名同姓人数 SELECT sname,ssex,count(sname) FROM Student GROUP BY sname,ssex HAVING count(sname)>1; -- 同名人数 SELECT sname,count(sname) FROM Student GROUP BY sname HAVING count(sname)>1; 31、查询1990年出生的学生名单(注:Student表中Sage列的类型是string) SELECT Student.* FROM Student WHERE YEAR(sage)=1990; 32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 统计每门课的平均成绩 按平均成绩排序 select cid,avg(sc.score) avg from sc group by sc.cid order by avg desc,cid 33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 1统计每个学生的平均成绩 =>t1 2选出大于85的平均成绩 =>t2 3关联学生表,显示相关信息 1统计每个学生的平均成绩 =>t1 select sid,avg(sc.score) avg from sc group by sc.sid 2选出大于85的平均成绩 =>t2 select * from () t1 where t1.avg>=85 select * from (select sid,avg(sc.score) avg from sc group by sc.sid) t1 where t1.avg>=85 3关联学生表,显示相关信息 select * from () t2,student s where t2.sid = s.sid select s.sid,s.sname,t2.avg from (select * from (select sid,avg(sc.score) avg from sc group by sc.sid) t1 where t1.avg>=85) t2,student s where t2.sid = s.sid 34、查询课程名称为"数学",且分数低于60的学生姓名和分数 select s.sname,sc.score from course c,sc sc,student s where c.cid=sc.cid and sc.sid=s.sid and c.cname='数学' and sc.score < 60 35、查询所有学生的课程及分数情况; select s.sname,c.cname,sc.score from course c,sc sc,student s where c.cid=sc.cid and sc.sid=s.sid 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数; -- 如果将任何一门成绩在70分以上,理解为所有成绩在70分以上的话 思路 1.查出每个学生的最小的成绩 => t1 2.选出最小的成绩比70大的学生,那么此学生的所有成绩都大于70 => t2 3.关联其它表,显示相关信息 1.查出每个学生的最小的成绩 select sid,min(score) min_score from sc group by sid 2.选出最小的成绩比70大的学生,那么此学生的所有成绩都大于70 select sid from () t1 where t1.min_score>70 select sid from (select sid,min(score) min_score from sc group by sid) t1 where t1.min_score>70 3.关联其它表,显示相关信息 select * from student s,sc sc,course c,() t2 where s.sid =sc.sid and sc.cid =c.cid and sc.sid = t2.sid select s.sname `学生姓名`,c.cname `课程名`,sc.score `分数` from student s,sc sc,course c,(select sid from (select sid,min(score) min_score from sc group by sid) t1 where t1.min_score>70) t2 where s.sid =sc.sid and sc.cid =c.cid and sc.sid = t2.sid -- 如果将任何一门成绩在70分以上,理解为其中一门成绩在70分以上的话 思路 1.查出每个学生的最大的成绩 => t1 2.选出最大的成绩比70大的学生,那么此学生其中一门成绩大于70 => t2 3.关联其它表,显示相关信息 1.查出每个学生的最大的成绩 select sid,max(score) max_score from sc group by sid 2.选出最大的成绩比70大的学生,那么此学生其中一门成绩大于70 => t2 select sid from () t1 where t1.max_score>70 select sid from (select sid,max(score) max_score from sc group by sid) t1 where t1.max_score>70 3.关联其它表,显示相关信息 select * from student s,sc sc,course c,() t2 where s.sid =sc.sid and sc.cid =c.cid and sc.sid = t2.sid select s.sname `学生姓名`,c.cname `课程名`,sc.score `分数` from student s,sc sc,course c,(select sid from (select sid,max(score) max_score from sc group by sid) t1 where t1.max_score>70) t2 where s.sid =sc.sid and sc.cid =c.cid and sc.sid = t2.sid 37、查询不及格的课程 select * from sc where sc.score<60 38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名 select * from sc sc,student s where sc.sid=s.sid and sc.cid='01' and sc.score >= 80 39、求每门课程的学生人数 select count(sc.sid) from sc group by sc.cid 40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩 select *,max(sc.score) from sc sc,course c,teacher t where sc.cid=c.cid and c.tid=t.tid and t.tname='张三' group by t.tname -- Expression not in GROUP BY key sid select max(sc.score) from sc sc,course c,teacher t where sc.cid=c.cid and c.tid=t.tid and t.tname='张三' group by t.tname 41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 课程成绩去重后的课程数小于总课程数则不同课程存在相同成绩 select * from (select *,count(sc.score) count ,count(distinct sc.score) distinct_count from sc group by sc.sid) t1 where distinct_count<count Error: Error while compiling statement: FAILED: SemanticException [Error 10025]: Expression not in GROUP BY key cid select * from (select sc.sid,count(sc.score) count ,count(distinct sc.score) distinct_count from sc group by sc.sid) t1 where distinct_count<count 42、查询每门功成绩最好的前两名 select *,() rank from sc select *,(row_number() over(partition by sc.cid order by sc.score desc)) rank from sc select * from () t1 where t1.rank<3 select * from (select *,(row_number() over(partition by sc.cid order by sc.score desc)) rank from sc) t1 where t1.rank<3 43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 select sc.cid,count(sc.sid) count from sc group by sc.cid order by count desc,sc.cid select * from ()t1 where t1.count>5 select * from (select sc.cid,count(sc.sid) count from sc group by sc.cid order by count desc,sc.cid)t1 where t1.count>5 -- ref SELECT cid,count(1) count FROM SC GROUP BY cid HAVING count>=5 ORDER BY count desc,cid ; 44、检索至少选修两门课程的学生学号 select *,count(sc.cid) count from sc group by sc.sid select * from () t1 where t1.count>=2 select * from (select sc.sid,count(sc.cid) count from sc group by sc.sid) t1 where t1.count>=2 45、查询选修了全部课程的学生信息 select *,count(sc.cid) count from sc group by sc.sid select * from () t2,() t1 where t2.count=t1.count select * from (select *,count(sc.cid) count from sc group by sc.sid ) t2,(select count(c.cid) count from course c) t1 where t2.count=t1.count select * from (select sc.sid,count(sc.cid) count from sc group by sc.sid ) t2,(select count(c.cid) count from course c) t1 where t2.count=t1.count 46、查询各学生的年龄 SELECT Student.*,YEAR(current_date)-YEAR(Student.sage) FROM Student; 47、查询本周过生日的学生 SELECT * FROM Student WHERE WEEKOFYEAR(current_date)-WEEKOFYEAR(sage)=0; 48、查询下周过生日的学生 SELECT * FROM Student WHERE WEEKOFYEAR(current_date)-WEEKOFYEAR(sage)=-1; 49、查询本月过生日的学生 select * from student where month(current_date)-month(sage)=0; 50、查询下月过生日的学生 select * from student where month(current_date)-month(sage)=-1;

 

最新回复(0)