HiveSQL基础练习题

news2025/1/10 11:46:15

HiveSQL基础练习题

    • 1.环境准备
      • 1.1建表语句
      • 1.2数据准备
      • 1.3插入数据
    • 2.查询
      • 2.1 查询姓名中带“华”的学生名单
      • 2.2 查询姓“王”老师的个数
      • 2.3 检索课程编号为“04”且分数小于60的学生学号,结果按分数降序排列
      • 2.4 查询语文成绩 < 90分的学生和其对应的成绩,按照学号升序排序
      • 2.5 查询各学生的年龄(精确到月份)
      • 2.6 查询本月过生日的学生
      • 2.7 查询课程编号为“04”的总成绩
      • 2.8 查询参加考试的学生个数
      • 2.9 查询各科成绩最高和最低的分,以如下的形式显示:课程号,最高分,最低分
      • 2.10 查询每门课程有多少学生参加了考试(有考试成绩)
      • 2.11 查询男生、女生人数
      • 2.12 查询平均成绩大于60分学生的学号和平均成绩
      • 2.13 查询至少选修两门课程的学生学号
      • 2.14 统计同姓(假设每个学生姓名的第一个字为姓)的学生人数
      • 2.15查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
      • 2.16 统计参加考试人数大于等于15的学科
      • 2.17 查询学生的总成绩并进行排名
      • 2.18 查询平均成绩大于60分的学生的学号和平均成绩
      • 2.19 按照如下格式显示学生的语文、数学、英语三科成绩,没有成绩的输出为0,按照学生的有效平均成绩降序显示
      • 2.20查询一共参加两门课程且其中一门为语文课程的学生的id和姓名
      • 2.21查询所有课程成绩小于60分学生的学号、姓名
      • 2.22查询没有学全所有课的学生的学号、姓名
      • 2.23查询出只选修了两门课程的全部学生的学号和姓名
      • 2.24查找1995年出生的学生名单
      • 2.25查询两门以上不及格课程的同学的学号及其平均成绩
      • 2.26 查询所有学生的学号、姓名、选课数、总成绩
      • 2.27查询平均成绩大于85的所有学生的学号、姓名和平均成绩
      • 2.28查询学生的选课情况:学号,姓名,课程号,课程名称
      • 2.29查询出每门课程的及格人数和不及格人数
      • 2.30 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
      • 2.31 查询课程编号为03且课程成绩在80分以上的学生的学号和姓名
      • 2.32 (重要!行转列)使用sql实现将该表行转列为下面的表结构
      • 2.33 检索"01"课程分数小于60,按分数降序排列的学生信息
      • 2.34 查询任何一门课程成绩在70分以上的学生的姓名、课程名称和分数
      • 2.35 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
      • 2.36 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
      • 2.37 查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号
      • 2.38 查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名
      • 2.39 查询学过“李体音”老师所教的所有课的同学的学号、姓名
      • 2.40 查询学过“李体音”老师所讲授的任意一门课程的学生的学号、姓名
      • 2.41 查询没学过"李体音"老师讲授的任一门课程的学生id及其学生姓名
      • 2.42 查询选修“李体音”老师所授课程的学生中成绩最高的学生姓名及其成绩
      • 2.43 查询至少有一门课与学号为“001”的学生所学课程相同的学生的学号和姓名
      • 2.44 查询所学课程与学号为“001”的学生所学课程完全相同的学生的学号和姓名
      • 2.45 查询学过与学号为“001”的学生全部所学课程的学生的学号和姓名
      • 2.46 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
      • 2.47 查询每个学生的学生平均成绩及其名次
      • 2.48 按各科成绩进行排序,并显示在这个学科中的排名
      • 2.49 查询每门课程成绩最好的前两名学生姓名及成绩
      • 2.50 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
      • 2.51 查询各科成绩前三名的记录(如果有并列,则全部展示,例如如果前7名为:80,80,80,79,79,77,75,70,则统计结果为数字的前三名,结果为80,80,80,79,79,77)

题目来自于尚硅谷,笔者自己写的 SQL,不保证全部正确

1.环境准备

1.1建表语句

