经典50道sql练习题(代码片段)

Firm陈 Firm陈     2022-10-22     265

关键词:

一、数据表

1.学生表 Student(SId,Sname,Sage,Ssex)–SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2017-12-30' , '女');
insert into Student values('12' , '赵六' , '2017-01-01' , '女');
insert into Student values('13' , '孙七' , '2018-01-01' , '女');

2.课程表 Course(CId,Cname,TId) – CId 课程编号,Cname 课程名称,TId 教师编号

create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');

3.教师表 Teacher(TId,Tname)–TId 教师编号,Tname 教师姓名

create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');

4.成绩表 SC(SId,CId,score)–SId 学生编号,CId 课程编号,score 分数

create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);

二、题目

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

select t1.sid, t1.score as class1,t2.score as class2 from
(select sid,cid,score from sc where cid = '01') t1,
(select sid,cid,score from sc where cid = '02') t2
where t1.sid = t2.sid and t1.score > t2.score

1.1 查询同时存在” 01 “课程和” 02 “课程的情况

Select sc.sid from sc
Where sc.cid = '01' and sc.sid in (select sid from sc where cid = '02')

1.2 查询存在” 01 “课程但可能不存在” 02 “课程的情况(不存在时显示为 null )

Select * from 
(select * from sc where sc.cid =01) t1
Left join (select * from sc where sc.cid =02) t2
On t1.sid = t2.sid

1.3 查询不存在” 01 “课程但存在” 02 "课程的情况

Select * from sc
Where sc.cid =02’ and sc.sid not in (select sid from sc where cid =01)

2、查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
(使用一些聚合函数必需先分组)

Select sc.sid, st.sname, avg(sc.score) avg_score from sc
Join student st
On sc.sid = st.sid
Group by sc.sid
Having avg_score >= 60

3、查询在 SC 表存在成绩的学生信息

Select sc.*, st.* from sc
Left join student st
On sc.sid = st.sid

4、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

Select st.sid, st.sname, count(sc.cid), sum(sc.score) from student st
Left join sc 
On st.sid = sc.sid
Group by st.sid

4.1 查有成绩的学生信息

Select st.* from student t
Where st.sid in (select sid from sc)

5、查询「李」姓老师的数量

Select count(tid) from teacher
Where tname like’李%

6、查询学过「张三」老师授课的同学的信息

Select sc.sid, st.* from sc
Left join student st
On sc.sid = st.sid
Where sc.cid in (Select c.cid from course c
Join teacher t
On c.tid = t.tid
Where t.tname = ‘张三’)

7、查询没有学全所有课程的同学的信息

Select st.* from student st
Where st.sid not in 
(select sid from sc group by sid having count(cid) = (select count(cid) from course))

8、查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

Select distinct sc.sid, st.* from sc
Join student st
On sc.sid = st.sid
Where sc.cid in (Select cid from sc where sid =01)

9、查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

Select sc.sid, st.* from sc
Join student st
On sc.sid = st.sid
where sc.cid in (Select cid from sc where sid = '01') and sc.sid != '01'
group by sc.sid
having count(sc.cid) = (Select count(cid) from sc where sid = '01')

10、查询没学过"张三"老师讲授的任一门课程的学生姓名

select st.sname from student st
where st.sname not in 
(select st.sname from student st,sc,course c,teacher t
where st.sid = sc.sid and sc.cid = c.cid and c.tid = t.tid and t.tname = '张三')

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

select sc.sid,st.sname,avg(sc.score) from sc
join student st
on sc.sid = st.sid
group by sc.sid
having sum(case when sc.score < 60 then 1 else 0 end)>=2

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

select sc.sid,st.sname from sc
join student st
on sc.sid = st.sid
where sc.cid = '01' and sc.score <60
order by sc.score desc

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

select sid,avg(score) over(partition by sid) as avg_score,cid,score from sc
order by avg_score desc
select sc.sid,t1.avg_score,sc.cid,sc.score from sc
left join (select sid,avg(score) as avg_score,cid,score from sc group by sid) t1
on sc.sid = t1.sid
order by 2 desc

14、查询各科成绩最高分、最低分和平均分

select cid,max(score),avg(score) from sc
group by cid

15、以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

select sc.cid,c.cname,max(sc.score),min(sc.score),avg(sc.score),
sum(case when sc.score>=60 then 1 else 0 end)*1.0/count(sc.score) 及格,
sum(case when sc.score between 70 and 80 then 1 else 0 end)*1.0/count(sc.score) 中等,
sum(case when sc.score between 80 and 90 then 1 else 0 end)*1.0/count(sc.score) 优良,
sum(case when sc.score>=90 then 1 else 0 end)*1.0/count(sc.score) 优秀
from sc
join course c
on sc.cid = c.cid
group by sc.cid

16、按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺

select cid, rank() over (partition by cid order by score desc) rank,score from sc

