现有教学数据库JX_DB,作业

现有教学数据库JX_DB,数据库有以下三个基本表:

学生表student,它由学号sno、姓名sname、性别sex、出生日期Bdate、所在系dept五个属性构成。其中,学号不能为空,值是唯一的;

课程表course,它由课程号cno、课程名cname、学时数lhour、学分数creadit、开设学期semester五个属性组成。主键是cno,要求主键非空且唯一;

选课表SC,它由学号sno、课程号cno、成绩grade三个属性组成。其中主键是(sno,cno),且主属性son、cno分别外键关联自学生表和课程表,grade默认值为null。

请使用MySQL语句创建数据库和数据库表并导入数据,然后写出SQL语句完成以下操作:

(1)为学生表的sno属性创建唯一索引;

(2)查询年龄大于19岁的学生姓名和出生年月;

(3)查询学习课程号为CS-221的课程的学生学号与姓名;

(4)查询至少选修课程号为CS-110和CS-201的学生学号与姓名;

(5)查询2000年出生的学生姓名及其秋季所修课程的课程号及成绩;

(6)查询秋季学期有一门以上课程获90分以上成绩的学生;

(7)查询只有一个人选修的课程号和课程名;

(8)查询没有选修EE-201课程的学生学号与姓名;

(9)查询每门课程的选课人数;

(10)查询选修了3门以上课程的学生学号与姓名;

(11)查询计算机系所开课程的最高成绩、最低成绩和平均成绩。如果某门课程的成绩不全(即为NULL),则课程不予统计,结果按CNO升序排列;

(12)查询2003年出生的学生和选修机电系所开课程(EE标志)的学生学号与姓名(即求并集);

(13)查询计算机系2003年出生的学生详细信息(即求交集);

(14)查询选修了CS-110课程但没有选修CS-201课程的学生学号与姓名(即求差集);

(15)将一个新学生记录(学号15202106,姓名韩晓婷,性别女,出生年月2004-5-8,所在系计算机系)插入到Student表中;

(16)创建一个女学生成绩临时表Fgrade,表中包括Sname、Cno、Grade三个属性,然后查询相应女学生成绩数据并存储;

(17)修改选修数据结构的选课成绩,若低于80,则统一提高5%;

(18)将SC表中缺成绩的学生成绩置0;

(19)删除王姓同学的选课记录;

(20)定义一个视图Grade_AVG,表示学生的平均成绩,其中包括Sno、Sname和Avggrade(平均成绩)三个属性,并此视图上查询平均成绩大于90分的学生学号与姓名。

 
 

各表数据如下:

Student表:

Sno

Sname

Sex

bdate

Sdept

15202101

刘芳

2001/3/12

计算机系

15202102

张晓晨

2002/1/24

计算机系

15202103

王文选

2000/11/15

计算机系

15202104

张玲

2001/8/19

计算机系

15202105

李莉萍

2003/6/3

计算机系

 

Course表:

Cno

Cname

Lhour

Credit

Semester

CS-110

计算机导论

32

2

CS-201

数据结构

80

5

CS-221

软件工程

64

4

EE-122

电路基础

48

3

EE-201

电工电子

80

5

 

SC表:

Sno

Cno

Grade

15202101

CS-110

95

15202101

CS-201

90

15202102

CS-110

85

15202102

EE-201

80

15202103

CS-110

82

15202103

CS-201

75

15202103

EE-122

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#(1)为学生表的sno属性创建唯一索引
create unique index sno on student(sno);

 

 

 

 

好像没什么反应。。。。
#(2)查询年龄大于19岁的学生姓名和出生年月;
select Sname,bdate
from student
where year(bdate)<='2002';

 

 

 

 

这个简单,year()查找了半天
#(3)查询学习课程号为CS-221的课程的学生学号与姓名;
select  Student.Sno,Student.Sname
from student,sc
where Student.Sno=SC.Sno and sc.Cno='CS-221';

 

 

 

 

这个什么都没有
#(4)查询至少选修课程号为CS-110和CS-201的学生学号与姓名;
select sc.Sno,sname
from sc,student
where sc.sno in (select sno from sc where cno='CS-110') and cno='CS-201'and sc.Sno=Student.Sno;

 

 

 

 

用连接表就可以了
#(5)查询2000年出生的,学生姓名及其秋季所修课程的课程号及成绩;
select Sname,Course.Cno,sc.Grade
from student,course,sc
where Student.bdate like '2000%'
  and Student.Sno=SC.Sno and Course.Cno=SC.Cno and Semester='秋 ' ;

 

 

 

 

