mysql综合应用题是填空吗_MySQL综合练习题

题目:

请创建如下表,并创建相关约束

班级表:class学生表:student

cidcaptiongrade_idsidsnamegenderclass_id

1一年一班11乔丹女1

2二年一班22艾弗森女1

3三年二班33科比男2

老师表:teacher课程表:course

tidtnamecidcnameteacher_id

1张三1生物1

2李四2体育1

3王五3物理2

成绩表:score年级表:class_grade

sidstudent_idcourse_idscoregidgname

111601一年级

212592二年级

322993三年级

班级任职表:teach2cls

tcidtidcid

111

212

321

432

二、操作表

1、自行创建测试数据;

2、查询学生总人数;

3、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;

4、查询每个年级的班级数,取出班级数最多的前三个年级;

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

6、查询每个年级的学生人数;

7、查询每位学生的学号,姓名,选课数,平均成绩;

8、查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名、成绩最低的课程名及分数;

9、查询姓“李”的老师的个数和所带班级数;

10、查询班级数小于5的年级id和年级名;

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

班级id班级名称年级年级级别

1一年一班一年级低

12、查询学过“张三”老师2门课以上的同学的学号、姓名;

13、查询教授课程超过2门的老师的id和姓名;

14、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;

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

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

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

18、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;

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

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

21、查询没有学全所有课的同学的学号、姓名;

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

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

24、查询和“2”号同学学习的课程完全相同的其他同学的学号和姓名;

25、删除学习“张三”老师课的score表记录;

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

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

28、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

29、按各科平均成绩从低到高和及格率的百分数从高到低顺序;

30、课程平均分从高到低显示(现实任课老师);

31、查询各科成绩前三名的记录(不考虑成绩并列情况)

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

33、查询选修了2门以上课程的全部学生的学号和姓名;

34、查询男生、女生的人数,按倒序排列;

35、查询姓“张”的学生名单;

36、查询同名同姓学生名单,并统计同名人数;

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

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

39、查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;

40、求选修了课程的学生人数

41、查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;

42、查询各个课程及相应的选修人数;

43、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;

44、查询每门课程成绩最好的前两名学生id和姓名;

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

46、查询没有学生选修的课程的课程号和课程名;

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

48、查询有两门以上课程超过80分的学生id及其平均成绩;

49、检索“3”课程分数小于60,按分数降序排列的同学学号;

50、删除编号为“2”的同学的“1”课程的成绩;

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

答案:

创建表:

create table class(

cid int primary key auto_increment,

caption char(6),

grade_id int not null

);

insert class(caption,grade_id) values ('一年一班',1),('二年一班',2),('三年二班',3);

create table student(

sid int primary key auto_increment,

sname char(6) not null,

gender enum('女','男') default '男',

class_id int not null ,

foreign key(class_id) references class(cid)

on delete cascade

on update cascade

);

insert student(sname,gender,class_id) values ('乔丹','女',1),('艾弗森','女',1),('科比','男',2);

create table teacher(

tid int auto_increment,

tname char(6) not null,

primary key(tid)

);

insert teacher (tname) values ('张三'),('李四'),('王五');

create table course(

cid int primary key auto_increment,

cname char(6) not null,

teacher_id int,

foreign key(teacher_id) references teacher(tid)

on delete cascade

on update cascade

);

insert course(cname,teacher_id) values('生物',1),('体育',1),('物理',2);

create table score(

sid int auto_increment,

student_id int not null,

course_id int not null,

score int ,

primary key (sid),

foreign key (student_id) references student(sid) on delete cascade on update cascade,

foreign key (course_id) references course(cid) on delete cascade on update cascade);

insert score (student_id, course_id,score) values(1,1,60),(1,2,59),(2,2,99);

create table class_grade(

gid int auto_increment,

gname char(6) not null,

primary key (gid)

);

insert class_grade(gname) values ('一年级'),('二年级'),('三年级');

create table teach2cls(

tcid int primary key auto_increment,

tid int not null,

cid int not null,

foreign key(tid) references teacher(tid) on delete cascade on update cascade,

foreign key (cid) references class(cid) on delete cascade on update cascade);

insert teach2cls (tid,cid) values(1,1),(1,2),(2,1),(3,2);

补充数据

insert class_grade(gname) values ('四年级'),('五年级'),('六年级');

insert class(caption,grade_id) values ('四年一班',4),('五年三班',5),('五年一班',5),('六年二班',6);

