experiment2
数据库实验
【实验项目二】
实验内容
本次实验共100分,做对一个给4分。以随机抽查现场做为准
设如下四个表,先创建表, 插入数据, 然后做后面的查询:
student (学生信息表)
sno sname sex birthday class
108 曾华男09/01/77 95033
105 匡明男10/02/75 95031
107 王丽女01/23/76 95033
101 李军男02/20/76 95033
109 王芳女02/10/75 95031
103 陆军男06/03/74 95031
teacher(老师信息表)
tno tname sex birthday prof depart
804 李诚男12/02/58 副教授计算机系
856 李旭男03/12/69 讲师电子工程系
825 王萍女05/05/72 助教计算机系
831 刘冰女08/14/77 助教电子工程系
course(课程表)
cno cname tno
3-105 计算机导论825
3-245 操作系统804
6-166 数字电路856
9-888 高等数学825
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
请写出下列查询语句并给出结果
1、列出student表中所有记录的sname、sex和class列。答案
2、显示教师所有的单位即不重复的depart列。
3、显示学生表的所有记录。
4、显示score表中成绩在60到80之间的所有记录。
5、显示score表中成绩为85,86或88的记录。
6、显示student表中“95031”班或性别为“女”的同学记录。
7、以class降序显示student表的所有记录。
8、以cno升序、degree降序显示score表的所有记录。
9、显示“98031”班的学生人数。
10、显示score表中的最高分的学生学号和课程号。
11、显示“3-105”号课程的平均分。
12、显示score表中至少有5名学生选修的并以3开头的课程号的平均分数。
13、显示最低分大于70,最高分小于90 的sno列。
14、显示所有学生的 sname、 cno和degree列。
15、显示所有学生的 sname、 cname和degree列。
16、列出“95033”班所选课程的平均分。
17、显示选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
18、显示score中选修多门课程的同学中分数为非最高分成绩的记录。
19、显示成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
20、显示出和学号为“108”的同学同年出生的所有学生的sno、sname和 birthday列。
21、显示“张旭”老师任课的学生成绩。
22、显示选修某课程的同学人数多于5人的老师姓名。
23、显示“95033”班和“95031”班全体学生的记录。
24、显示存在有85分以上成绩的课程cno。
25、显示“计算机系”老师所教课程的成绩表。
26、显示“计算机系”和“电子工程系”不同职称的老师的tname和prof。
27、显示选修编号为“3-105”课程且成绩至少高于“3-245”课程的同学的cno、sno和degree,并按degree从高到低次序排列。
28、显示选修编号为“3-105”课程且成绩高于“3-245”课程的同学的cno、sno和degree。
29、列出所有任课老师的tname和depart。
30、列出所有未讲课老师的tname和depart。
31、列出所有老师和同学的 姓名、性别和生日。
*32、检索所学课程包含学生“103”所学课程的学生学号。
*33、检索选修所有课程的学生姓名。
实验代码
/*
student (学生信息表)
sno sname sex birthday class
108 曾华男09/01/77 95033
105 匡明男10/02/75 95031
107 王丽女01/23/76 95033
101 李军男02/20/76 95033
109 王芳女02/10/75 95031
103 陆军男06/03/74 95031
*/
create table student
(
sno char(10) primary key, --主码
sname char(10) not null,
sex char(2),
birthday datetime,
class char(10)
)
insert into student values('108','曾华','男','77/09/01','95033')
insert into student values('105','匡明','男','75/10/12','95031')
insert into student values('107','王丽','女','76/01/23','95033')
insert into student values('101','李军','男','77/02/20','95033')
insert into student values('109','王芳','女','75/02/10','95031')
insert into student values('103','陆军','男','74/06/03','95031')
select * from student
/*
teacher(老师信息表)
tno tname sex birthday prof depart
804 李诚男12/02/58 副教授计算机系
856 李旭男03/12/69 讲师电子工程系
825 王萍女05/05/72 助教计算机系
831 刘冰女08/14/77 助教电子工程系
*/
create table teacher
(
tno char(10) primary key, --主码
tname char(10) not null,
sex char(2),
birthday datetime,
prof char(15),
depart char(25)
)
insert into teacher values('804','李诚','男','58/12/02','副教授','计算机系')
insert into teacher values('856','李旭','男','69/03/12','讲师','电子工程系')
insert into teacher values('825','王萍','女','72/05/05','助教','计算机系')
insert into teacher values('831','刘冰','女','77/08/14','助教','电子工程系')
select * from teacher
/*
course(课程表)
cno cname tno
3-105 计算机导论825
3-245 操作系统804
6-166 数字电路856
9-888 高等数学825
*/
create table cource
(
cno char(15) primary key, --主码
cname char(15) not null,
tno char(10) not null
)
insert into cource values('3-105','计算机导论','825')
insert into cource values('3-245','操作系统','804')
insert into cource values('6-166','数字电路','856')
insert into cource values('9-888','高等数学','825')
select * from cource
/*
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
*/
create table score
(
sno char(10) not null,
cno char(15) not null,
degree int
)
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('101','3-105','64')
insert into score values('107','3-105','91')
insert into score values('108','3-105','78')
insert into score values('101','6-166','85')
insert into score values('107','6-166','79')
insert into score values('108','6-166','81')
select * from score
select * from student
select * from cource
select * from score
select * from teacher
--1、列出student表中所有记录的sname、sex和class列。
select sname,sex,class from student
--2、显示教师所有的单位即不重复的depart列。
select distinct depart from teacher
--3、显示学生表的所有记录。
select * from student
--4、显示score表中成绩在60到80之间的所有记录。
select * from score where degree between 60 and 80
select * from score where degree >=60 and degree <= 80
--5、显示score表中成绩为85,86或88的记录。
select * from score where degree in (85,86,88)
select * from score where degree =85 or degree =86 or degree =88
--6、显示student表中“95031”班或性别为“女”的同学记录。
select * from student where class ='95031' or sex='女'
--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 * from student
select * from student where class='95031'
--10、显示score表中的最高分的学生学号和课程号。
select sno,cno from score where degree >= all(select degree from score)
select sno,cno from score where degree >= (select max(degree) from score)
select top 1 with ties sno,cno from score order by degree --可能有相同分,使用with ties
--11、显示“3-105”号课程的平均分。
select * from score
select avg(degree) '3-105号课程平均分'
from score group by cno having cno='3-105'
select avg(degree) '3-105号课程平均分'
from score where cno='3-105' group by cno
--12、显示score表中至少有5名学生选修的并以3开头的课程号的平均分数。
select * from score
select avg(degree) 平均分,count(*) 选课人数 from score where cno like '3%' group by cno having count(*)>=5
--13、显示最低分大于70,最高分小于90 的sno列。
select sno from score group by sno having min(degree) > 70 and max(degree) < 90
--14、显示所有学生的 sname、 cno和degree列。
select sname, cno, degree from student, score where student.sno=score.sno
--15、显示所有学生的 sname、 cname和degree列。
select sname, cname, degree from student, score,cource where student.sno=score.sno and cource.cno=score.cno
--16、列出“95033”班所选课程的平均分。
select * from student
select avg(degree) from score
where sno in (select sno from student where class = '95033')
--17、显示选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select * from score
select * from student
where sno in (
select sno from score
where cno='3-105' and degree >( select degree from score where sno='109' and cno='3-105' )
)
--18、显示score中选修多门课程的同学中分数为非最高分成绩的记录。
select a.sno, a.degree, a.cno from score a, score b
where a.sno=b.sno and a.degree<b.degree;
--19、显示成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
select * from score where degree >(
select degree from score where sno='109' and cno='3-105'
)
--20、显示出和学号为“108”的同学同年出生的所有学生的sno、sname和 birthday列。
select * from student
select sno, sname, birthday from student
where sno!='108' and year(birthday) = (select year(birthday) from student where sno='108')
--21、显示“李旭”老师任课的学生成绩。
select * from cource
select * from teacher
select * from score
select sno,degree from score where cno in(
select cno from cource
where tno = (select tno from teacher where tname='李旭')
)
--22、显示选修某课程的同学人数多于5人的老师姓名。
select tname from teacher where tno in(
select tno from cource where cno in(
select cno from score group by cno having count(sno)>5
)
)
--23、显示“95033”班和“95031”班全体学生的记录。
select * from student where class in('95033','95031')
select * from student where class = '95033' or class = '95031'
--24、显示存在有85分以上成绩的课程cno。
select cno from score group by cno having max(degree)>=85
--25、显示“计算机系”老师所教课程的成绩表。
select * from score where cno in(
select cno from cource where tno in(
select tno from teacher where depart = '计算机系'
)
)
select * from score,cource,teacher
where score.cno=cource.cno and cource.tno= teacher.tno and teacher.depart = '计算机系'
--26、显示“计算机系”和“电子工程系”不同职称的老师的tname和prof。
select * from teacher
select tname , prof from teacher
where depart='计算机系' and prof not in
(select prof from teacher where depart='电子工程系')
--27、显示选修编号为“3-105”课程且成绩至少高于“3-245”课程的同学的cno、sno和degree,并按degree从高到低次序排列。
select cno, sno, degree from score where sno in(
select sno from score where cno='3-105' and degree>(select min(degree) from score where cno='3-245')
) order by degree desc
--28、显示选修编号为“3-105”课程且成绩高于“3-245”课程的同学的cno、sno和degree。
select cno, sno, degree from score where sno in(
select sno from score where cno='3-105' and degree>(select min(degree) from score where cno='3-245')
)
--29、列出所有任课老师的tname和depart。
select tname,depart from teacher a
where exists(select * from cource b where a.tno=b.tno)
select tname,depart from teacher where tno in (select tno from cource)
--30、列出所有未讲课老师的tname和depart。
select tname,depart from teacher where tno not in (select tno from cource)
--31、列出所有老师和同学的 姓名、性别和生日。
select sname 姓名 ,sex 性别,birthday 生日 from student
union
select tname 姓名,sex 性别,birthday 生日 from teacher
--*32、检索所学课程包含学生“103”所学课程的学生学号。
Select sno from score,(select cno from score where sno='103')course103
where score.cno=course103.cno
group by sno having count(score.cno)=(select count(cno) from score where sno='103')
select * from student
select * from score
select sno from score x
where not exists
(select * from score y
where y.sno=103 and
not exists
(select * from score z
where z.sno=x.sno and z.cno=y.cno) )
--*33、检索选修所有课程的学生姓名。
select student.sname from student
where not exists (select * from cource
where not exists
(select * from score
where student.sno=score.sno and cource.cno=score.cno))