数据库第二个实验

  • Post author:
  • Post category:其他

写完作业五一就可以玩了
话说在文章前面写东西的习惯怎么改不掉,qaq


一、题目

设如下四个表,先创建表, 插入数据, 然后做后面的查询:
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、检索选修所有课程的学生姓名。

二、我的垃圾代码

2.1 创建表并插入数据



--在这里删除创建的表,以便后续可以重新新建,上机演示
drop table score;

drop table course;

drop table student;

drop table teacher;





--创建学生信息表,命名student表
create table student (  
	sno			char(7)		primary key,	--学号,是主码
	sname		char(10)	not null,		--姓名
	sex			char(2),					--性别
	birthday	char(20),					--年龄
	class		int							--所在班级
)  ;


--下面创建老师信息表,表名为teacher
create table teacher (
	tno			char(10)	primary key,	--老师编号是主健
	tname		char(20),					--老师姓名
	sex			char(4),					--性别
	birthday	char(20),					--生日
	prof		char(20),					--职称
	depart		char(20)					--所在系

);

--创建课程表,表名是course
create table course (
	cno		char(10)	not null ,					--课程编号
	cname	char(20)	not null,					--课程名称
	tno		char(10)	references teacher(tno),	--上面是声明sno是外健,参照student表的tno
	primary key (cno)								--指明cno是主码
);

--创建成绩表,表名是score
create table score(
	sno		char(7)		not null,				--学生编号
	cno		char(10)	not null,				--课程号
	degree	smallint ,							--成绩
	primary key(sno,cno),						--声明sno,cno是主码
	foreign key(sno) references student(sno),	--上面是声明sno是外健,参照student表的sno
	foreign key(cno) references course(cno)		--上面是声明cno是外健,参照course表的cno
);


--插入所有表的数据

insert into student(sno, sname, sex,birthday,class) values ('108', '曾华', '男','09/01/77',95033 );
insert into student(sno, sname, sex,birthday,class) values ('105', '匡明', '男','10/02/75',95031 );
insert into student(sno, sname, sex,birthday,class) values ('107', '王丽', '女','01/23/76',95033 );
insert into student(sno, sname, sex,birthday,class) values ('101', '李军', '男','02/20/76',95033 );
insert into student(sno, sname, sex,birthday,class) values ('109', '王芳', '女','02/10/75',95031 );
insert into student(sno, sname, sex,birthday,class) values ('103', '陆军', '男','06/03/74',95031 );

insert into teacher(tno, tname, sex,birthday,prof,depart) values ('804', '李诚', '男','12/02/58','副教授','计算机系' );
insert into teacher(tno, tname, sex,birthday,prof,depart) values ('856', '李旭', '男','03/12/69','讲师','电子工程系' );
insert into teacher(tno, tname, sex,birthday,prof,depart) values ('825', '王萍', '女','05/05/72','助教','计算机系' );
insert into teacher(tno, tname, sex,birthday,prof,depart) values ('831', '刘冰', '女','08/14/77','助教','电子工程系' );

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

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


--查看一下数据

select  * from student
select  * from teacher
select  * from course
select  * from score


2.2 开始作业

1、列出student表中所有记录的sname、sex和class列。

select sname, sex, class from student;

2、显示教师所有的单位即不重复的depart列。

select distinct depart from teacher;

DISTINCT 用于返回唯一不同的值。

3、显示学生表的所有记录。

select *from student
--或者
select sno as 学号, sname as 姓名, sex as 性别 ,birthday as 出生日期  from student;--as别名

4、显示score表中成绩在60到80之间的所有记录。

select * from score where degree between 60 and 80

5、显示score表中成绩为85,86或88的记录。

select * from score where degree=85 or degree=86 or degree=88
--或者
 select * from score where degree in (85, 86, 88);

6、显示student表中“95031”班或性别为“女”的同学记录。

select * from student where class = 95031 or sex = '女'

7、以class降序显示student表的所有记录。

select * from student order by class desc;

升序是asc,降序是desc

8、以cno升序、degree降序显示score表的所有记录。

select * from score by cno asc, degree desc

9、显示“98031”班的学生人数。

select count(*) as 学生人数 from student where class = 

10、显示score表中的最高分的学生学号和课程号。

select sno,cno ,degree as 最高分 from score
where degree = (select max(degree) from score)

11、显示“3-105”号课程的平均分。

select avg(degree)  as 课程平均分 from score where cno='3-105'

12、显示score表中至少有5名学生选修的并以3开头的课程号的平均分数。

select cno,avg(degree) from score where cno like '3%'--3开头的
group by cno 
having count (*)>=5

考察group

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 score,student
where student.sno=score.sno;

这里考察多个表相连

15、显示所有学生的 sname、 cname和degree列。

select sname, cname, degree from course,student,score
where student.sno=score.sno and course.cno=score.cno;
--三个表相连

16、列出“95033”班所选课程的平均分。

select cno,avg(degree) as 平均分  from student , score 
where student.sno=score.sno and student.class='95033'   
group by  cno;

17、显示选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。