create database if not exists db_hive;
use db_hive;

--创建学生表
drop table if exists student;
create table if not exists student(
	stu_id string COMMENT '学生id',
	stu_name string COMMENT '学生姓名',
	birthday date COMMENT '出生日期',
	sex string COMMENT '性别'
)
row format delimited fields terminated by ','
stored as textfile;

--创建课程表
drop table if exists course;
create table if not exists course(
	course_id string COMMENT '课程id',
	course_name string COMMENT '课程名',
	tea_id string COMMENT '任课老师id'
)
row format delimited fields terminated by ','
stored as textfile;

--创建老师表
drop table if exists teacher;
create table if not exists teacher(
	tea_id string COMMENT '老师id',
	tea_name string COMMENT '老师姓名'
)
row format delimited fields terminated by ','
stored as textfile;

--创建分数表
drop table if exists score;
create table if not exists score(
	stu_id string COMMENT '学生id',
	course_id string COMMENT '课程id',
	grade int COMMENT '成绩'
)
row format delimited fields terminated by ','
stored as textfile;

1.2数据准备

  • 创建/opt/module/data目录,将如下4个文件放到/opt/module/data目录下
    以下是部分数据(自己准备数据)
[hyj@hadoop102 data]$ cat student.txt 
001,彭于晏,1995-05-16,002,胡歌,1994-03-20,003,周杰伦,1995-04-30,004,刘德华,1998-08-28,005,唐国强,1993-09-10,[hyj@hadoop102 data]$ cat course.txt 
01,语文,1003
02,数学,1001
03,英语,1004
04,体育,1002
05,音乐,1002
[hyj@hadoop102 data]$ cat teacher.txt 
1001,张高数
1002,李体音
1003,王子文
1004,刘丽英
[hyj@hadoop102 data]$ cat score.txt 
001,01,94
002,01,74
004,01,85
005,01,64
006,01,71
007,01,48
008,01,56
009,01,75

1.3插入数据

  1. 向表中加载数据
load data local inpath '/opt/module/data/student.txt' into table student;

load data local inpath '/opt/module/data/course.txt' into table course;

load data local inpath '/opt/module/data/teacher.txt' into table teacher;

load data local inpath '/opt/module/data/score.txt' into table score;
  1. 验证插入数据情况
select * from student limit 5;
select * from course limit 5;
select * from teacher limit 5;
select * from score limit 5;

2.查询

2.1 查询姓名中带“华”的学生名单

%代表任意个字符(0个或多个)
-代表一个字符

select * from student where stu_name like '%华%';

2.2 查询姓“王”老师的个数

select count(*) from teacher where tea_name like '王%';

2.3 检索课程编号为“04”且分数小于60的学生学号,结果按分数降序排列

select stu_id from score where course_id='04' and grade < 60 order by grade desc;

2.4 查询语文成绩 < 90分的学生和其对应的成绩,按照学号升序排序

select s2.stu_id,s2.stu_name,s1.grade from course c,score s1,student s2 where c.course_id=s1.course_id 
	and c.course_name="语文" and s1.stu_id=s2.stu_id and s1.grade < 90 order by s2.stu_id;

2.5 查询各学生的年龄(精确到月份)

  1. 获取年份
    select year(‘2023-05-21’);
  2. 获取当前日期
    select current_date();
  3. 获取月份
    select month(‘2023-05-21’);
  4. if条件判断: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
select 
	stu_name, 
	concat(
		if(bir_year>=0,bir_year,bir_year-1),'岁',
		if(bir_month>=0,bir_month,bir_month+12),'个月'
	) as age
from (
	select 
		stu_name,
		year(current_date())-year(birthday) bir_year,
		month(current_date())-month(birthday) bir_month 	
	from student
) t;

2.6 查询本月过生日的学生

select * from student where month(birthday)=month(current_date());

2.7 查询课程编号为“04”的总成绩

方法一:
select '04' as course_id,sum(grade) as grade_sum from score where course_id='04';

方法二:
select course_id,sum(grade) as grade_sum from score where course_id='04' group by course_id;

2.8 查询参加考试的学生个数

