mysql查询course_MySQL查询练习

本文提供了一系列的MySQL查询练习题,涵盖了学生、课程、成绩、教师等多方面的数据操作,包括统计学生人数、筛选特定条件的学生、查询各科成绩分布等复杂查询。通过这些练习,读者可以深入理解MySQL的查询能力和联查技巧。
摘要由CSDN通过智能技术生成

1、自行创建测试数据;

详见"db5_结构+数据.sql"2、查询学生总人数;select count(sid) fromstudent ;3、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;selectsid,

snamefromstudentwheresidin(selectscore.student_idfromscoreinner join course on score.course_id=course.cidwherecourse.cnamein('生物','物理')and score.score >= 60

group byscore.student_idhaving

count(course_id)=2);4、查询每个年级的班级数,取出班级数最多的前三个年级;selectgnamefromclass_gradewheregidin(selectgrade_idfromclassgroup bygrade_idhaving

count(cid) in(selectt1.count_cidfrom(select distinct

count(cid) ascount_cidfromclassgroup bygrade_idorder bycount_ciddesclimit3)ast1

)

);5、查询平均成绩最高和最低的学生的id和姓名以及平均成绩;selectstudent.sid,

student.sname,

t1.avg_scorefromstudentinner join(selectstudent_id,avg(score) asavg_scorefromscoregroup bystudent_idhaving

avg(score) in(

(select

avg(score) asmax_avg_scorefromscoregroup bystudent_idorder by

avg(score) desclimit1),

(select

avg(score) asmin_avg_scorefromscoregroup bystudent_idorder by

avg(score) asclimit1)

)

)as t1 on student.sid =t1.student_id;6、查询每个年级的学生人数;selectt1.grade_id,count(t1.sid) ascount_studentfrom(selectstudent.sid,

class.grade_idfromstudentinner join class on student.class_id=class.cid

)ast1group byt1.grade_id;7、查询每位学生的学号,姓名,选课数,平均成绩;selectstudent.sid,

student.sname,

t1.count_course,

t1.avg_scorefromstudentleft join(selectstudent_id,count(course_id) ascount_course,avg(score) asavg_scorefromscoregroup bystudent_id

)as t1 on student.sid =t1.student_id;8、查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名、成绩最低的课程名及分数;selectstudent.sname,

course.cname,

t1.scorefrom(selectstudent_id,

course_id,

scorefromscorewherestudent_id=2

and score in(

(select

min(score)fromscorewherestudent_id=2),

(select

max(score)fromscorewherestudent_id=2)

)

)ast1inner join student on t1.student_id=student.sidinner join course on t1.course_id=course.cid;9、查询姓“李”的老师的个数和所带班级数;selectteacher.tid,

teacher.tname,

t1.count_cidfromteacherleft join(selecttid,count(cid) ascount_cidfromteach2clswheretidin(selecttidfromteacherwheretnamelike '李%')group bytid

)as t1 on teacher.tid =t1.tidwhereteacher.tnamelike '李%';10、查询班级数小于5的年级id和年级名;selectgid,

gnamefromclass_gradewheregidin(selectgrade_idfromclassgroup bygrade_idhaving

count(caption)<5);11、查询班级信息,包括班级id、班级名称、年级、年级级别(12为低年级,34为中年级,56为高年级),示例结果如下;

班级id 班级名称 年级 年级级别1一年一班 一年级 低

#case when ... then

selectclass.cid 班级id,

class.caption 班级名称,

class_grade.gname 年级,case when class_grade.gid between 1 and 2 then '低'

when class_grade.gid between 3 and 4 then '中'

when class_grade.gid between 5 and 6 then '高' else 0 end as '年级级别'

fromclass,

class_gradewhereclass.grade_id=class_grade.gid;12、查询学过“张三”老师2门课以上的同学的学号、姓名;selectsid,

snamefromstudentwheresidin(selectstudent_idfromscorewherecourse_idin(selectcourse.cidfromteacher,

coursewhereteacher.tid=course.teacher_idand teacher.tname = '张三')group bystudent_idhaving

count(course_id) > 2);13、查询教授课程超过2门的老师的id和姓名;selecttid,

tnamefromteacherwheretidin(selectteacher_idfromcoursegroup byteacher_idhaving

count(cid) > 2);14、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;selectsid,

snamefromstudentwheresidin(select distinctstudent_idfromscorewherecourse_idin(1,2)

);15、查询没有带过高年级的老师id和姓名;selecttid,

tnamefromteacherwheretidnot in(selecttidfromteach2clswherecidin(selectcidfromclasswheregrade_idin(5,6)

)

);16、查询学过“张三”老师所教的所有课的同学的学号、姓名;selectsid,

snamefromstudentwheresidin(selectstudent_idfromscoreinner join course on score.course_id=course.cidwhere teacher_id in(selectsidfromteacherwheresname='张三')

)17、查询带过超过2个班级的老师的id和姓名;selecttid,

tnamefromteacherwheretidin(selectteacher_idfromcoursegroup byteacher_idhaving

count(cid) > 2);18、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;selectsid,