select  sno, cno, degree from score 
where cno='3-105' and degree>(select degree from score where  cno='3-105'   and sno=109)

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 cno,sno,degree from score
where degree>(select degree from score  where sno=109 and cno ='3-105' )

20、显示出和学号为“108”的同学同年出生的所有学生的sno、sname和 birthday列。

select sno,sname,birthday from student
where birthday =(select birthday from student where sno ='108')

21、显示“李旭”老师任课的学生成绩。

select cno,sno, degree from score 
where cno=(select cno from course where tno =(select tno from teacher where tname='李旭'))

22、显示选修某课程的同学人数多于5人的老师姓名。

select tname from teacher 
where tno in (
select tno from score,course 
where score.cno =course.cno
group by tno
having count(tno )>5)

23、显示“95033”班和“95031”班全体学生的记录。

select * from student where class in (21033,21031);

24、显示存在有85分以上成绩的课程cno。

select cno from score
where degree>85 
group by cno;

25、显示“计算机系”老师所教课程的成绩表。

select sno,cno,degree from score 
where cno in
(select cno from course where tno in
(select tno from teacher where depart like '计算机系')
)

26、显示“计算机系”和“电子工程系”不同职称的老师的tname和prof。

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 cno='3-105' and degree>any
   (select 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 cno='3-105'and degree > all
(select degree from score where cno = '3-245')

29、列出所有任课老师的tname和depart。

select tname ,depart from teacher

30、列出所有未讲课老师的tname和depart。

select tname ,depart from teacher 
where  tno  not in 
(select tno from course)

31、列出所有老师和同学的 姓名、性别和生日。

 select tname,sex,birthday  from teacher
  union 
 select sname,sex,birthday from student

*32、检索所学课程包含学生“103”所学课程的学生学号。

Select distinct 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  course
     where not exists 
          ( select * from  score where
      student.sno=score.sno and course.cno=score.cno))


2.3 完整代码

--select  子句指定 要显示的属性列 
--from子句指定查询对象
--where子句指定查询条件 
--group by子句对查询结果按指定列的值分组,该属性列值相等的元组为一个组,通常会在每组中作用集函数
--having短语筛选出只有满足指定条件的组
--order by子句对查询结果按指定列值升序或降序排序  ASC DESC 
--小写字母表示系名lower(stept)
--distinct不显示重复数值,all
--where子句作用于基表或视图,从中选择满足条件的元组;having子句作用于组,从中选择满足条件的组



--在这里删除创建的表,以便后续可以重新新建,上机演示
drop table score;

drop table course;

drop table student;

drop table teacher;





--创建学生信息表,命名student表
create table student (  
	sno			char(7)		primary key,	--学号,是主码
	sname		char(10)	not null,		--姓名
	sex			char(2),					--性别
	birthday	char(20),					--年龄
	class		int							--所在班级
)  ;


--下面创建老师信息表,表名为teacher
create table teacher (
	tno			char(10)	primary key,	--老师编号是主健
	tname		char(20),					--老师姓名
	sex			char(4),					--性别
	birthday	char(20),					--生日
	prof		char(20),					--职称
	depart		char(20)					--所在系

);

--创建课程表,表名是course
create table course (
	cno		char(10)	not null ,					--课程编号
	cname	char(20)	not null,					--课程名称
	tno		char(10)	references teacher(tno),	--上面是声明sno是外健,参照student表的tno
	primary key (cno)								--指明cno是主码
);

--创建成绩表,表名是score
create table score(
	sno		char(7)		not null,				--学生编号
	cno		char(10)	not null,				--课程号
	degree	smallint ,							--成绩
	primary key(sno,cno),						--声明sno,cno是主码
	foreign key(sno) references student(sno),	--上面是声明sno是外健,参照student表的sno
	foreign key(cno) references course(cno)		--上面是声明cno是外健,参照course表的cno
);


--插入所有表的数据

insert into student(sno, sname, sex,birthday,class) values ('108', '曾华', '男','09/01/77',95033 );
insert into student(sno, sname, sex,birthday,class) values ('105', '匡明', '男','10/02/75',95031 );
insert into student(sno, sname, sex,birthday,class) values ('107', '王丽', '女','01/23/76',95033 );
insert into student(sno, sname, sex,birthday,class) values ('101', '李军', '男','02/20/76',95033 );
insert into student(sno, sname, sex,birthday,class) values ('109', '王芳', '女','02/10/75',95031 );
insert into student(sno, sname, sex,birthday,class) values ('103', '陆军', '男','06/03/74',95031 );

insert into teacher(tno, tname, sex,birthday,prof,depart) values ('804', '李诚', '男','12/02/58','副教授','计算机系' );
insert into teacher(tno, tname, sex,birthday,prof,depart) values ('856', '李旭', '男','03/12/69','讲师','电子工程系' );
insert into teacher(tno, tname, sex,birthday,prof,depart) values ('825', '王萍', '女','05/05/72','助教','计算机系' );
insert into teacher(tno, tname, sex,birthday,prof,depart) values ('831', '刘冰', '女','08/14/77','助教','电子工程系' );

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

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


