1. 程式人生 > >Mysql綜合練習作業50題

Mysql綜合練習作業50題

count .cn from values caption avi name rom 女生


#作業庫
create database db8 charset utf8;

#年級表
create table class_grade(
gid int not null primary key auto_increment,
gname varchar(20) not null unique
);

#班級表
create table class(
cid int primary key auto_increment,
caption varchar(20) not null,
grade_id int not null,
foreign key(grade_id) references class_grade(gid)
);

#學生表
create table student(
sid int primary key auto_increment,
sname varchar(20) not null,
gender enum("女",‘男‘) not null,
class_id int not null,
foreign key(class_id) references class(cid)
);

#老師表
create table teacher(
tid int primary key auto_increment,
tname varchar(20) not null
);

#課程表
create table course(
cid int primary key auto_increment,
cname varchar(20) not null,
teacher_id int not null,
foreign key(teacher_id) references teacher(tid)
);

#成績表
create table score(
sid int not null unique auto_increment,
student_id int not null,
course_id int not null,
score int not null,
primary key(student_id,course_id),
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
);

#班級任職表
create table teach2cls(
tcid int unique not null auto_increment,
tid int not null,
cid int not null,
primary key(tid,cid),
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 into class_grade(gname) values #4個年級
(‘一年級‘),
(‘二年級‘),
(‘三年級‘),
(‘四年級‘);


insert into class(caption,grade_id) values #9個
(‘一年一班‘,1),
(‘一年二班‘,1),
(‘一年三班‘,1),
(‘二年一班‘,2),
(‘二年二班‘,2),
(‘三年一班‘,3),
(‘三年二班‘,3),
(‘四年一班‘,4),
(‘四年二班‘,4);


insert into student(sname,gender,class_id) values #12個學生
(‘Jane‘,‘女‘,1),
(‘Rose‘,‘女‘,1),
(‘Jack‘,‘男‘,2),
(‘Alice‘,‘女‘,2),
(‘Alex‘,‘男‘,3),
(‘Drigon‘,‘男‘,4),
(‘Lily‘,‘女‘,5),
(‘Lucy‘,‘女‘,6),
("Jone",‘男‘,6),
(‘紫霞‘,‘女‘,7),
(‘張尊寶‘,‘男‘,8),
(‘高圓圓‘,‘女‘,9);

insert into teacher(tname) values #4個老師
(‘曹顯‘),
(‘王浩‘),
(‘王五‘),
(‘趙坤‘);

insert into course(cname,teacher_id) values #6門課程
(‘生物‘,1),
(‘物理‘,2),
(‘化學‘,3),
(‘語文‘,3),
(‘數學‘,4),
(‘地理‘,2);

#12個學生,6門課程
insert into score(student_id,course_id,score) values
(1,1,60),
(1,2,59),
(2,4,60),
(2,5,59),
(2,6,33),
(3,1,59),
(3,5,28),
(4,4,100),
(4,6,90),
(5,4,88),
(6,5,100),
(6,6,60),
(7,3,57),
(7,5,60),
(8,2,61),
(8,4,59),
(9,1,60),
(9,2,61),
(9,3,21),
(10,5,68),
(11,1,89),
(12,3,100);

insert into teach2cls(tid,cid) values #4個老師 9個班級
(1,1),
(1,2),
(1,3),
(1,7),
(2,4),
(2,8),
(2,7),
(2,5),
(3,9),
(3,3),
(3,5),
(3,2),
(4,8),
(4,4),
(4,6),
(4,1);


# 4個老師 9個班級
insert into teach2cls(tid,cid) values
(1,1),
(1,2),
(1,3),
(1,7),
(2,4),
(2,8),
(2,7),
(2,5),
(3,9),
(3,3),
(3,5),
(3,2),
(4,8),
(4,4),
(4,6),
(4,1);

二、操作表
1、自行創建測試數據;
2、查詢學生總人數;

select count(sid) 學生總人數 from student;

3、查詢“生物”課程和“物理”課程成績都及格的學生id和姓名;

select sid 學生ID,sname 姓名 from student
where
sid in (
select student_id from score inner join
course on score.course_id = course.cid
where cname in (
"生物",
"物理")
and score.score >= 60
group by score.student_id
having count(course_id) =2
);

4、查詢每個年級的班級數,取出班級數最多的前三個年級;
select gname 年級 from class_grade inner join(
select grade_id from class
group by grade_id
order by count(caption) desc
limit 3
) t1 on t1.grade_id = class_grade.gid;

5、查詢平均成績最高和最低的學生的id和姓名以及平均成績;

select student.sid,student.sname,t1.avg_score
from student inner join(
select student_id ,avg(score) avg_score from score
group by student_id
having student_id in (
(select student_id from score
group by student_id
order by avg(score) desc
limit 1),
(select student_id from score
group by student_id
order by avg(score) asc
limit 1)
)) t1 on t1.student_id = student.sid;


6、查詢每個年級的學生人數;
select class_grade.gid,gname,t1.count_sid
from class_grade inner join(
select grade_id, count(sid) count_sid
from class inner join student
on class.cid = student.class_id
group by grade_id
) t1 on t1.grade_id = class_grade.gid;


7、查詢每位學生的學號,姓名,選課數,平均成績;

select
student_id,sname,t1.count_course,t1.avg_score
from student inner join(
select
student_id,count(course_id) count_course,avg(score) avg_score
from score
group by student_id
) t1 on student.sid = t1.student_id;

8、查詢學生編號為“2”的學生的姓名、該學生成績最高的課程名、成績最低的課程名及分數;

select
student.sid,student.sname,course.cname,t1.score
from (
select student_id,course_id,score
from score
where student_id = 2
and score in(
(select
max(score)
from score where student_id = 2),
(select
min(score)
from score where student_id = 2)
) ) t1
inner join student on t1.student_id = student.sid
inner join course on course.cid = t1.course_id;

9、查詢姓“李”的老師的個數和所帶班級數;

select
count(teacher.tname) 姓李的老師個數,
count(teach2cls.cid) 帶班級數
from teacher left join teach2cls
on teacher.tid = teach2cls.tid
where teacher.tname like ‘李%‘;

10、查詢班級數小於5的年級id和年級名;
select
gid 年級id,
gname 年級名,
count(cid)
from class inner join class_grade
on class.grade_id = class_grade.gid
group by gid
having count(cid) <5;


11、查詢班級信息,包括班級id、班級名稱、年級、年級級別(12為低年級,34為中年級,56為高年級),示例結果
如下;

select
class.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 "年級級別"
from class inner join class_grade
on class.grade_id = class_grade.gid;

12、查詢學過“張三”老師2門課以上的同學的學號、姓名;
select
student.sid ‘學號‘,
student.sname ‘姓名‘
from
student
inner join(
select
student_id
from score
where score.course_id in (
select course.cid from course
where teacher_id in(
select tid from teacher
where tname = ‘張三‘
)
) group by student_id
having count(course_id) >2
) as t1 on student.sid = t1.student_id;

13、查詢教授課程超過2門的老師的id和姓名;
select
tid ‘老師id‘,
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 distinct student_id
from score where course_id in (1,2)
);