17、按各科成绩进行排序,并显示排名, Score 重复时合并名次

select cid, dense_rank() over (partition by cid order by score desc) rank,score from sc

18、要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

select cid, count(sid) from sc
group by cid
order by 2 desc,1

19、查询学生的总成绩,并进行排名,总分重复时保留名次空缺

select sum(score) sum_score, rank() over (order by sum(score) desc) rank from sc
group by sid

20、查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
21、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比

select cid,
sum(case when score between 85 and 100 then 1 else 0 end)*1.0/count(sid) '85-100',
sum(case when score between 70 and 85 then 1 else 0 end)*1.0/count(sid) '70-85',
sum(case when score between 60 and 70 then 1 else 0 end)*1.0/count(sid) '60-70',
sum(case when score between 85 and 100 then 1 else 0 end)*1.0/count(sid) '0-60'
from sc group by cid

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

select * from (select cid, sid,score, row_number() over (partition by cid order by score desc) as rank from sc) t
where t.rank <= 3

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

select cid, count(sid) from sc
group by cid

24、查询出只选修两门课程的学生学号和姓名

select sc.sid from sc
group by sid
having count(distinct cid)=2

25、查询男生、女生人数

select count(distinct t1.sid),count(distinct t2.sid) 女 from 
(select sid from student where ssex = '男') t1,
(select sid from student where ssex = '女') t2

26、查询名字中含有「风」字的学生信息

select * from student
where sname like '%风%'

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

select sname, count(*) from student
group by sname
having count(*)>1;
select * from
(select t1.* from student t1, student t2
where t1.sname = t2.sname and t1.sid != t2.sid group by t1.sid) a

28、查询 1990 年出生的学生名单

select * from student
where sage between '1990-01-01' and '1991-01-01'

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

select distinct cid, avg(score) over (partition by cid) avg_score from sc
order by 2 desc,1

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

select * from
(select distinct sid , avg(score) over (partition by sid) avg_score from sc) t1
where avg_score >= 85

31、查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

select st.sname,sc.*,c.cname from sc
join course c
on sc.cid = c.cid and c.cname = '数学'
join student st
on sc.sid = st.sid
where sc.score < 60

32、查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

select st.sid, st.sname,sc.* from student st
left join sc
on st.sid = sc.sid

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

select sc.sid, st.sname, c.cname, sc.score from sc
join  student st
on sc.sid = st.sid
join course c
on sc.cid = c.cid
where sc.score > 70

34、查询不及格的课程

select sc.sid, st.sname, c.cname, sc.score from sc
join  student st
on sc.sid = st.sid
join course c
on sc.cid = c.cid
where sc.score < 60

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

select sc.cid, sc.sid, st.sname,sc.score from sc
join student st
on sc.sid = st.sid 
where sc.cid = '01' and sc.score >=80

36、求每门课程的学生人数

select sc.cid, count(sc.sid) from sc
group by sc.cid

37、成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

select st.*,max(sc.score) from sc
join course c 
on sc.cid = c.cid
join teacher t
on c.tid = t.tid and t.tname = '张三'
join student st
on sc.sid = st.sid

38、成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

select t1.* from
(select st.*, sc.score from sc
join course c 
on sc.cid = c.cid
join teacher t
on c.tid = t.tid and t.tname = '张三'
join student st
on sc.sid = st.sid) t1,
(select st.*,max(sc.score) as max_score from sc
join course c 
on sc.cid = c.cid
join teacher t
on c.tid = t.tid and t.tname = '张三'
join student st
on sc.sid = st.sid) t2
where t1.score = t2.max_score

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

select sc.* from sc,
(select sid,cid,score from sc
group by sid
having count(distinct cid) > count(distinct score)) t1
where sc.sid = t1.sid

40、查询每门功成绩最好的前两名

select * from 
(select cid, sid, row_number() over (partition by cid order by score desc) as rank from sc)
 t1
where rank<=2

41、统计每门课程的学生选修人数(超过 5 人的课程才统计)。

select * from 
(select cid, count(distinct sid) as num from sc 
group by cid) t1
where num > 5

42、检索至少选修两门课程的学生学号

select sid from 
(select sid, count(cid) as num from sc group by sid) t1
where num > 2

43、查询选修了全部课程的学生信息

select sid from sc
group by sid
having count(distinct cid) = (select count(distinct cid) from course)

44、查询各学生的年龄,只按年份来算

select sid, sname接近50道经典sql练习题,附建表sql解题sql(代码片段)

 说明本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内。文末提供了所用SQL脚本下载链接。所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题欢迎留言... 查看详情

java50道经典习题-程序21求阶乘(代码片段)

题目:求1+2!+3!+...+20!的和分析:使用递归求解0的阶乘和1的阶乘都为1publicclassProg21publicstaticvoidmain(String[]args)longsum=0L;for(inti=1;i<=20;i++)sum+=factorial(i);System.out.println(sum);//递归求阶乘publicstaticlongfa 查看详情

