网传MySQL题库解答第二弹--45题版(内附第一弹链接)

在广受关注的50题基础上,又附上大家心心念念搜索的第二份题库,附上自己的解答;
如有错误欢迎纠正~
第一篇题目及解答文章链接如下:
SQL 50题及解答
—————————————————————————————
另附个人期间所使用工具
sqlfiddle在线工具
网页版方便个人在闲暇时间的小题目练习

————————————————

题目

设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher),请完成题目。

数据源:

表(一)Student:

Sno Sname Ssex Sbirthday class
108 曾华 男 1977-09-01 95033
105 匡明 男 1975-10-02 95031
107 王丽 女 1976-01-23 95033
101 李军 男 1976-02-20 95033
109 王芳 女 1975-02-10 95031
103 陆君 男 1974-06-03 95031
表(二)Course:

Cno Cname Tno
3-105 计算机导论 825
3-245 操作系统 804
6-166 数字电路 856
9-888 高等数学 831
表(三)Score:

Sno Cno Degree
103 3-245 86
105 3-245 75
109 3-245 68
103 3-105 92
105 3-105 88
109 3-105 76
101 3-105 64
107 3-105 91
108 3-105 78
101 6-166 85
107 6-166 79
108 6-166 81
表(四)Teacher:

Tno Tname Tsex Tbirthday Prof Depart
804 李诚 男 1958-12-02 副教授 计算机系
856 张旭 男 1969-03-12 讲师 电子工程系
825 王萍 女 1972-05-05 助教 计算机系
831 刘冰 女 1977-08-14 助教 电子工程系

建表部分:

– 建学生信息表student

create table student(
sno varchar(20) not null ,
sname varchar(20) not null,
ssex varchar(20) not null,
sbirthday datetime,
class varchar(20),
primary key (sno)
);

– 建立教师表

create table teacher
(
tno varchar(20) not null ,
tname varchar(20) not null,
tsex varchar(20) not null,
tbirthday datetime,
prof varchar(20),
depart varchar(20) not null,
primary key (tno)
);

– 建立课程表course

create table course
(
cno varchar(20) not null ,
cname varchar(20) not null,
tno varchar(20) not null,
primary key (cno)
);

– 建立成绩表

create table score
(
sno varchar(20) not null ,
cno varchar(20) not null,
degree decimal
);

– 添加学生信息

insert into student values('108','曾华','男','1977-09-01','95033');
insert into student values('105','匡明','男','1975-10-02','95031');
insert into student values('107','王丽','女','1976-01-23','95033');
insert into student values('101','李军','男','1976-02-20','95033');
insert into student values('109','王芳','女','1975-02-10','95031');
insert into student values('103','陆君','男','1974-06-03','95031');

– 添加教师表

insert into teacher values('804','李诚','男','1958-12-02','副教授','计算机系');
insert into teacher values('856','张旭','男','1969-03-12','讲师','电子工程系');
insert into teacher values('825','王萍','女','1972-05-05','助教','计算机系');
insert into teacher values('831','刘冰','女','1977-08-14','助教','电子工程系');

– 添加课程表

insert into course values('3-105','计算机导论','825');
insert into course values('3-245','操作系统','804');
insert into course values('6-166','数字电路','856');
insert into course values('9-888','高等数学','831');

– 添加成绩表

insert into score values('103','3-245','86');
insert into score values('105','3-245','75');
insert into score values('109','3-245','68');
insert into score values('103','3-105','92');
insert into score values('105','3-105','88');
insert into score values('109','3-105','76');
insert into score values('103','3-105','64');
insert into score values('105','3-105','91');
insert into score values('109','3-105','78');
insert into score values('103','6-166','85');
insert into score values('105','6-166','79');
insert into score values('109','6-166','81');

题目及解答内容:

-- 1、 查询Student表中的所有记录的Sname、Ssex和Class列
select sname,ssex,class from student

-- 2、 查询教师所有的单位即不重复的Depart列
Select distinct depart from teacher

-- 3、 查询Student表的所有记录。
select * from student

-- 4、 查询Score表中成绩在60到80之间的所有记录。
select * from score where degree between 60 and 80

-- 5、 查询Score表中成绩为85,86或88的记录。
select * from score where degree in (85,86,88)

-- 6、 查询Student表中“95031”班或性别为“女”的同学记录。
select * from student 
where class = 95031 or ssex ='女'

-- 7、 以Class降序查询Student表的所有记录
select * from student 
order by class desc

-- 8、 以Cno升序、Degree降序查询Score表的所有记录。
select * from score 
order by cno asc ,degree desc

-- 9、 查询“95031”班的学生人数。
select count(sno) as snum from student
where class ='95031'

-- 10、查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
select max(sno) ,max(cno) from score

-- 11、 查询每门课的平均成绩。
select cno,avg(degree) from score group by cno

-- 12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select cno,avg(degree) from score 
group by cno
having count (sno) >=5
and cno like '3%'

-- 13、查询分数大于70,小于90的Sno列。
select sno from score
where degree >70 and degree <90

-- 14、查询所有学生的Sname、Cno和Degree列。
select a.sname ,b.cno, b.degree from student as a 
join score as b on a.sno=b.sno

-- 15、查询所有学生的Sno、Cname和Degree列。
select a.sno,b.cname,c.degree from student as a
join score as c on a.sno=c.sno
join course as b on c.cno=b.cno