snamefromstudentwheresidin(selectt1.student_idfrom(selectstudent_id,

scorefromscorewherecourse_id= 2

group bystudent_id

)ast1,

(selectstudent_id,

scorefromscorewherecourse_id= 1

group bystudent_id

)ast2wheret1.student_id=t2.student_idand t1.score

);19、查询所带班级数最多的老师id和姓名;

# 考虑班级数并列最多的情况selecttid,

tnamefromteacherwheretidin(selecttidfromteach2clsgroup bytidhaving

count(cid) =(select

count(cid)fromteach2clsgroup bytidorder by

count(cid) desclimit1)

);20、查询有课程成绩小于60分的同学的学号、姓名;selectsid,

snamefromstudentwheresidin(select distinctstudent_idfromscorewherescore< 60);21、查询没有学全所有课的同学的学号、姓名;selectsid,

snamefromstudentwheresidnot in(selectstudent_idfromscoregroup bystudent_idhaving

count(course_id) =(select

count(cid)fromcourse

)

);22、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名;selectsid,

snamefromstudentwheresidin(selectstudent_idfromscorewherecourse_idin(selectcourse_idfromscorewherestudent_id= 1)group bystudent_id

);23、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名;selectsid,

snamefromstudentwheresidin(selectstudent_idfromscorewherecourse_idin(selectcourse_idfromscorewherestudent_id= 1)group bystudent_id

)and sid != 1;24、查询和“2”号同学学习的课程完全相同的其他同学的学号和姓名;selectsid,

snamefromstudentwheresidin(selectscore.student_idfromscore,

(selectcourse_idfromscorewherestudent_id= 2)ast1wherescore.course_id=t1.course_idand score.student_id != 2

group byscore.student_idhaving

count(score.course_id) =(select

count(course_id)fromscorewherestudent_id= 2)

);25、删除学习“张三”老师课的score表记录;delete fromscorewherecourse_idin(selectcourse.cidfromcourse,

teacherwherecourse.teacher_id=teacher.tidand teacher.tname = '张三');26、向score表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“2”课程的同学学号;②插入“2”号课程的平均成绩;

# 实际结果会和上面一题有冲突,张三老师所教的2号课程insert intoscore(student_id,course_id,score)selectt1.sid,2,

t2.avg_scorefrom(selectsidfromstudentwheresidnot in(selectstudent_idfromscorewherecourse_id= 2)

)ast1,

(select

avg(score) asavg_scorefromscorewherecourse_id= 2)ast2;27、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;

# 有效成绩含所有课程,包括语数英selectt1.student_idas学生ID,

(select score.score from score left join course on score.course_id = course.cid where course.cname = '语文' and score.student_id = t1.student_id) as语文,

(select score.score from score left join course on score.course_id = course.cid where course.cname = '数学' and score.student_id = t1.student_id) as数学,

(select score.score from score left join course on score.course_id = course.cid where course.cname = '音乐' and score.student_id = t1.student_id) as英语,count(t1.course_id) as有效课程数,avg(t1.score) as有效平均分fromscoreast1group byt1.student_idorder by

avg(t1.score) asc;28、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;selectcourse.cidas课程ID,max(score.score) as最高分,min(score.score) as最低分fromcourseleft join score on course.cid =score.course_idgroup byscore.course_id;29、按各科平均成绩从低到高和及格率的百分数从高到低顺序;selectcourse_id,avg(score) asavg_score,sum(case when score.score > 60 then 1 else 0 end) / count(1) * 100 as及格率fromscoregroup bycourse_idorder by

avg(score) desc,

及格率asc;30、课程平均分从高到低显示(显示任课老师);selectcourse.cname,

t1.avg_score,

teacher.tnamefromcourse,

teacher,

(selectcourse_id,avg(score) asavg_scorefromscoregroup bycourse_idorder byavg_scoredesc)ast1wherecourse.cid=t1.course_idand course.teacher_id =teacher.tidorder byt1.avg_scoredesc;31、查询各科成绩前三名的记录(不考虑成绩并列情况)selectscore.sid,

score.student_id,

score.course_id,

score.sid,

t1.first_score,

t1.second_score,

t1.third_scorefromscoreinner join(selects1.sid,

(select score from score as s2 where s1.course_id = s2.course_id order by score desc limit 0,1) asfirst_score,

(select score from score as s3 where s1.course_id = s3.course_id order by score desc limit 1,1) assecond_score,

(select score from score as s4 where s1.course_id = s4.course_id order by score desc limit 2,1) asthird_scorefromscoreass1

)as t1 on score.sid =t1.sidwherescore.scorein(

t1.first_score,

t1.second_score,

t1.third_score

);32、查询每门课程被选修的学生数;

# 包含了没有被选修的课程显示0selectcourse.cid,

ifnull(t1.count_students,0) ascount_studentfromcourseleft join(selectcourse_id,count(student_id) ascount_studentsfromscoregroup bycourse_id

)as t1 on course.cid =t1.course_id;33、查询选修了2门以上课程的全部学生的学号和姓名;selectsid,