思路:对成绩表中的学号做去重并count

select count(distinct(stu_id)) from score;
--或
select count(*) from (select distinct(stu_id) from score) t; 

2.9 查询各科成绩最高和最低的分,以如下的形式显示:课程号,最高分,最低分

思路:按照学科分组并使用max和min。

select course_id,max(grade),min(grade) from score group by course_id;

2.10 查询每门课程有多少学生参加了考试(有考试成绩)

select course_id,count(*) from score group by course_id;

2.11 查询男生、女生人数

select sex,count(*) from student group by sex;

2.12 查询平均成绩大于60分学生的学号和平均成绩

select stu_id,avg(grade) avg_grade from score group by stu_id having avg_grade>60;

2.13 查询至少选修两门课程的学生学号

select stu_id,count(distinct course_id) course_num from score group by stu_id having course_num>=2;

2.14 统计同姓(假设每个学生姓名的第一个字为姓)的学生人数

思路:先提取出每个学生的姓并分组,如果分组的count>=2则为同姓

substring(str, pos[, len])
如:substring(“hellohive”,2,3) 从2位置开始截取3长度
注意:下标是从1开始的.

select first_stu_name,
	   count(*) as count_first_stu_name 
from (
	   select 
	  		substring(stu_name,1,1) first_stu_name 
	   from student
) t 
group by first_stu_name 
having count_first_stu_name>=2;

2.15查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列

select course_id,avg(grade) avg_grade from score group by course_id order by avg_grade asc,course_id desc;

2.16 统计参加考试人数大于等于15的学科

select course_id,count(stu_id) count_stu from score group by course_id having count_stu >= 15;

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

select stu_id,sum(grade) sum_grade from score group by stu_id order by sum_grade desc;

2.18 查询平均成绩大于60分的学生的学号和平均成绩

思路:分组,avg,过滤>=60

select * from (select stu_id,avg(grade) avg_grade from score group by stu_id) t where avg_grade > 60;

2.19 按照如下格式显示学生的语文、数学、英语三科成绩,没有成绩的输出为0,按照学生的有效平均成绩降序显示

学生id 学生姓名 语文 数学 英语 有效课程数 有效平均成绩

NVL( value,default_value) 函数

  • 它的功能是如果value为NULL,则NVL函数返回default_value的值,否则返回value的值,如果两个参数都为NULL ,则返回NULL。

case when 判断:

  1. 语法1:

CASE
WHEN 条件1 THEN VALUE1
WHEN 条件2 THEN VALUE2
……
WHEN 条件N THEN VALUEN
ELSE 默认值
END

  1. 语法2:

CASE 列
WHEN V1 THEN VALUE1
WHEN V2 THEN VALUE2
……
WHEN VN THEN VALUEN
ELSE 默认值
END

select h.stu_id as `学生id`,student.stu_name as `学生姓名`,`语文`,`数学`,`英语`,`有效课程数`,`平均成绩`
from 
	(select 
		stu_id,
		max(case course_name when '语文' then grade else 0 end) as `语文`,
		max(case course_name when '数学' then grade else 0 end) as `数学`,
		max(case course_name when '英语' then grade else 0 end) as `英语`,
		count(*) as `有效课程数`,
		avg(grade) as `平均成绩`
	from 
		(select s.stu_id,c.course_name,s.grade  from course c join score s on c.course_id=s.course_id) t 
	group by stu_id
	order by avg(grade) desc
) h join student on h.stu_id=student.stu_id;

2.20查询一共参加两门课程且其中一门为语文课程的学生的id和姓名

select t2.stu_id,student.stu_name
from (
	select stu_id,count(*) cnt,sum(case course_name when '语文' then 1 else 0 end) as cond
	from
		(select g.stu_id,c.course_id,c.course_name from course c join score g on c.course_id=g.course_id) t1
	group by stu_id having cnt=2 and cond=1
) t2 join student on t2.stu_id=student.stu_id;
select t.stu_id,student.stu_name
from 
	(select 
		stu_id 
	from 
		score 
	where 
		stu_id in (select stu_id from score where course_id in (select course_id from course where course_name='语文')) 
	group by stu_id 
	having count(*)=2
) t join student on t.stu_id=student.stu_id;