-- 16、查询所有学生的Sname、Cname和Degree列
select a.sname,b.cname,c.degree from student as a
join score as c on a.sno=c.sno
join course as b on c.cno=b.cno

-- 17、查询“95033”班学生的平均分
select avg(Degree)  from Score 
where Sno in (select Sno from Student
where Class='95033')

-- 18、 假设使用如下命令建立了一个grade表:

-- create table grade(low  int(3),upp  int(3),rank  char(1))
-- insert into grade values(90,100,’A’)
-- insert into grade values(80,89,’B’)
-- insert into grade values(70,79,’C’)
-- insert into grade values(60,69,’D’)
-- insert into grade values(0,59,’E’)

-- 现查询所有同学的Sno、Cno和rank列。

select Sno,Cno,rank from Score,grade where Degree between low and upp


-- 19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select * from student as a 
left join score as b on a.sno=b.sno and b.cno='3-105'
where b.degree >(select degree from score where sno ='109' and cno= '3-105')
 
-- 21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录
select * from score
where degree > (select degree from score where sno='109' and cno='3-105')
 
-- 22、查询和学号为108、101的同学同年出生的所有学生的Sno、Sname和Sbirthday列
select sno, sname,sbirthday from student
where sbirthday in(select sbirthday from student where sno='108' or sno= '101')
 
-- 23、查询“张旭“教师任课的学生成绩。
select sno,degree from score
where cno in (select cno from course 
    where tno in (select tno from teacher
           where tname='张旭'))
 
-- 24、查询选修某课程的同学人数多于5人的教师姓名。
select a.tname from teacher as a 
join course as b on b.tno = a.tno
join score as c on c.cno = b.cno
group by b.cno
having count (*)>5
 
-- 25、查询95033班和95031班全体学生的记录
select * from Student,Score,Course 
where Student.Sno=Score.Sno and Score.Cno=Course.Cno and class = '95033' or '95031'
 
-- 26、 查询存在有85分以上成绩的课程Cno
select cno from score
group by cno
having max(degree)>=85
 
-- 27、查询出“计算机系“教师所教课程的成绩表
select cno, degree from score
where cno in (select cno from course 
     where tno in (select tno from teacher 
            where depart = '计算机系'))
 
-- 28、查询“计算 机系”与“电子工程系“不同职称的教师的Tname和Prof。
select Tname,Prof from Teacher where Prof not in (
select Prof from Teacher where Depart = '电子工程系') and Depart = '计算机系'
 
-- 29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学
-- 的Cno、Sno和Degree,并按Degree从高到低次序排序。
select a.cno,a.sno,a.degree from score as a
join score as b 
where a.cno='3-105' and b.cno='3-245'
and a.degree >(select min(c.degree) from score as c where cno='3-245')
order by a.degree desc
 
 
-- 30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree。
select a.cno,a.sno,a.degree from score as a
join score as b 
where a.cno='3-105' and b.cno='3-245'
and a.degree >(select max(c.degree) from score as c where cno='3-245')
order by a.degree desc
 
-- 31、 查询所有教师和同学的name、sex和birthday。
select sname as name,ssex as sex,sbirthday as birthday from student
union
select tname as name,tsex as sex,tbirthday as birthday from teacher
 
-- 32、查询所有“女”教师和“女”同学的name、sex和birthday。
select sname as name,ssex as sex,sbirthday as birthday from student
where ssex='女'
union
select tname as name,tsex as sex,tbirthday as birthday from teacher
where tsex='女'
 
-- 33、 查询成绩比该课程平均成绩低的同学的成绩表
select * from score  as a  where degree <
(select avg(degree) from score as  b where b.cno=a.cno)
 
-- 34、 查询所有任课教师的Tname和Depart
select tname , depart from teacher
where tno in (select tno from course)
 
-- 35.查询所有未讲课的教师的Tname和Depart。
select tname,depart from teacher
where tno not in (select tno from course)
 
-- 36、查询至少有2名男生的班号
select * from  student 
group by sno
having (select count(*) from student where ssex='男')
 
-- 37、查询Student表中不姓“王”的同学记录。
select * from student where sname not like '王%'
 
-- 38、查询Student表中每个学生的姓名和年龄。
select Sname,year(getdate())-year(Sbirthday) from Student
 
-- 39、查询Student表中最大和最小的Sbirthday日期值。
select max(sbirthday),min(sbirthday) from student
 
-- 40、以班号和年龄从大到小的顺序查询Student表中的全部记录
select *,(year(getdate())-year(sbirthday)) as bal from student
order by class desc ,bal desc
 
-- 41、查询“男”教师及其所上的课程。
select a.tname,b.cname from teacher as a
join course as b on a.tno=b.tno
where a.tsex='男'
 
-- 42、查询最高分同学的Sno、Cno和Degree列。
select sno,cno,degree from score 
where degree in (
  select max(degree) from score)
 
-- 43、查询和“李军”同性别的所有同学的Sname
select sname from student
where ssex in (
  select ssex from student 
where sname = '李军')
 
-- 44、查询和“李军”同性别并同班的同学Sname。
select sname from student
where ssex in (
  select ssex from student 
   where sname = '李军')
and class in (
  select class from student
   where sname = '李军')
 
-- 45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
select a.* ,b.*,c.* from student as a
left join score as b on a.sno=b.sno
left join course as c on b.cno=c.cno
where c.cname='计算机导论' and a.ssex='男'
 

你可能感兴趣的:(sql)