数据库实验3视图

10-1 创建视图计算学生课程平均分

现有一个学生数据库,内包含学生表(Student)、课程表(Course)和选修表(SC)。

在每一学年,学生处需要统计每位学生的学习情况,以便进行奖学金评定。请你设计一个视图V_average_grade,统计数据库中课程平均分在80以上的学生。

提示:请使用CREATE VIEW语句作答,并请注意数据表名、列名大小写需与表结构定义一致

表结构:

学生表(Student)、课程表(Course)和选修表(SC)结构如下:

CREATE TABLE `Student` (
  `Sno` varchar(20) NOT NULL,
  `Sname` varchar(10) DEFAULT NULL,
  `Ssex` varchar(2) DEFAULT NULL,
  `Sage` int(3) DEFAULT NULL,
  `Sdept` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`Sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `Course` (
  `Cno` varchar(10) NOT NULL,
  `Cname` varchar(20) DEFAULT NULL,
  `Cpno` varchar(10) DEFAULT NULL,
  `Ccredit` int(3) DEFAULT NULL,
  PRIMARY KEY (`Cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `SC` (
  `Sno` varchar(20) NOT NULL,
  `Cno` varchar(10) NOT NULL,
  `Grade` int(3) DEFAULT NULL,
  PRIMARY KEY (`Sno`,`Cno`),
  KEY `Cno` (`Cno`),
  CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`),
  CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`Cno`) REFERENCES `course` (`Cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表样例

Student表:

Student.PNG

Course表:

Course.PNG

SC表:

SC.PNG

输出样例:

视图V_average_grade输出:

QQ截图20220419202249.png

create view V_average_grade
as 
select
    Student.Sdept,
    Student.Sno,
    Student.Sname,
    avg(SC.Grade) as Average_grade
from 
    Student
join SC on SC.Sno = Student.Sno
group by Student.Sdept,Student.Sno,Student.Sname
having 
    avg(SC.Grade)>80;

 10-2 创建视图查找不及格学生

现有一个学生数据库,内包含学生表(Student)、课程表(Course)和选修表(SC)。

每学期末,教务处要安排课程补考或者重修,因此需要统计本学期课程考试不合格的学生、课程、成绩。假设选修表中课程成绩小于60的同学都需要补考。请你设计一个视图V_FailedCourseStudent,统计数据库中课程成绩小于60的学生。

提示:请使用CREATE VIEW语句作答,并请注意数据表名、列名大小写。

表结构:

学生表(Student)、课程表(Course)和选修表(SC)结构如下:

CREATE TABLE `Student` (
  `Sno` varchar(20) NOT NULL,
  `Sname` varchar(10) DEFAULT NULL,
  `Ssex` varchar(2) DEFAULT NULL,
  `Sage` int(3) DEFAULT NULL,
  `Sdept` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`Sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `Course` (
  `Cno` varchar(10) NOT NULL,
  `Cname` varchar(20) DEFAULT NULL,
  `Cpno` varchar(10) DEFAULT NULL,
  `Ccredit` int(3) DEFAULT NULL,
  PRIMARY KEY (`Cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `SC` (
  `Sno` varchar(20) NOT NULL,
  `Cno` varchar(10) NOT NULL,
  `Grade` int(3) DEFAULT NULL,
  PRIMARY KEY (`Sno`,`Cno`),
  KEY `Cno` (`Cno`),
  CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`),
  CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`Cno`) REFERENCES `course` (`Cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表样例

Student表:

Student2.png

Course表:

Course2.png

SC表:

SC.PNG

输出样例:

视图V_FailedCourseStudent输出:

QQ截图20220420145858.jpg

create view V_FailedCourseStudent as
select 
    Student.Sdept,
    Student.Sno,
    Student.Sname,
    Course.Cname,
    SC.Grade
from Student
join SC on SC.Sno=Student.Sno
join Course on Course.Cno = SC.Cno
where SC.Grade<60;

 10-3 创建分组统计视图

创建每个专业学生修课信息的视图PerView,包括每个专业的专业名称、修课的学生人数、平均成绩。

表结构:

create table Student(
  sno char(8)  primary key,
  sname varchar(10) not null,
  gender char(2) check(gender='男' or gender='女'),
  birthdate  date,
  major varchar(20)  default '软件工程'
  );

create table SC(  
  scid  int auto_increment  primary key,
  sno char(8)   references Student(sno),
  cno char(10)  references Course(cno),
  tno char(15)  references Teacher(tno),
  grade int check(grade>=0 and grade<=100),
  gpoint  decimal(2,1),   
  memo  text(100)  
  );

表样例

Student表:

snosnamegenderbirthdatemajor
21012101李勇2005-10-20计算机科学
21012102刘晨2006-5-5计算机科学
21012103王晓敏2005-10-6计算机科学
21021101李佳睿2006-3-30软件工程
21021102吴宾2005-9-21软件工程
21021103张海2005-10-20软件工程
21031101钱晓萍2006-6-1网络工程
21031102王大力2005-11-15网络工程
21041101于洋2006-3-15数据科学
21041102郭霖2006-3-2数据科学

SC表:

scidsnocnotnogradegpointmemo
null21012101c01t200306m1213290nullnull
null21012101c02t200703m1221886nullnull
null21012101c03t200703m12218nullnull缺考
null21012102c02t200703m1221878nullnull
null21012102c03t200703m1221866nullnull
null21021102c01t200306m1213282nullnull
null21021102c02t200608f1220575nullnull
null21021102c03t200306m12132nullnull缓考
null21021102c05t201803f1240550nullnull
null21021103c02t200703m1221868nullnull
null21021103c04t201208m1230892nullnull
null21031101c01t200306m1213280nullnull
null21031101c02t200608f1220595nullnull
null21041102c02t200608f1220556nullnull
null21041102c05t201803f1240588nullnull

输出样例:

PerView视图:

图片.png

create view PerView as 
select
    Student.major as 专业名,
    count(distinct Student.sno) as 修课人数,
    avg(SC.grade) as 平均成绩
from Student
join SC on SC.sno=Student.sno
where SC.grade is not null
group by Student.major

 10-4 从视图PerView中查询数据。

从上题中创建的视图PerView中查询平均成绩超过75分的专业有哪些。

PerView视图结构:

 Create view PerView(专业名, 修课人数, 平均成绩)
AS Select major, count(distinct sc.sno), avg(grade) from student join sc on student.sno=sc.sno group by major;

PerView视图数据样例

PerView视图:

专业名修课人数平均成绩
数据科学172.0
网络工程187.5
计算机科学280.0
软件工程273.4

输出样例:

专业名平均成绩
网络工程87.5
计算机科学80.0
select 专业名,平均成绩
from PerView
where 平均成绩>75 

10-5 创建带表达式的视图StuView

已知学生表Student,创建学生信息的视图StuView,包括学生学号、姓名和年龄,在视图中的列名分别为No,Name和Age。

表结构:

create table  Student(
sno char(8)  primary key,
sname varchar(10) not null,
gender char(2) check(gender='男' or gender='女'),
birthdate  date,
major varchar(20)  default '软件工程'
  );

表样例

Student表:

image.png

输出样例:

注意:年龄字段会随年份不同而变化,这里只是针对当前时间点得到的情况

image.png

create view StuView as 
select 
    sno as No,
    sname as Name,
    year(getdate())-year(birthdate) as Age
from Student

 

### 查询期末平均成绩高于75分的课程及其分数 为了实现筛选期末平均成绩高于75分的课程及其分数的需求,可以基于已有的SQL语句逻辑进行调整。以下是完整的解决方案: #### SQL查询语句 假设存在一张表 `sc` 或类似的结构化数据存储学生成绩信息,其中包含字段 `sno`(学生编号)、`cno`(课程编号)以及 `grade`(成绩)。可以通过以下方式完成需求。 ```sql SELECT c.cname AS 课程名称, AVG(sc.grade) AS 期末平均成绩 FROM sc JOIN course c ON sc.cno = c.cno WHERE sc.grade IS NOT NULL GROUP BY sc.cno, c.cname HAVING AVG(sc.grade) > 75; ``` #### 解析 1. **连接课程表** 使用 `JOIN` 将成绩表 (`sc`) 课程表 (`course`) 进行关联,以便获取课程名称。这里假定课程表名为 `course`,并包含字段 `cname` 表示课程名称[^1]。 2. **过滤非空成绩记录** 条件 `sc.grade IS NOT NULL` 确保只考虑具有有效成绩的数据[^3]。 3. **按课程分组** 使用 `GROUP BY sc.cno, c.cname` 对每一门课程的成绩进行汇总处理。 4. **计算平均成绩** 函数 `AVG(sc.grade)` 计算每门课程的平均成绩。 5. **设置条件筛选** 利用 `HAVING AVG(sc.grade) > 75` 筛选出平均成绩超过75分的课程。 --- ### 示例数据验证 如果输入如下测试数据: | sno | cno | grade | |-----|-----|-------| | 1 | C1 | 80 | | 2 | C1 | 90 | | 3 | C1 | 60 | | 1 | C2 | 70 | | 2 | C2 | 80 | 并且课程表为: | cno | cname | |-----|-----------| | C1 | 数学 | | C2 | 英语 | 执行上述SQL后得到的结果将是: | 课程名称 | 期末平均成绩 | |----------|--------------| | 数学 | 76.67 | --- ### 注意事项 - 如果数据库中不存在课程表,则需额外创建或映射课程名称到对应的课程编号。 - 若成绩表中的某些列名不同,请根据实际结构调整字段名称。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值