2.21查询所有课程成绩小于60分学生的学号、姓名

select s.stu_id,s.stu_name,t.max_grade 
from (
	select stu_id,max(grade) max_grade from score group by stu_id having max_grade <60
) t join student s on t.stu_id=s.stu_id;

2.22查询没有学全所有课的学生的学号、姓名

解释:没有学全所有课,也就是该学生选修的课程数 < 总的课程数

select stu_id,stu_name
from (
	select student.stu_id,student.stu_name,score.course_id from score join student on score.stu_id=student.stu_id
) t 
group by stu_id,stu_name 
having count(course_id) < (select count(course_id) from course);

2.23查询出只选修了两门课程的全部学生的学号和姓名

解释:学生选修的课程数=2

select s.stu_id,s.stu_name
from (
	select stu_id from score group by stu_id having count(score.course_id)=2
) t join student s on t.stu_id=s.stu_id;

select stu_id,stu_name
from
	student 
where stu_id in (select stu_id from score group by stu_id having count(score.course_id)=2);

2.24查找1995年出生的学生名单

date_format() 函数: 格式化日期
select date_format(‘2023-05-23 15:58:43’,‘yyyy/MM/dd HH:mm:ss’);

select * from student where date_format(birthday,'yyyy')='1995';

2.25查询两门以上不及格课程的同学的学号及其平均成绩

先找出有两门以上不及格的学生名单,按照学生分组,过滤组内成绩低于60的并进行count,count>=2。
接着做出一张表查询学生的平均成绩并和上一个子查询中的学生学号进行连接

select s.stu_id,avg(s.grade) as avg_grade
from score s where s.stu_id in
(
	select stu_id
	from 
		score 
	where grade<60
	group by stu_id
	having count(*)>=2
)
group by s.stu_id;

2.26 查询所有学生的学号、姓名、选课数、总成绩

select t.stu_id,s.stu_name,`选课数`,`总成绩`
from (
	select stu_id,count(course_id) as `选课数`,sum(grade) as `总成绩` from score group by stu_id
) t join student s on t.stu_id=s.stu_id;

2.27查询平均成绩大于85的所有学生的学号、姓名和平均成绩

select student.stu_id,student.stu_name,t.avg_grade
from (
	select stu_id,avg(grade) avg_grade from score group by stu_id having avg_grade > 85
) t join student on t.stu_id=student.stu_id;
select distinct stu_id,stu_name,avg_grade
from(
	select t.stu_id,t.stu_name,avg(grade) over(partition by s.stu_id) avg_grade
	from 
		score s left join student t on s.stu_id=t.stu_id
) t 
where t.avg_grade>85;

2.28查询学生的选课情况:学号,姓名,课程号,课程名称

select t.stu_id,t.stu_name,m.course_id,m.course_name 
from student t left join (
	select s.stu_id,c.course_id,c.course_name from score s left join course c on s.course_id=c.course_id
) m on t.stu_id=m.stu_id;

2.29查询出每门课程的及格人数和不及格人数

在这里插入图片描述

select 
	s.course_id,
	c.course_name,
	sum(case when grade>=60 then 1 else 0 end) as `及格人数`,
	sum(case when grade<60 then 1 else 0 end) as `不及格人数` 
from score s left join course c on s.course_id=c.course_id 
group by s.course_id,c.course_name;

2.30 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称

select 
	sum(case when grade<=100 and grade >85 then 1 else 0 end) `[100-85]`,
	sum(case when grade<=85 and grade>70 then 1 else 0 end) `[85-70]`,
	sum(case when grade<=70 and grade>60 then 1 else 0 end) `[70-60]`,
	sum(case when grade<60 then 1 else 0 end) `[<60]`,
	s.course_id,
	c.course_name 
from score s left join course c on s.course_id=c.course_id 
group by s.course_id,c.course_name;

在这里插入图片描述

2.31 查询课程编号为03且课程成绩在80分以上的学生的学号和姓名

select stu_id,stu_name 
from 
	student 
