【数据库原理与实践】CS系的实验期末考题(2022&2023)

2022:

学校管理数据库涉及四个关联表结构:

学生表 Student(Sno,Sname,Sdate,Ssex) ,其中Sno学生编号,Sname学生姓名,Sdate出生年月,Ssex学生性别 

课程表 Course(Cno,Cname,Tno) ,其中Cno课程编号,Cname课程名称,Tno教师编号 

教师表 Teacher(Tno,Tname) ,其中Tno教师编号,Tname教师姓名 

选课表 SC(Sno,Cno,Score)  ,其中Sno学生编号,Cno课程编号,Score分数 

试利用所给的配套数据文件在线测试04数据.sql”选择合适平台搭建好数据环境,并按要求完成SQL语句的设计。 

--SQL设计部分

请分别按照下列题目的要求编写和调试对应的sql语句。

  1. 查询姓老师的数量;
Select count(*) from teacher where tname like “李%”;

  1. 查询学过编号为“01”但是没有学过编号为“02”的课程的同学的信息;
SELECT Student.Sno, Sname

FROM Student, SC

WHERE Student.Sno = SC.Sno AND Cno = '01' AND Sno NOT IN

(SELECT Sno FROM SC WHERE Cno = '02')

  1. 检索“01”课程分数小于60,按分数降序排列的学生信息;
select student.* from student,sc where student.sno=sc.sno and cno='01' and grade<60 group by score desc;

  1. 查询学生平均成绩及其名次
SELECT sno,AVG(score) FROM sc

GROUP BY sno

ORDER BY AVG(score) DESC ;

GPT版本:

SELECT student.sno,sname,AVG(score) AS avgscore,

# 查询学号,学生,别名为avgscore的平均分

(SELECT COUNT(*) FROM (SELECT sno,AVG(score) AS avgscore FROM sc GROUP BY sno) AS tt

# 构建tt,以sno分组的学号、平均分;在tt中求分组条数

WHERE tt.avgscore>AVG(sc.score))+1 AS RANK

# 别名为rank的排名,统计大于当前学生平均分的学生数,然后+1即为名次

FROM student,sc

WHERE student.sno=sc.sno

GROUP BY student.sno,sname

ORDER BY avgscore DESC;

  1. 查询出只选修两门课程的全部学生的学号和姓名
Select sc.sno,sname from student,sc

Where student.sno=sc.sno group by sc.sno,sname

Having count(*)=2

  1. 查询课程名称为数学,且分数低于60学生姓名和分数
Select sname,score from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and course.cname=’数学’ and score<60

  1. 查询选修wxx老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT student.sno,sname,score FROM student,sc,teacher

WHERE teacher.tname='wxx' AND teacher.tno=sc.tno AND student.sno=sc.sno

ORDER BY score DESC LIMIT 1;

  1. 检索至少选修两门课程的学生学号
SELECT sc.sno FROM student,sc

WHERE student.sno=sc.sno

GROUP BY sc.sno

HAVING COUNT(*)>=2;

--编程设计部分

9创建一个名为sp1的存储过程及其调用语句,要求该存储过程带一个输入参数,用于接收学生姓名。执行该存储过程时,将根据输入的学生姓名输出该生的姓名、年龄和性别信息。(请用'jr'同学调用验证)

delimiter //

CREATE PROCEDURE sp1(IN myname CHAR(10))

BEGIN

SELECT sname,sage,sgender FROM student WHERE sname=myname;

END // delimiter



CALL sp1('jr')

  1. 创建一个名为sp2的函数及其调用语句,要求该函数带一个输入参数,输入参数用于接收课程号,函数返回选课表SC中该课程的平均分。(请用'12'号课程调用验证)

delimiter //

CREATE FUNCTION sp2(cnumber CHAR(10))

RETURNS FLOAT 

BEGIN

DECLARE avgscore FLOAT;

SELECT AVG(score) INTO avgscore FROM sc WHERE cno=cnumber;

RETURN avgscore;

END // delimiter



SELECT sp2('12')

11创建一个名为sp3的触发器,要求实现的功能是:当删除Student表的某条学生记录,同步删除选课表Sc对应该学生的全部选课记录。(该操作涉及记录删除,可能会对前面设计输出结果产生影响,切记不要做删除测试!)

delimiter //

CREATE TRIGGER sp3

AFTER DELETE ON student FOR EACH ROW

BEGIN

 DELETE FROM sc WHERE sc.sno=OLD.sno;

END //

delimiter

2023:

数据:

-- 学生表 Student
create table Student(Sid varchar(6), Sname varchar(10), Sdate datetime, Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1999-06-01' , '男');
insert into Student values('02' , '钱电' , '1999-12-21' , '男');
insert into Student values('03' , '孙风' , '1999-05-20' , '男');
insert into Student values('04' , '李云' , '1999-08-06' , '男');
insert into Student values('05' , '周梅' , '2000-12-01' , '女');
insert into Student values('06' , '吴兰' , '2001-03-01' , '女');
insert into Student values('07' , '郑竹' , '1998-07-01' , '女');
insert into Student values('08' , '王菊' , '1999-01-20' , '女');
insert into Student values('09' , '刘景东' , '1998-07-01' , '男');
insert into Student values('10' , '李云' , '2003-06-20' , '女');

-- 选课表 SC
create table SC(Sid varchar(10), Cid varchar(10), score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
insert into SC values('08' , '01' , 80);
insert into SC values('08' , '03' , 76);
insert into SC values('10' , '02' , 83);

-- 课程表 Course
create table Course(Cid varchar(10),Cname varchar(10),Tid varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');

-- 教师表 Teacher
create table Teacher(Tid varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张兰');
insert into Teacher values('02' , '李云');
insert into Teacher values('03' , '王海欣');

-- 临时表 Temp(Cid课程号,Cname课程名,AScore平均成绩)
create table Temp(Cid varchar(10),Cname varchar(10) null,AScore decimal(18,1) null);

试按以下操作要求完成SQL语言设计。

答题规定:在每题下方附上设计的可编辑SQL文本,并粘贴运行结果截图。

1. 查询" 01 "课程比" 02 "课程成绩低的学生的信息及对应" 01 "" 02 "课程分数。要求输出结构如下图所示:

2. 查询平均成绩低于 60 分的学生信息,输出其编号Sid、姓名Sname和平均成绩Avg_score  3列内容。

3. 查询没有选课的学生信息,输出SidSnameSdateSsex  4列内容。

4. 查询选课学生中选课门数最少的信息,输出其SidSnameSnum(选课数)3列内容。

5. 查询「李」姓教师和学生的人数合计值,输出标题为“num”。

6. 查询「张兰」老师授课学生中年龄最大的学生,输出其SidSnameSsex 3列内容。

7. 查询重名学生信息,输出其SidSnameSdateSsex 4列内容。

8. 询和" 08 "号学生学习的课程完全相同的其他学生信息,输出其学号Sid内容。

9. 查询至少有一门课与学号为"10"的同学所学相同的学生信息,输出其SidSnameSdateSsex 4列内容。

10. 查询计算学生的最大年龄差,输出标题为YMax。要求利用学生生日的相差天数按1365日去计算年龄差。

11. 查询计算" 02 "课程的成绩优秀率,输出标题为ERate。这里约定成绩在90(含)以上为优秀。

12. 按平均成绩从高到低显示学生的课程成绩以及平均成绩。要求输出结构如下图所示:

13. 查询出只选修两门课程的学生学号和姓名两列信息。

14. 查询本月过生日的学生信息,输出其SidSnameSdateSsex四列内容。要求使用系统日期获得本月信息。

  • 编程操作(每题10分,3题共30分)
  1. 试编写一个无参存储过程proc1,要求同时实现以下两个功能。
  1. 查询前面Course表中各科成绩的最高分和最低分信息,输出课程号Cid、最高分Smax和最低分SMin 3列内容;
  2. 查询Student表中年龄次小和第三小的学生信息,输出其SidSnameSdate 3列内容。

答题要求附上对象设计的SQL程序和调用文本,并粘贴必要的运行结果截图。

  1. 试编写一个有参存储过程proc2,要求实现以下功能。

以输入参数pName为学生姓名条件查询该生的选课数并通过输出参数pMax完成输出操作。

最后调用设计好的存储过程proc2,查询输出学生周梅的选课数。

答题要求附上对象设计的SQL程序和调用文本,并粘贴必要的运行结果截图。

  1. 试编写一个触发trig要求实现以下功能。

向临时表Temp中添加已经开设的课程(课号Cid)时,第2Cname课程名字段值自动填入对应Course表中的课程名,第3AScore字段值自动填入对应SC表中该课程的平均成绩值。     

请测试添加课程“02”的效果。

       答题要求附上对象设计的SQL程序和测试语句,并附上运行截图!


写在最后

上辈子像无惨哥哥一样杀人放火,这辈子才会在ciee的计算机系学数据库。

选课的时候早点去隔壁大数据的课,不然会追悔莫及,佛来了都救不了你的那种。

至于为什么不回顾理论,首先30个小题+6个概念论述题+至少7个计算分析题,我觉得还是按照我上一句话说的做比较好。

当然,以上仅是菜鸡的发言。如果你是超级大佬,可以忽略我这部分的话语。

你可能感兴趣的:(数据库原理与实践,数据库,数学建模)