在网上找了50道SQL题目,每日做几道,熟练SQL。不保证答案100%正确,如有错误欢迎指正。
题目出处
数据表介绍
学生表
student(sid,sname,sage,ssex)
–sid 学生编号,sname 学生姓名,sage 出生年月,ssex 学生性别
课程表
course(cid,cname,tid)
–cid 课程编号,cname 课程名称,tid 教师编号
教师表
teacher(tid,tname)
–tid 教师编号,tname 教师姓名
成绩表
sc(sid,cid,score)
–sid 学生编号,cid 课程编号,score 分数
mysql中建表并插入数据:
-- 学生表 student
insert into student values('01' , '赵雷' , '1990-01-01' , '男');
insert into student values('02' , '钱电' , '1990-12-21' , '男');
insert into student values('03' , '孙风' , '1990-12-20' , '男');
insert into student values('04' , '李云' , '1990-12-06' , '男');
insert into student values('05' , '周梅' , '1991-12-01' , '女');
insert into student values('06' , '吴兰' , '1992-01-01' , '女');
insert into student values('07' , '郑竹' , '1989-01-01' , '女');
insert into student values('09' , '张三' , '2017-12-20' , '女');
insert into student values('10' , '李四' , '2017-12-25' , '女');
insert into student values('11' , '李四' , '2012-06-06' , '女');
insert into student values('12' , '赵六' , '2013-06-13' , '女');
insert into student values('13' , '孙七' , '2014-06-01' , '女');
--科目表 course
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');
--教师表 teacher
create table teacher(tid varchar(10) character set utf8,tname varchar(10) character set utf8);
insert into teacher values('01' , '张三');
insert into teacher values('02' , '李四');
insert into teacher values('03' , '王五');
--成绩表 sc
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 a.sid from
(select * from sc where cid='01')a,(select * from sc where cid='02')b
where a.score> b.score and a.sid =b.sid;
-- 2. 查询同时存在" 01 "课程和" 02 "课程的情况
select a.,b. from sc a left join sc b
on a.sid=b.sid
where a.cid='01' and b.cid='02'and
b.sid is not null;
-- 3. 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
select a.*,b.cid,b.score from sc a left join (select * from sc where cid = '02')b
on a.sid = b.sid
where a.cid = '01';
-- 4. 查询不存在" 01 "课程但存在" 02 "课程的情况
select * from sc where cid='02' and sid not in
(select sid from sc where cid='01');
-- 5. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
select sid,avg(score) avg from sc
group by sid
having avg>60;
-- 6. 查询在 sc 表存在成绩的学生信息
select * from student
where sid in (select distinct sid from sc);
-- 7. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
select s.sid,s.sname,count(sc.cid),sum(sc.score) from
(select sid,sname from student)s join sc
on s.sid = sc.sid
group by s.sid,s.sname;
-- 8. 查有成绩的学生信息
select distinct s.* from student s
join sc
on s.sid=sc.sid;
-- 9. 查询「李」姓老师的数量
select count(tid) from teacher
where tname like'%李%';
-- 10. 查询学过「张三」老师授课的同学的信息
select * from student
where sid in (select distinct sid from sc
where cid in (select cid from course
where tid in (select tid from teacher where Tname = '张三')));
-- 11. 查询没有学全所有课程的同学的信息
select * from student
where sid in
(select sid from sc
group by sid
having count(cid)<>3)
-- 12. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
select * from student
where sid in (select distinct sid from sc where cid in(
select cid from sc
where sid ='01')) ;
-- 13. 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
select * from student
where sid in(select distinct sid from sc where cid in(select distinct cid from sc where sid='01') and sid<>'01'
group by sid
having count(cid)=3);
-- 14. 查询没学过"张三"老师讲授的任一门课程的学生姓名
select sname from student
where sid not in (select sid from sc
where cid in(select cid from course
where tid in(select tid from teacher where tname='张三')));
-- 15. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select s.sid,s.sname,avg(sc.score) from student s,sc
where sc.score<60 and s.sid=sc.sid
group by s.sid,s.sname
having count(sc.score)>=2;
-- 16. 检索" 01 "课程分数小于 60,按分数降序排列的学生信息
select student.sname,s.score from (select * from sc where score <60 and cid='01' order by score desc) s join student
where student.sid = s.sid;
-- 17. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select * from (select sc.sid,sc.score,a.avg from sc
right join (select sid,avg(score) avg from sc
group by sid
) a
on sc.sid=a.sid) d
order by avg desc,sid desc;
-- 18. 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
-- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
-- 19. 按各科成绩进行排序,并显示排名, score 重复时保留名次空缺
-- 20. 按各科成绩进行排序,并显示排名, score 重复时合并名次
-- 21. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺
-- 22. 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
-- 23. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
-- 24. 查询各科成绩前三名的记录
-- 25. 查询每门课程被选修的学生数
-- 26. 查询出只选修两门课程的学生学号和姓名
-- 27. 查询男生、女生人数
-- 28. 查询名字中含有「风」字的学生信息
-- 29. 查询同名同性学生名单,并统计同名人数
-- 30. 查询 1990 年出生的学生名单
-- 31. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
-- 32. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
-- 33. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
-- 34. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
-- 35. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
-- 36. 查询不及格的课程
-- 37. 查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
-- 38. 求每门课程的学生人数
-- 39. 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-- 40. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
-- 41. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
-- 42. 查询每门功成绩最好的前两名
-- 43. 统计每门课程的学生选修人数(超过 5 人的课程才统计)。
-- 44. 检索至少选修两门课程的学生学号
-- 45. 查询选修了全部课程的学生信息
-- 46. 查询各学生的年龄,只按年份来算
-- 47. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
-- 48. 查询本周过生日的学生
-- 49. 查询下周过生日的学生
-- 50. 查询本月过生日的学生