where stu_id in 
	(select stu_id from score where course_id='03' and grade>80);

在这里插入图片描述

select t.stu_id,t.stu_name,c.course_id,c.course_name,grade
from 
	score s inner join course c on s.course_id=c.course_id inner join student t on s.stu_id=t.stu_id 
where c.course_id='03' and s.grade>80;

在这里插入图片描述

2.32 (重要!行转列)使用sql实现将该表行转列为下面的表结构

如果没有该课程成绩用0代替。
学号 课程01 课程02 课程03 课程04

select 
	stu_id,
	max(case course_id when '01' then grade else 0 end) `课程01`, 
	max(case course_id when '02' then grade else 0 end) `课程02`,
	max(case course_id when '03' then grade else 0 end) `课程03`,
	max(case course_id when '04' then grade else 0 end) `课程04`
from 
	score 
group by stu_id;

2.33 检索"01"课程分数小于60,按分数降序排列的学生信息

select s.*,t.grade 
from 
	student s join (select stu_id,grade from score where course_id='01' and grade < 60) t on s.stu_id=t.stu_id
order by t.grade desc;

在这里插入图片描述

2.34 查询任何一门课程成绩在70分以上的学生的姓名、课程名称和分数

  1. 只要有一门课程超70分:
select t.stu_name,c.course_name,grade
from
	score s join course c on s.course_id=c.course_id join student t on s.stu_id=t.stu_id 
where s.grade>70;
  1. 所有的课程都在70分以上:
select t.stu_id,t.stu_name,c.course_name,s.grade
from 
	student t join score s on t.stu_id=s.stu_id join course c on s.course_id=c.course_id
where t.stu_id in
	(select stu_id from score group by stu_id having min(grade)>70)
order by t.stu_id;

2.35 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

知识点:分组 + 条件 + 多表连接
思路:计算每个学号不及格分数个数,筛选出大于2个的学号并找出姓名,平均成绩

select s.stu_id,s.stu_name,t.avg_grade
from(
	select stu_id,avg(grade) avg_grade 
	from 
		score 
	where stu_id in (select stu_id from score where grade<60 group by stu_id having count(*)>=2)
	group by stu_id
) t join student s on t.stu_id=s.stu_id;

2.36 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

select s1.*
from score s1 inner join score s2 on s1.stu_id=s2.stu_id and s1.course_id<>s2.course_id and s1.grade=s2.grade;

在这里插入图片描述

2.37 查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号

select stu_id
from(
	select 
		stu_id,
		max(case when course_id='01' then grade else 0 end) course_01,
		max(case when course_id='02' then grade else 0 end) course_02
	from 
		score 
	where score.course_id='01' or score.course_id='02'
	group by stu_id 
	having count(*) =2
) t where course_01>course_02;

2.38 查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名

select stu_id,stu_name
from student 
where stu_id in
(
	select 
		stu_id
	from 
		score 
	where score.course_id='01' or score.course_id='02'
	group by stu_id 
	having count(*) =2
) ;

2.39 查询学过“李体音”老师所教的所有课的同学的学号、姓名

  1. size() 求集合中元素的个数 size(Map<K.V>) size(Array)
  2. concat_set(colName) 用于将一列中的多行合并为一行,并进行去重,返回Array类型字段。而COLLECT_LIST(col) 不进行去重。
--先查询李体音老师所教的课程,并计算其所教的课程数
select stu_id,stu_name
from
	student 
where stu_id in
(
	select score.stu_id
	from(
		select course_id, count_course
		from 
			(select collect_set(course_id) course_ids,size(collect_set(course_id)) count_course 
			 from 
			 	course where tea_id in (select tea_id from teacher where tea_name='李体音')
			 ) a
		lateral view explode(course_ids) b as course_id
	) t join score on t.course_id=score.course_id
	group by score.stu_id
	having count(*)=max(count_course)
);

2.40 查询学过“李体音”老师所讲授的任意一门课程的学生的学号、姓名