snamefromstudentwheresidin(selectstudent_idfromscoregroup bystudent_idhaving

count(course_id) > 2);34、查询男生、女生的人数,按倒序排列;selectgender,count(sid) ascount_studentfromstudentgroup bygenderorder bycount_studentdesc;35、查询姓“张”的学生名单;selectstudent.sid,

student.sname,

student.gender,

class.captionfromstudentinner join class on student.class_id =class.cidwherestudent.snamelike '张%';36、查询同名同姓学生名单,并统计同名人数;selectsname,count(sname) ascount_snamefromstudentgroup bysnamehaving

count(sname) > 1;37、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;selectcourse_id,avg(score) asavg_scorefromscoregroup bycourse_idorder byavg_score,

course_iddesc;38、查询课程名称为“数学”,且分数低于60的学生姓名和分数;selectstudent.sname,

t1.scorefromstudentinner join(selectscore.student_id,

score.scorefromscoreinner join course on score.course_id =course.cidwherecourse.cname= '数学'

and score.score < 60)as t1 on student.sid =t1.student_id;39、查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;selectsid,

snamefromstudentwhere sid in(selectstudent_idfromscorewherecourse_id= 3

and score > 80);40、求选修了课程的学生人数selectcourse_id,count(student_id) ascount_studentfromscoregroup bycourse_id;41、查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;

# 教的课可能包含多门,按课程id来分的!包含了最高,最低成绩相等的情况selectstudent.sname,

t2.course_id,

t2.score,

t2.max_score,

t2.min_scorefromstudentinner join(selectscore.student_id,

score.course_id,

score.score,

t1.max_score,

t1.min_scorefromscore,

(selectcourse_id,max(score) asmax_score ,min(score) asmin_scorefromscorewherecourse_idin(selectcidfromcourseinner join teacher on course.teacher_id =teacher.tidwhereteacher.tname= '王五')group bycourse_id

)ast1wherescore.course_id=t1.course_idand score.score in(

max_score,

min_score

)

)as t2 on student.sid =t2.student_id;42、查询各个课程及相应的选修人数;

# 包含了没有被选修的课程显示0selectcourse.cname,

ifnull(t1.count_student,0) ascount_studentfromcourseleft join(selectcourse_id,count(student_id) ascount_studentfromscoregroup bycourse_id

)as t1 on course.cid =t1.course_id;43、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;

# 不同的学生之间,成绩相同 这里有问题!!select distincts1.student_id,

s2.student_id,

s1.course_idass1_course_id,

s2.course_idass2_course_id,

s1.score,

s2.scorefromscoreass1,

scoreass2wheres1.course_id!=s2.course_idand s1.score =s2.score;select distinct# 同一个学生,成绩相同

s1.student_id,

s2.student_id,

s1.course_idass1_course_id,

s2.course_idass2_course_id,

s1.score,

s2.scorefromscoreass1,

scoreass2wheres1.student_id=s2.student_idand s1.course_id !=s2.course_idand s1.score =s2.score;44、查询每门课程成绩最好的前两名学生id和姓名;

# 这个有排名 包括了成绩相同的!selectc.sname,

d.cname,

a.scorefromscore ainner join(selectcourse_id, score, rankfrom(select a.course_id, a.score, count(*) asrankfrom (selectcourse_id, scorefromscoregroup bycourse_id, scoreorder by course_id, score desc) ainner join (selectcourse_id, scorefromscoregroup bycourse_id, scoreorder by course_id, score desc) bon a.course_id =b.course_idand a.score <=b.scoregroup bycourse_id, score

) t1where rank in (1, 2)order bycourse_id, rank

) bon a.course_id =b.course_idand a.score =b.scoreinner joinstudent con a.student_id =c.sidinner joincourse don a.course_id =d.cid;45、检索至少选修两门课程的学生学号;selectstudent_idfromscoregroup bystudent_idhaving

count(course_id) >= 2;46、查询没有学生选修的课程的课程号和课程名;selectcid,

cnamefromcoursewherecidnot in(selectcourse_idfromscoregroup bycourse_id

);47、查询没带过任何班级的老师id和姓名;selecttid,

tnamefromteacherwheretidnot in(selecttidfromteach2clsgroup bytid

);48、查询有两门以上课程超过80分的学生id及其平均成绩;selectstudent_id,avg(score) asavg_scorefromscorewherestudent_idin(selectstudent_idfromscorewherescore> 80

group bystudent_idhaving

count(course_id) > 2)group bystudent_id;49、检索“3”课程分数小于60,按分数降序排列的同学学号;selectstudent_id,

scorefromscorewherecourse_id= 3

and score < 60

order byscoredesc;50、删除编号为“2”的同学的“1”课程的成绩;delete fromscorewheresid=(selectt1.sidfrom(selectsidfromscorewherestudent_id= 2

and course_id = 1)ast1

);51、查询同时选修了物理课和生物课的学生id和姓名;selectsid,

snamefromstudentwheresidin(selectstudent_idfromscorewherecourse_idin(selectcidfromcoursewherecourse.cnamein('物理','生物')

)group bystudent_idhaving

count(course_id) = 2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值