15、查詢沒有帶過高年級的老師id和姓名;
select
tid ‘老師id‘,
tname ‘姓名‘
from
teacher
where tid in (

select distinct
teach2cls.tid
from teach2cls inner join class on
teach2cls.cid = class.cid
where class.grade_id not in (5,6)
);


16、查詢學過“張三”老師所教的所有課的同學的學號、姓名;
select
sid ‘學號‘,
sname ‘姓名‘
from
student
where sid in (
select distinct student_id from
score where course_id in(
select cid from course inner join teacher
on course.teacher_id = teacher.tid
where tname = ‘張三‘
)
);


17、查詢帶過超過2個班級的老師的id和姓名;
select
tid ‘id‘,
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
t2.student_id
from (select * from score
where course_id = 2) t2
inner join(
select * from score
where course_id = 1
) t1 on t2.student_id = t1.student_id
where t2.score < t1.score
)

19、查詢所帶班級數最多的老師id和姓名;
select
tid ‘id‘,
tname ‘姓名‘ #3、取得結果
from
teacher
where tid in (
select tid from teach2cls cls #2、根據數值取出並列的老師ID
group by tid
having count(cid) = (
select count(cid) from teach2cls #1、求出帶班級數最多的數值
group by tid
order by count(cid) desc
limit 1
)
);



20、查詢有課程成績小於60分的同學的學號、姓名;
select
sid ‘學號‘,
sname ‘姓名‘
from
student where sid in (
select distinct student_id from score
where score.score < 60
);


21、查詢沒有學全所有課的同學的學號、姓名;
select
sid ‘學號‘,
sname ‘姓名‘
from
student where sid in(
select student_id from score
group by student_id
having count(course_id) < (select count(cid) from course)
);

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 group by course_id
)
);