select s.stu_id,s.stu_name
from (
	select stu_id
	from 
		score s join (select course_id from course where tea_id in (select tea_id from teacher where tea_name='李体音')) t on s.course_id=t.course_id
	group by stu_id
	having count(*)=1
) a join student s on a.stu_id=s.stu_id;
--查询只学过一门“李体音”老师所讲授的课程的学生的学号、姓名
select stu_id,stu_name
from student 
where stu_id in
	(select stu_id 
	 from
		score 
	 where course_id in
		(select course_id from course where tea_id in (select tea_id from teacher where tea_name='李体音'))
	)
;

2.41 查询没学过"李体音"老师讲授的任一门课程的学生id及其学生姓名

select stu_id,stu_name
from 
	student 
where stu_id not in (
	select 
		distinct stu_id 
	from score s join 
		(select course_id from course where tea_id in (select tea_id from teacher where tea_name='李体音')) t
		on s.course_id=t.course_id
);

2.42 查询选修“李体音”老师所授课程的学生中成绩最高的学生姓名及其成绩

(与上题类似,用成绩排名,用 limit 1得出最高一个)

select student.stu_name,grade
from 
student join (
	select stu_id,grade 
	from 
		score s join (
			select course_id from course where tea_id in (select tea_id from teacher where tea_name='李体音')
		) t on s.course_id=t.course_id
	order by grade desc  
	limit 1
	) a on a.stu_id=student.stu_id
;

2.43 查询至少有一门课与学号为“001”的学生所学课程相同的学生的学号和姓名

select stu_id,stu_name 
from student where stu_id in (
	select distinct stu_id 
	from 
		score 
	where stu_id!='001' and course_id in (select course_id from score where stu_id='001')
);

2.44 查询所学课程与学号为“001”的学生所学课程完全相同的学生的学号和姓名

concat_ws(SplitChar,element1,element2……) 用于实现字符串拼接,可以指定分隔符。
注意: CONCAT_WS must be "string or array<string>"

array(n0, n1…) 创建一个数组
sort_array(array(obj1, obj2,…)) 对数组中的元素进行升序排序
select sort_array(array(‘021’,‘3’,‘21’,‘87’));
select sort_array(array(29,4,22,1,4,32,5));

select stu_id,stu_name
from 
	student 
where stu_id in (
	select stu_id
	from 
		(select stu_id,concat_ws(',',sort_array(collect_list(course_id))) as course_ids from score group by stu_id) t2
	where stu_id!='001' and course_ids=(select concat_ws(',',sort_array(collect_list(course_id))) as course_ids from score where stu_id='001')
);

2.45 查询学过与学号为“001”的学生全部所学课程的学生的学号和姓名

select stu_id,stu_name
from
	student 
where stu_id in (
	select stu_id 
	from 
		score join 
		(select course_id, course_nums
		 from 
			(select collect_list(course_id) as course_ids,count(*) course_nums from score where stu_id='001') t1 lateral view explode(course_ids) l as course_id
		) t2 on score.course_id=t2.course_id
	where stu_id!='001'
	group by stu_id
	having count(*)=max(course_nums) --因为分组后的course_nums列可能有好几个值,只取一个
);

2.46 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

select stu_name,course_name,grade,avg_grade
from 
	student join (
		select stu_id,course_name,grade,avg(grade) over(partition by stu_id) avg_grade
		from (
			select s.stu_id,c.course_id,c.course_name,s.grade from course c join score s on c.course_id=s.course_id
			) t1
		) t2 on student.stu_id=t2.stu_id
order by avg_grade desc,student.stu_id asc
;

2.47 查询每个学生的学生平均成绩及其名次

  • 取整函数: round 返回double类型的整数值部分 (遵循四舍五入)
    select round(3.1415926);
  • 指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
    select round(3.1415926,4); --3.1416
-- RANK() 排序相同时会重复,总数不会变
select s.*,avg_grade,rank() over(order by avg_grade desc)
from 
	student s left join 
		(select stu_id,round(avg(grade),2) avg_grade from score group by stu_id) t 
	on s.stu_id=t.stu_id
;

2.48 按各科成绩进行排序,并显示在这个学科中的排名

select 
	stu_id,
	stu_name,
	course_name,
	grade,
	rank() over(partition by course_name order by grade desc)