insert teacher (tname) values ('赵柳'),('孙策'),('狄仁杰'),("李新");

insert teach2cls (tid,cid) values(4,6),(5,5),(6,4),(6,2);

insert course(cname,teacher_id) values('语文',4),('数学',5),('英语',6),('化学',3),('美术',4);

insert student(sname,gender,class_id) values

('alsa','女',4),('lily','女',5),('jack','男',6),('alsa','女',7),

('lucy','女',1),('bob','男',3),('乔丹','女',4),('nico','女',5),

('alex','男',3),('张良',男',4),('lily','女',2),('jack','男',7),

("kitty",'女',5),('诸葛','男',5),('妲己','女',4),('甄姬','女',6);

insert score (student_id, course_id,score) values

(4,1,58),(5,2,88),(6,3,73),(16,4,75),(16,5,92),

(7,4,65),(8,5,98),(9,6,72),(16,6,88),(17,7,63),(18,7,77),(19,7,90),

(11,3,81),(10,5,85),(12,1,63),(12,2,87),

(13,6,55),(14,3,55),(15,5,41),(6,1,80);

答案:

# 2、查询学生总人数;

select

count(sid)

from

student;

# 3、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;

select

sid,sname

from

student where sid in(

select

student_id

from

score

inner join

course

on

score.course_id = course.cid

where

cname='生物' or cname='物理' and score>=60

group by

score.student_id

having

count(course_id)=2

);

# 4、查询每个年级的班级数,取出班级数最多的前三个年级;

select

grade_id,

count(grade_id) as num

from

class

group by

grade_id

order by count(grade_id) desc

limit 3;

# 5、查询平均成绩最高和最低的学生的id和姓名以及平均成绩;

select

sid,

sname,

t1.avg_score

from

student

inner join(

select

student_id,

avg(score)as avg_score

from

score

group by

student_id

having

avg(score) in(

(select avg(score)as low_score from score group by student_id order by avg(score) limit 1),

(select avg(score)as high_score from score group by student_id order by avg(score) desc limit 1))

)as t1

on

student.sid=t1.student_id;

# 6、查询每个年级的学生人数;

select

gname,

count(sid)as student_count

from

student

inner join(

select

*

from

class_grade

inner join

class

on

class_grade.gid=class.grade_id

)as t1

on

student.class_id=t1.cid

group by

gid;

# 7、查询每位学生的学号,姓名,选课数,平均成绩;

select

sid,

sname,

t1.total_course,

t1.avg_score

from

student

left join(

select

student_id,

count(course_id)as total_course,

avg(score)as avg_score

from

score

group by

student_id

)as t1

on

student.sid=t1.student_id;

# 8、查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名、成绩最低的课程名及分数;

select

sid,

sname,

t1.course_id,

t1.score

from

student

inner join(

select

student_id,

course_id,

score

from

score

where

score in(

(select score from score where student_id=2 order by score desc limit 1),

(select score from score where student_id=2 order by score limit 1 )

)

)as t1

on

student.sid=t1.student_id;

# 9、查询姓“李”的老师的个数和所带班级数;

select

total_teach,

count(teach2cls.cid)as total_class

from

teach2cls

inner join(

select

tid,

count(tid)as total_teach

from

teacher

where

tname like "李%"

)as teach

on

teach2cls.tid=teach.tid

group by

teach2cls.tid;

# 10、查询班级数小于5的年级id和年级名;

select

gid, gname from class_grade

inner join(

select

grade_id,

count(cid) as class_count

from

class

group by

grade_id

) as t1

on

class_grade.gid = t1.grade_id

where

t1.class_count<5;

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

班级id班级名称年级年级级别

1 一年一班一年级 低

select

class.cid as '班级id',

class.caption as '班级名称',

class_grade.gname as '年级',

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 '年级级别'

from

class,

class_grade

where

class.grade_id = class_grade.gid;

# 12、查询学过“张三”老师2门课以上的同学的学号、姓名;

select

sid,

sname

from

student

where

sid in(

select

student_id

from

score

inner join(

select

cid

from

course

where

teacher_id =(

select

tid

from

teacher

where

tname='张三'

)

)as t1

on

score.course_id=t1.cid

group by

student_id

having

count(course_id)=2

);

# 13、查询教授课程超过2门的老师的id和姓名;

select

tid,

tname

from

teacher

where tid in (

select

teacher_id

from

course

group by

teacher_id

having

count(cid)>=2

);

# 14、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;

select

sid,

sname

from

student

where

sid in (

select

student_id

from

score

where

course_id='1' or course_id='2'

group by

student_id

having

count(course_id)=2

);

# 15、查询没有带过高年级的老师id和姓名

select

tid,

tname

from

teacher

where

tid not in(

select

distinct tid

from

teach2cls

where

cid in (

select

cid

from

class

where

grade_id in (

select

gid

from

class_grade

where

gname='五年级' or gname='六年级'

)

)

);

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

select

sid,

sname

from

student

where sid in (

select distinct student_id from score where course_id in (

select cid from course where teacher_id in(

select tid from teacher where tname='张三'

)

)

);

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

select

tid,

tname

from

teacher

where tid in (

select

tid

from

teach2cls

group by

tid

having

count(cid)>2

);

# 18、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;

select

sid,

sname

from student

where sid in (

select s1.student_id

from score as s1 inner join score as s2 on s1.student_id = s2.student_id and s1.course_id = 1 and s2.course_id = 2

where s1.score < s2.score);

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

select

tid,

tname

from

teacher

where

tid in (

select

tid

from

teach2cls

group by

tid

having

count(cid)=(

select

count(cid)

from

teach2cls

group by

tid

order by

count(cid) desc

limit 1

)

);

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

select

sid,

sname

from

student

where

sid in (

select

student_id

from

score

where

score<60

);

# 21、查询没有学全所有课的同学的学号、姓名;

select

sid,

sname

from

student

left join (

select

student_id

from

score

group by

student_id

having

count(course_id)=(

select count(cid) from course)

)as t1

on

student.sid=t1.student_id

where

t1.student_id is null;

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

select

sid,sname

from

student

where

sid in (

select

distinct student_id

from

score

where

course_id in(

select

course_id

from

score

where

student_id =1

)

)

and sid !=1;

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

select

distinct sid,

sname

from

student

where

sid in (

select

student_id

from

score

where

course_id in (

select

course_id

from

score

where

student_id=1

)

and student_id!=1

);

# 24、查询和“2”号同学学习的课程完全相同的其他同学的学号和姓名;

select

sid,

sname

from

student

where sid in (

select student_id from score,

(select course_id from score where student_id=2)as t1

where score.course_id = t1.course_id and score.student_id !=2 group by score.student_id

having count(score.course_id)=(select count(course_id)from score where student_id=2)

);

# 25、删除学习“张三”老师课的score表记录;

delete from score where course_id in (

select cid from course where teacher_id =(

select tid from teacher where tname='张三')

);

# 26、向score表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“2”课程的同学学号;②插入“2”号课程的平均成绩;

insert score(student_id,course_id,score)

select t1.sid,2,t2.avg_score from(

(select sid from student where sid not in (select student_id from score where course_id = 2)) as t1,

(select avg(score)as avg_score from score where course_id = 2) as t2);

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

select

student_id,

(select score from score where course_id =(select cid from course where cname='语文') and score.student_id =s1.student_id ) as '语文',

(select score from score where course_id =(select cid from course where cname='数学') and score.student_id =s1.student_id ) as '数学',

(select score from score where course_id =(select cid from course where cname='英语') and score.student_id =s1.student_id ) as '英语',

count(course_id) as '有效课程数',

avg(score) as '有效平均分'

from

score as s1

group by

student_id

order by

avg(score);

# 28、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

select

course_id as id,

max(score.score) as '最高分',

min(score.score) as '最低分'

from

course

left join score

on score.course_id=course.cid

group by course_id;

# 29、按各科平均成绩从低到高和及格率的百分数从高到低顺序;

select course_id,

avg(score) as avg_score,

sum(case when score.score >= 60 then 1 else 0 end) / count(sid) * 100 as percent

from

score

group by

course_id

order by

avg(score) asc,percent desc;

# 30、课程平均分从高到低显示(现实任课老师);

select

t1.cid,

t1.tname,

t2.avg_score

from(

select

teacher.tid as tid,

teacher.tname as tname,

course.cid as cid

from

teacher

inner join

course

on teacher.tid = teacher_id

)as t1

inner join

(select course_id,avg(score)as avg_score from score group by course_id )as t2

on

t1.cid=t2.course_id

order by

avg_score desc;

# 31、查询各科成绩前三名的记录(不考虑成绩并列情况)

select

student_id,

score,

course_id

from score r1

where (SELECT count(1)

from (select distinct

score,

course_id

from score) r2

where r2.course_id = r1.course_id AND r2.score > r1.score) <= 2

order by course_id, score DESC;

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

select

course_id,

count(student_id)

from

score

group by

course_id;

# 33、查询选修了2门以上课程的全部学生的学号和姓名;

select

sid,

sname

from

student

where sid in(

select

student_id

from

score

group by

student_id

having

count(course_id)>2);

# 34、查询男生、女生的人数,按倒序排列;

select

gender,

count(sid)

from

student

group by

gender

order by

count(sid) desc;

# 35、查询姓“张”的学生名单;

select

*

from

student

where

sname like "张%";

# 36、查询同名同姓学生名单,并统计同名人数;

select

sname,

count(sid)

from

student

group by

sname

having

count(sid)>1;

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

select

course_id,

avg(score)

from

score

group by

course_id

order by

avg(score),

course_id desc;

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

select

student.sname,

t1.score

from

student

inner join (

select

student_id,

score

from

score

where score.score<60 and course_id in (

select

cid

from

course

where cname='数学'

)

)as t1

on

t1.student_id=student.sid;

# 39、查询课程编号为“3”且课程成绩在80分以上的学生的学号和姓名;

select

sid,

sname

from

student

where sid in(

select

student_id

from

score

where

course_id=3 and score>80

);

# 40、求选修了课程的学生人数

select

coalesce(student_id,"总人数")as id,

count(course_id)

from

score

group by

student_id

with rollup;

# 41、查询选修“王五”老师所授课程的学生中,成绩最高和最低的学生姓名及其成绩;

select

s1.student_id,

low_score,

s2.student_id,

high_score

from(

select

tid,

student_id,

score as low_score

from

(select student_id,cid,cname,score,tid

from score

inner join

(select tid,tname,cid,cname from teacher inner join course on teacher.tid=course.teacher_id where tname='王五')as t1

on score.course_id=t1.cid)as t2 order by score limit 1) as s1

inner join (

select tid,student_id,score as high_score from

(select student_id,cid,cname,score,tid

from score

inner join

(select tid,tname,cid,cname from teacher

inner join

course

on teacher.tid=course.teacher_id where tname='王五')as t1

on score.course_id=t1.cid)as t2 order by score desc limit 1) as s2

on s1.tid=s2.tid;

# 42、查询各个课程及相应的选修人数;

select

course_id ,

count(student_id)

from

score

group by

course_id;

# 43、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;

select distinct

s1.course_id,

s1.student_id,

s1.score,

s2.course_id,

s2.student_id,

s2.score

from

score as s1,

score as s2

where

s1.score = s2.score and s1.course_id != s2.course_id;

# 44、查询每门课程成绩最好的前两名学生id和姓名;

select student.sid,student.sname,course.cname, score.score

from score

inner join (

select course_id, score, ranking

from (

select a.course_id, a.score, count(1) as ranking

from

(select course_id, score from score group by course_id, score order by course_id, score desc)as a

inner join

(select course_id, score from score group by course_id, score order by course_id, score desc)as b

on a.course_id = b.course_id and a.score <= b.score group by course_id, score

) as t1

where ranking in (1, 2) order by course_id, ranking)as s1

on score.course_id = s1.course_id and score.score = s1.score

inner join student

on score.student_id = student.sid

inner join course

on score.course_id = course.cid;

# 45、检索至少选修两门课程的学生学号;

select

student_id

from

score

group by

student_id

having

count(course_id)>=2;

# 46、查询没有学生选修的课程的课程号和课程名;

select

course.cid,

course.cname

from

course

left join

score

on

course.cid=score.course_id

where

score.student_id is null;

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

select

teacher.tid,

tname

from

teacher

left join

teach2cls

on

teacher.tid=teach2cls.tid

where

teach2cls.tcid is null;

# 48、查询有两门以上课程超过80分的学生id及其平均成绩;

select

student_id,

avg(score)

from

score

where

score>80

group by

student_id

having

count(course_id)>2;

# 49、检索“3”课程分数小于60,按分数降序排列的同学学号;

select

student_id,

score

from

score

where

score<60 and course_id=3

order by

score desc;

# 50、删除编号为“2”的同学的“1”课程的成绩;

delete from score where student_id='2' and course_id='1';

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

select

student.sid,

student.sname

from

student

where sid in (

select

student_id

from

score

where

course_id IN (

select

cid

from

course

where cname = '物理' or cname = '生物'

)

group by

student_id

having

count(course_id) = 2

);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值