23、查詢至少學過學號為“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
) having student_id != 1
);

24、查詢和“2”號同學學習的課程完全相同的其他同學的學號和姓名;
select
sid "學號",
sname ‘姓名‘
from student
where sid in (
select score.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 teacher,course
where teacher_id = tid and tname = "張三"
)

26、向score表中插入一些記錄,這些記錄要求符合以下條件:①沒有上過編號“2”課程的同學學號;②插入“2”號課程的平均成績;

insert into 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
sc.student_id 學生ID,
(select
score.score from score left join course on score.course_id=course.cid where course.cname=‘語文‘
and score.student_id = sc.student_id
)as 語文,
(select
score.score from score left join course on score.course_id = course.cid where course.cname=‘數學‘
and score.student_id=sc.student_id
)as 數學,
(select
score.score from score left join course on score.course_id = course.cid where course.cname=‘英語‘
and score.student_id=sc.student_id
)as 英語,
count(sc.course_id) 課程數,
avg(sc.score) 平均分
from score as sc
group by
sc.student_id
order by
avg(sc.score) asc;


28、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;


select
course_id 課程ID,
max(score) 最高分,
min(score) 最低分
from
score
group by course_id;

29、按各科平均成績從低到高和及格率的百分數從高到低順序;

select
course_id,
avg(score) ‘平均成績‘,
(sum(case when score >= 60 then 1 else 0 end) / count(score)) *100 ‘及格率‘
from
score
group by
course_id
order by
avg(score) asc,
‘及格率‘ desc;

30、課程平均分從高到低顯示(現實任課老師);

select
t1.course_id ‘課程ID‘,
t1.avg_score ‘平均分‘,
teacher.tname ‘老師‘
from course,teacher,
(
select course_id,avg(score) as avg_score from score
group by course_id
order by avg_score desc
) as t1
where
course.cid = t1.course_id
and course.teacher_id = teacher.tid
order by
t1.avg_score desc;


31、查詢各科成績前三名的記錄(不考慮成績並列情況) ;

select
score.sid,
score.student_id ‘學生ID‘,
score.course_id ‘課程ID‘,
score.score ,
t1.first_score ,
t1.second_score ,
t1.third_score
from score inner join(
select
s1.sid,
(select score from score as s2 where s1.course_id=s2.course_id order by score desc limit 0,1) as first_score,
(select score from score as s3 where s1.course_id=s3.course_id order by score desc limit 1,1) as second_score,
(select score from score as s4 where s1.course_id=s4.course_id order by score desc limit 2,1) as third_score

from score as s1
) as t1 on score.sid = t1.sid
where score.score in(
t1.first_score,
t1.second_score,
t1.third_score

);

32、查詢每門課程被選修的學生數;

select course.cid ‘課程ID‘,
ifnull(t1.count_students,0) as ‘選修學生數‘
from course left join (
select course_id,count(student_id) as count_students
from score
group by
course_id
) as t1 on course.cid = t1.course_id;

#第二種
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) as count_student
from student
group by gender
order by count_student desc;


35、查詢姓“張”的學生名單;

select sid,sname,gender,class.caption
from student inner join class on student.class_id = class.cid
where sname like ‘張%‘;

#第二種方法
select * from student where sname like "張%";

36、查詢同名同姓學生名單,並統計同名人數;

SELECT sname as ‘名字‘,count(sname) as ‘同名人數‘ from student
GROUP BY sname
HAVING count(sname) >1

select sname,count(sname) from student group by sname
having count(sname) >1


37、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;

select cid,cname,avg(score.score) as avg_score from course
inner join score on course.cid = score.course_id
group by cid
having avg(score.score)
order by avg(score.score),
course_id desc;

38、查詢課程名稱為“數學”,且分數低於60的學生姓名和分數;

select student.sid,student.sname,t1.score from student
inner join (
select score.student_id,score.score from score
inner join course on score.course_id=course.cid
where cname=‘數學‘
and score.score<60
)as t1 on student.sid=t1.student_id;


select student.sid,student.sname,t1.score from student
right join
(select student_id,score from score where course_id in(
select cid from course where cname = ‘數學‘
) having score < 60) t1 on t1.student_id = student.sid;

39、查詢課程編號為“3”且課程成績在80分以上的學生的學號和姓名;