from (
	select s1.stu_id,s1.stu_name,c.course_name,s2.grade
	from student s1 join score s2 on s1.stu_id=s2.stu_id join course c on s2.course_id=c.course_id
) t;

2.49 查询每门课程成绩最好的前两名学生姓名及成绩

窗口函数排名+多表连接+条件

select course_name,stu_name,grade,rk
from (
	select
		stu_name,
		course_name,
		grade,
		rank() over(partition by course_name order by grade desc) as rk
	from (
		select s1.stu_name,c.course_name,s2.grade from student s1 join score s2 on s1.stu_id=s2.stu_id join course c on s2.course_id=c.course_id
	) t
) t2 where rk<=2;

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

select *
from (
	select
		t1.*,
		rank() over(partition by course_name order by grade desc) as rk
	from (
		select s1.*,c.course_name,s2.grade from student s1 join score s2 on s1.stu_id=s2.stu_id join course c on s2.course_id=c.course_id
	) t1
) t2 where rk=2 or rk=3;

2.51 查询各科成绩前三名的记录(如果有并列,则全部展示,例如如果前7名为:80,80,80,79,79,77,75,70,则统计结果为数字的前三名,结果为80,80,80,79,79,77)

--DENSE_RANK() 排序相同时会重复,总数会减少
select *
from (
	select 
		s2.stu_id,
		s2.stu_name,
		c.course_name,
		s1.grade,
		dense_rank() over(partition by c.course_name order by s1.grade desc) rk
	from teacher t 
		join course c on t.tea_id=c.tea_id 
		join score s1 on c.course_id=s1.course_id 
		join student s2 on s1.stu_id=s2.stu_id
) temp where rk<=3;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day16 Servlet交互作用域ELJSTL