同样是连接表
#(6)查询秋季学期有一门以上课程获90分以上成绩的学生;
select *
from student,course,sc
where Grade>90
  and Student.Sno=SC.Sno and Course.Cno=SC.Cno and Semester='秋 ' ;

还是连接表

 

 

 


#(7)查询只有一个人选修的课程号和课程名;
select Course.cno,Cname
from sc scx,course
where scx.Cno=Course.Cno and scx.Cno NOT IN (select Cno from sc where SC.sno !=scx.sno);

 

 

 

 

子查询中的意思是所有都选了的,只选一个的没有在这个范围内,意思是查询成绩表中的课号而学号不等于scx中的学号的人,弄了好久
#(8)查询没有选修EE-201课程的学生学号与姓名;
select distinct Student.Sno,Sname
from student,course,sc
where Student.Sno=SC.Sno and Course.Cno=SC.Cno and
      Course.Cno not in(select Course.Cno from Course where SC.Cno= 'EE-201'
    );

 

 

 

 

套娃
#(9)查询每门课程的选课人数
SELECT cno,COUNT(cno)
FROM sc
GROUP BY Cno ;

 

 

 

 

用聚集函数
#(10)查询选修了3门以上课程的学生学号与姓名;
SELECT SC.sno,Student.Sname
FROM sc,student
where Student.Sno=SC.Sno
HAVING COUNT(SC.sno) > 3 ;

 

 

 

 

同上
#(11)查询计算机系所开课程的最高成绩、最低成绩和平均成绩。如果某门课程的成绩不全(即为NULL),则课程不予统计,结果按CNO升序排列;
select cno,max(grade),min(grade),avg(grade)
from sc
where cno like'CS%' group by cno
having cno not in(select cno
                  from sc
                  where grade is NULL)
order by cno;

 

 

 


#(12)查询2003年出生的学生和选修机电系所开课程(EE标志)的学生学号与姓名(即求并集);
select sc.sno,sname
from student,sc
where student.sno=sc.sno and sc.cno like'EE%'
union
select sno,sname
from student
where bdate like'2003%';

 

 

 

 

其实就是and嘛
#(13)查询计算机系2003年出生的学生详细信息(即求交集);
select *
from student
where bdate like'2003%'and sdept='计算机系 ';

 

 

 

 

取交集
#(14)查询选修了CS-110课程但没有选修CS-201课程的学生学号与姓名(即求差集);
select sc.sno,sname
from student,sc
where student.sno=sc.sno and
        cno not in(select cno
                   from sc
                   where cno='CS-201')and cno='CS-110';

 

 

 


#(15)将一个新学生记录(学号15202106,姓名韩晓婷,性别女,出生年月2004-5-8,所在系计算机系)插入到Student表中;
insert into student
values(15202106,'韩晓婷','女','2004/5/8','计算机');

 

 

 

 

运行一次就进去了
#(16)创建一个女学生成绩临时表Fgrade,表中包括Sname、Cno、Grade三个属性,然后查询相应女学生成绩数据并存储;
create temporary table Fgrade
(select distinct Student.Sname,SC.Cno,SC.grade
from student,sc
where student.sex='女' and  student.sno=sc.sno);
drop temporary table Fgrade;

 

 

虽然创建了临时表,并且储存了,但是没有去看看
#(17)修改选修数据结构的选课成绩,若低于80,则统一提高5%;
SET SQL_SAFE_UPDATES = 0;
update sc set grade=grade+grade*0.05
where grade<80;
select *from sc;

 

 

 

 

 

 

更新数据

分数显著提高了,但是这里的王姓同学已经没了
#(18)将SC表中缺成绩的学生成绩置0;
update sc set grade=0
where grade is NULL;

 

 

 


#19)删除王姓同学的选课记录;
delete from sc
where Sno in(select sno
             from student
             where sname like'王%');

 

 

 

 

03没掉了
#(20)定义一个视图Grade_AVG,表示学生的平均成绩,其中包括Sno、Sname和Avggrade(平均成绩)三个属性,并此视图上查询平均成绩大于90分的学生学号与姓名。
create view Grade_AVG(Sno,Sname,Avggrade)
as
select sc.Sno,Sname,avg(grade)
from student,sc
where student.sno=sc.sno
group by sno;
select * from Grade_AVG;
select sno,sname from Grade_AVG
where Avggrade>90;

 

 

 

 

 

 

创建的视图

 

posted @ 2021-12-03 10:28  lskiy  阅读(992)  评论(0编辑  收藏  举报