select student.sid,student.sname,t1.score from student
inner join(
select score.student_id,score.score from score
inner join course on score.course_id=course.cid
where cid=3
and score.score>80
)as t1 on student.sid = t1.student_id;


select sid, sname from student where sid in(
select student_id from score where course_id = 3 and score > 80
)
40、求選修了課程的學生人數

select course_id,count(student_id) as count_student
from score
group by course_id;


41、查詢選修“王五”老師所授課程的學生中,成績最高和最低的學生姓名及其成績;

select student.sid,student.sname,t2.course_id,t2.score,t2.max_score,t2.min_score from student
inner join (
select score.student_id,score.course_id,score.score,t1.max_score,t1.min_score
from score,
(
select course_id,max(score) as max_score,min(score) as min_score
from score
where course_id in (
select cid from course
inner join teacher on course.teacher_id = teacher.tid
where teacher.tname = ‘王五‘
)
group by course_id
) as t1
where score.course_id = t1.course_id
and score.score in(
max_score,
min_score
)

)as t2 on student.sid = t2.student_id;

#第二種方法
select t1.max_sname,t1.t1.max_score ,
t2.min_sname,t2.t2.min_score
from (
select t1.student_id,sname max_sname,t1.max_score from student inner join (
select student_id,score max_score from score where course_id in
(select cid from teacher,course
where teacher.tid = course.teacher_id
and tname = ‘王五‘
) order by score desc
limit 1 ) t1 on student.sid = t1.student_id) t1,
(
select t2.student_id,sname min_sname,t2.min_score from student inner join (
select student_id,score min_score from score where course_id in
(select cid from teacher,course
where teacher.tid = course.teacher_id
and tname = ‘王五‘
) order by score asc
limit 1 ) t2 on student.sid = t2.student_id
)t2

42、查詢各個課程及相應的選修人數;

select course.cid,course.cname,count(student_id) as count_student from course
inner join score on course.cid = score.course_id
group by course.cid
having count(student_id);

43、查詢不同課程但成績相同的學生的學號、課程號、學生成績;

select distinct s1.student_id,s2.student_id,
s1.course_id as s1_course_id,
s2.course_id as s2_course_id,
s1.score,s2.score
from
score as s1,
score as s2
where s1.student_id = s2.student_id
and s1.course_id != s2.course_id
and s1.score = s2.score;


44、查詢每門課程成績最好的前兩名學生id和姓名;

select
student.sid,
student.sname,
t2.course_id,
t2.score,
t2.first_score,
t2.second_score
from
student
inner join (
select
score.student_id,
score.course_id,
score.score,
t1.first_score,
t1.second_score
from
score
inner join (
select
s1.sid,
(select s2.score from score as s2 where s1.course_id = s2.course_id order by s2.score desc limit 0,1) as first_score,
(select s3.score from score as s3 where s1.course_id = s3.course_id order by s3.score desc limit 1,1) as second_score
from
score as s1
) as t1 on score.sid = t1.sid
where
score.score in (
t1.first_score,
t1.second_score
)) as t2 on student.sid = t2.student_id;

45、檢索至少選修兩門課程的學生學號;

select student_id,student.sname from score inner join student on score.student_id = student.sid
group by student_id
having count(course_id)>=2;

46、查詢沒有學生選修的課程的課程號和課程名;

select course.cid,course.cname from course
where course.cid not in (
select course_id from score
group by course_id
);

47、查詢沒帶過任何班級的老師id和姓名;

select teacher.tid,teacher.tname from teacher
where teacher.tid not in(
select tid from teach2cls
group by tid
);

48、查詢有兩門以上課程超過80分的學生id及其平均成績;

select score.student_id,avg(score) as avg_score from score
where student_id in (
select student_id from score
where score>80
group by student_id
having count(score.course_id)>2
)
group by student_id;

49、檢索“3”課程分數小於60,按分數降序排列的同學學號;

select score.student_id,score.score from score
where score<60
and course_id = 3
order by score.score desc;

50、刪除編號為“2”的同學的“1”課程的成績;


delete from score where sid=(
select t1.sid from (
select sid from score
where student_id = 2 and course_id = 1
)as t1
);

51、查詢同時選修了物理課和生物課的學生id和姓名;

select sid,sname from student
where sid in(
select student_id from score
where course_id in(
select cid from course
where course.cname in(
‘物理‘,
‘生物‘)
)
group by student_id
having count(course_id)=2
);

Mysql綜合練習作業50題