转发和重定向 **作用:**为了让jsp和servlet做到责任分离,用于web组件的跳转 **web组件:**jspservlet 转发的方法 request.getRequestDispatcher("跳转的地址").forward(request,response)**跳转的位置:**在服务端进行跳转 重定向的方法 response.sendRedirect(…

2.9 playwright之python实现

1、目录结构如下 2、main.py import os import shutilfrom playwright.sync_api import sync_playwright from config.setting import config from utils.template import Template from utils.md5 import Md5 from utils.delete import del_files import pytest from utils.d…

面试被问麻了...

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析和优化一…

【录用案例】2区毕业快刊仅34天录用,新增8篇录用、9篇见刊、13篇检索

2023年5月13日-2023年5月19日&#xff0c;经核实&#xff0c;由我处Unionpub学术推荐的8篇论文已被期刊部录用、9篇见刊、13篇检索&#xff1a; 2区系统类SSCI 【期刊简介】IF:2.5-3.0&#xff0c;JCR2区&#xff0c;中科院4区 【检索情况】SSCI 在检&#xff0c;正刊 【征稿…

本地项目上传到Git(Gitee)仓库

一、步骤解答&#xff08;详细图解步骤见第二大点&#xff09; 1、打开我们的项目所在文件夹&#xff0c;我们发现是不存在.git文件 2、在你的项目文件夹外层【鼠标右击】弹出菜单&#xff0c;在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】&#xff0c;弹出运…

循环队列+OJ题之设计循环队列

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f33a;前言&#xff1a; &#x1f341;一.循环队列是什么&#xff1f; &#x1f34f;二.循环队列有什么作用&#xff1f; &#x1f340;三.OJ题之设计循环队列 1…

实战演练 | Navicat 数据生成功能

数据生成的目的是依据某个数据模型&#xff0c;从原始数据通过计算得到目标系统所需要的符合该模型的数据。数据生成与数据模型是分不开的&#xff0c;数据生成的结果应该符合某个数据模型对于数据的具体要求。所以&#xff0c;随着数据模型的发展&#xff0c;数据生成的方法相…

window 利用Qt-windeployqt打包exe程序 一个简单的实例

用一个简单的实例展示下window 如何使用QT-windeployqt打包exe程序使得其可以在别的电脑上运行 一、release模式获得exe可执行文件 新建一个QT项目 构建选择使用CMake base class选择QMainWindow Kit Selection一定要注意&#xff0c;我选的是MinGW 32-bit UI设计 mainwindow.…

手机充电宝电子充气泵方案

该充气泵产品方案的运行原理是通过电动机将电能转化为机械能&#xff0c;带动电机做往复运动&#xff0c;从而产生大量压缩空气&#xff0c;达到快速充气的效果。该充气泵可用于气垫床、汽车轮胎、自行车轮胎、足球、游泳圈等各类充气物品。产品设计以人性化为主&#xff0c;简…

VMware重新安装后没有VMnet1和VMnet8网络

问题&#xff1a; VMware重新安装后&#xff0c;没有自动生成VMnet1和VMnet8网络, 并且使用VMware自带的虚拟网络编辑器也无法生成。 导致主机无法ping通虚拟机。 如下图&#xff1a;点击该选项&#xff0c;然后应用&#xff0c;转一会圈也没有产生对应的网络适配器。 问题原…

物联网技术助力物流智能化:从货物追踪到配送优化

目录 前言 物流领域的IoT设备 物流领域的应用 二、仓库管理 三、物流配送 IoT组合应用 区块链在物流领域应用 展望 前言 随着全球贸易和物流业的快速发展&#xff0c;物流领域的智能化和自动化已成为不可避免的趋势。而物联网技术作为一种重要的数字技术&#xff0c;已经在物流…

VIsual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本

前言 本篇在讲什么 在Visual Studio中引入lua的解释器 使用C调用Lua文件 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文…

Shellcode分离加载实现免杀的两种方式(VT免杀率:1/68)

简介 本文详细介绍了如何通过文件加载和远程URL加载方式实现Shellcode分离加载&#xff0c;以规避安全软件的检测。文章首先描述了通过Metasploit Framework生成的shellcode文件加载的过程&#xff0c;并提供了相关的C代码。 为了避免被杀毒软件检测&#xff0c;利用动态API调…

自动化测试-DevOps如何实施?看看10年测试大佬的总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Selenium4自动化测…

2023最新!软件测试高频面试题基础知识点分享

近期也算是抽取出大部分休息的时间&#xff0c;为大家准备了一份通往大厂面试的小捷径&#xff0c;准备了一整套软件测试复习面试的刷题以及答案&#xff0c;我知道很多同学不知道怎么复习&#xff0c;不知道学习过程中哪些才是重点&#xff0c;其实&#xff0c;你们经历过的事…

内网渗透(八十二)之 CVE-2019-1040 NTLM MIC 绕过漏洞

CVE-2019-1040 NTLM MIC 绕过漏洞 漏洞背景 2019年6月11日,微软发布6月份安全补丁更新。在该安全补丁更新中,对 CVE-2019-1040 漏洞进行了修复。该漏洞存在于Windwos 大部分版本中,当中间人攻击者能够成功绕过NTLM 消息完整性校验(MIC)时,Windows 存在可能可篡改的漏洞…

R语言实践——rWCVP生成可发表级别的物种发现记录矩阵

rWCVP生成可发表级别的物种发现记录矩阵 介绍1. 查询一组示例数据2. 生成和格式化出现矩阵3. 额外地对国家进行处理 介绍 世界维管植物名录&#xff08;WCVP&#xff09;提供了已知的>340&#xff0c;000种维管植物物种的分布数据。该分布数据可用于构建植物物种名录的发现…

解密报错-java.security.InvalidKeyException: Illegal key size(本机解密正常,服务器解密报错)

记录在对接微信接口时需要的问题&#xff0c;对微信消息进行解密时报错&#xff0c;在本地进行解密是正常的&#xff0c;但部署到服务器进行解密就会报错 报错信息 java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:…

windows 系统扩容C盘注意事项

windows系统大家都不陌生&#xff0c;是大家用的最多的操作系统。在实际的使用中&#xff0c;遇到需要扩容C盘的情况不是很多&#xff0c;但是如果遇到了&#xff0c;有以下几个事项需要大家注意&#xff1a; 剩余空间是否充足 不论当前服务器是物理服务器还是虚拟机&#xff…