--查看一下数据

select  * from student
select  * from teacher
select  * from course
select  * from score


--开始作业


--1、列出student表中所有记录的sname、sex和class列。
select sname, sex, class from student;



--2、显示教师所有的单位即不重复(distinct)的depart列。  
select distinct depart from teacher;



--3.显示学生表的所有记录
select *from student
--或者
select sno as 学号, sname as 姓名, sex as 性别 ,birthday as 出生日期  from student;--as别名



--4、显示score表中成绩在60到80之间的所有记录
 select * from score where degree between 60 and 80; --所有记录就是select*



 --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=98031 or sex='女';



--7、以class降序显示student表的所有记录。
select * from student order by class desc;



--8、以cno升序、degree降序显示score表的所有记录。asc为缺省
select * from score order by cno asc, degree  desc;
--升序是asc,降序是desc



--9、显示“98031”班的学生人数。
select count(*) as 学生人数 from student where class=98031;



--10、显示score表中的最高分的学生学号和课程号。max
select sno ,cno,degree as 最高分 from score 
where degree =(select max(degree) from score)



--11、显示“3-105”号课程的平均分。avg
select avg(degree)  as 课程平均分 from score where cno='3-105'




--12、显示score表中至少有5名学生选修的并以3开头的课程号的平均分数。
select cno,avg(degree) from score
where cno like '3%'--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 score,student
where student.sno=score.sno;


--15、显示所有学生的 sname、 cname和degree列。
select sname, cname, degree from course,student,score
where student.sno=score.sno and course.cno=score.cno;
--三个表相连




--16、列出“21033”班所选课程的平均分。
select cno,avg(degree) as 平均分  from student , score 
where student.sno=score.sno and student.class='95033'   
group by  cno;



--17、显示选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select  sno, cno, degree from score 
where cno='3-105' and degree>(select degree from score where  cno='3-105'   and sno=109)



--***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 cno,sno,degree from score
where degree>(select degree from score  where sno=109 and cno ='3-105' )
--Select x.cno, x.sno, x.degree
--from sc x, sc y
--Where x.degree>y.degree and y.sno=109 and y.cno='3-105';




--20、显示出和学号为“108”的同学同年出生的所有学生的sno、sname和 birthday列。
select sno,sname,birthday from student
where birthday =(select birthday from student where sno ='108')

--select x.sno,x.sname,x.birthday
--from student x,student y
--Where x.sno=y.sno and y.sno='108'





  

--21、显示“李旭”老师任课的学生成绩。
select cno,sno, degree from score 
where cno=(select cno from course where tno =(select tno from teacher where tname='李旭'))
--Select cno, sno, degree from sc
--Where cno=(select x.cno from course x, teacher y
--                     where x.tno=y.tno and y.tname='李旭')




--***22、显示选修某课程的同学人数多于5人的老师姓名。
select tname from teacher 
where tno in (
select tno from score,course 
where score.cno =course.cno
group by tno
having count(tno )>5)

--select tname from teacher 
--where tno in 
--(select tno from sc,course
--where sc.cno=course.cno
--group by tno
--having count(*)>5)


--select tname from teacher 
--where tno in (select x.tno from course x,sc y
--					where x.cno=y.cno
--					group by x.tno
--					having count(x.tno)>5)





--23、显示“95033”班和“95031”班全体学生的记录。
--select * from student 
--where class=21033 or class=21031
select * from student where class in (21033,21031);

select * from score




--24、显示存在有85分以上成绩的课程cno。
select cno from score
where degree>85 
group by cno;

--select distinct cno from sc
--where degree>85 




--25、显示“计算机系”老师所教课程的成绩表。
select sno,cno,degree from score 
where cno in
(select cno from course where tno in
(select tno from teacher where depart like '计算机系')
)




--26、显示“计算机系”和“电子工程系”不同职称的老师的 tname和prof。

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 cno='3-105' and degree>any
   (select 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 cno='3-105'and degree > all
(select degree from score where cno = '3-245')




--29、列出所有任课老师的tname和depart。
select tname ,depart from teacher





--30、列出所有未讲课老师的tname和depart。
select tname ,depart from teacher 
where  tno  not in 
(select tno from course)

--Select tname,dept  from  teacher  a
--  where tno NOT in
--      ( select tno  from course b
--            where a.tno=b.tno)






--31、列出所有老师和同学的 姓名、性别和生日。

 select tname,sex,birthday  from teacher
  union 
 select sname,sex,birthday from student





--not exists  全称量词
--exists 存在量词







--*32、检索所学课程包含学生“103”所学课程的学生学号。

Select distinct 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  course
     where not exists 
          ( select * from  score where
      student.sno=score.sno and course.cno=score.cno))




--插入两条记录
insert into score(sno, cno,degree) values ('103', '9-888', '81' );
insert into score(sno, cno,degree) values ('103', '6-166', '81' );
--删除两条记录
delete from score where cno ='9-888'
delete from score where sno ='103' and cno = '6-166' 
select * from score

版权声明:本文为weixin_62529383原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。