java50道经典习题-程序9求完数(代码片段)

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。1publicclassProg92publicstaticvoidmain(String[]args)3intn=1000;4compNumber(n);56//求完数7privatestaticvoidcompNumber(intn)8System.out.println(n 查看详情

java50道经典习题-程序22递归求阶乘(代码片段)

题目:利用递归方法求5!。分析:递归公式:n*factorial(n-1);1publicclassProg222publicstaticvoidmain(String[]args)3System.out.println(factorial(5));45//递归求阶乘6publicstaticlongfactorial(intn)7if(n==0||n==1)8return1L;910 查看详情

java50道经典习题-程序8输入数字求和(代码片段)

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 分析:关键是计算出每一项的值。1importjava.util.Scanner;2publicclassProg83publicstaticvoidmain(String[]args)4System.out.prin... 查看详情

java50道经典习题-程序10自由落体(代码片段)

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?1importjava.util.Scanner;2publicclassProg103publicstaticvoidmain(String[]args)4System.out.println("请输入小球落地时... 查看详情

java50道经典习题-程序12计算奖金(代码片段)

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;   利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;   20万到40万之间时,高于20... 查看详情

java50道经典习题-程序20求前20项之和(代码片段)

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。分析:请抓住分子与分母的变化规律。三个连续分数之间的规律是:上两个分子之和等于第三个分数的分子,上两个分母之和等于第三个分数的分... 查看详情

java50道经典习题-程序11求不重复数字(代码片段)

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。1publicclassProg112publicstaticvoidmain(String[]args... 查看详情

java50道经典习题-程序13根据条件求数字(代码片段)

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?分析:完全平方数:如果一个数能是由两个相同的数相乘的结果,那么这个数就是完全平方数,例如:9==3*3;9就是完全平方数... 查看详情

java50道经典习题-程序19输入行数打印菱形图案(代码片段)

题目:根据用户输入的行数打印菱形图案,若用户传入的是为偶数则提示用户重新输入,例如输入数字7打印出如下菱形图案  * *** ************ ***** ***  *分析:先把图形分成两部分来看待,前四行一个... 查看详情

50道sql练习题及答案与详细分析!!!(代码片段)

...在到了企业才发现sql是那么的重要,看到网上有很多的sql练习题,特地拿来练练手!数据表介绍--1.学生表Student(SId,Sname,Sage,Ssex)--SId学生编号,Sname学生姓名,Sage出生年月,Ssex学生性别--2.课程表Course(CId,Cname,TId)--CId课程编号,Cname课程... 查看详情

java50道经典习题-程序18乒乓球赛(代码片段)

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。分析:如果是人经过逻辑推理可... 查看详情

java50道经典习题-程序16在控制台上打印九九乘法表(代码片段)

题目:输出9*9口诀。分析:利用双重for循环进行输出,分行与列考虑,共9行9列,i控制行,j控制列。1publicclassProg162publicstaticvoidmain(String[]args)3for(inti=1;i<10;i++)4for(intj=1;j<i+1;j++)5System.out.print(j+"*"+i+"="+(j*i)+"\t");/ 查看详情

深夜小酌,50道经典sql题,真香~(代码片段)

...久久不能平息~~  蹲坑之余,在网上找到了50道所谓经典SQL题,这不就是深夜必备小菜?我用脚叼起拖鞋,从冰箱拿出封印已久的半瓶可乐,打开数日未见的MySQL8,来吧,来场说卷就卷的刷题。  现... 查看详情

sql语句经典练习50题(代码片段)

表名和字段–1.学生表Student(s_id,s_name,s_birth,s_sex)--学生编号,学生姓名,出生年月,学生性别–2.课程表Course(c_id,c_name,t_id)–--课程编号,课程名称,教师编号–3.教师表Teacher(t_id,t_name)--教师编号,教师姓名–4.成绩表Score(s_id,c_id,s_score)--... 查看详情

sql语句经典练习50题(代码片段)

表名和字段–1.学生表Student(s_id,s_name,s_birth,s_sex)--学生编号,学生姓名,出生年月,学生性别–2.课程表Course(c_id,c_name,t_id)–--课程编号,课程名称,教师编号–3.教师表Teacher(t_id,t_name)--教师编号,教师姓名–4.成绩表Score(s_id,c_id,s_score)--... 查看详情

sql50道练习题(代码片段)

题目来源:https://blog.csdn.net/flycat296/article/details/636810891. 查询"01"课程比"02"课程成绩高的学生的信息及课程分数使用隐式FROMstudents3,(SELECTs1.stu_idsid,s1.`score`score1,s2.`score`score2FROMscores1,scores2WHEREs1.stu_id=s2.stu_idANDs1.`course_id`=1ANDs2.`co... 查看详情