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语句。
- 查询“李”姓老师的数量;
Select count(*) from teacher where tname like “李%”;
- 查询学过编号为“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')
- 检索“01”课程分数小于60,按分数降序排列的学生信息;
select student.* from student,sc where student.sno=sc.sno and cno='01' and grade<60 group by score desc;
- 查询学生平均成绩及其名次
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;
- 查询出只选修两门课程的全部学生的学号和姓名
Select sc.sno,sname from student,sc
Where student.sno=sc.sno group by sc.sno,sname
Having count(*)=2
- 查询课程名称为“数学”,且分数低于60学生姓名和分数
Select sname,score from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and course.cname=’数学’ and score<60
- 查询选修“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;
- 检索至少选修两门课程的学生学号
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')
- 创建一个名为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. 查询没有选课的学生信息,输出Sid、Sname、Sdate和Ssex 4列内容。
4. 查询选课学生中选课门数最少的信息,输出其Sid、Sname和Snum(选课数)3列内容。
5. 查询「李」姓教师和学生的人数合计值,输出标题为“num”。
6. 查询「张兰」老师授课学生中年龄最大的学生,输出其Sid、Sname和Ssex 3列内容。
7. 查询重名学生信息,输出其Sid、Sname、Sdate和Ssex 4列内容。
8. 查询和" 08 "号学生学习的课程完全相同的其他学生信息,输出其学号Sid内容。
9. 查询至少有一门课与学号为"10"的同学所学相同的学生信息,输出其Sid、Sname、Sdate和Ssex 4列内容。
10. 查询计算学生的最大年龄差,输出标题为YMax。要求利用学生生日的相差天数按1年365日去计算年龄差。
11. 查询计算" 02 "课程的成绩优秀率,输出标题为ERate。这里约定成绩在90(含)以上为优秀。
12. 按平均成绩从高到低显示学生的课程成绩以及平均成绩。要求输出结构如下图所示:
13. 查询出只选修两门课程的学生学号和姓名两列信息。
14. 查询本月过生日的学生信息,输出其Sid、Sname、Sdate和Ssex四列内容。要求使用系统日期获得本月信息。
- 编程操作(每题10分,3题共30分)
- 试编写一个无参存储过程proc1,要求同时实现以下两个功能。
- 查询前面Course表中各科成绩的最高分和最低分信息,输出课程号Cid、最高分Smax和最低分SMin 3列内容;
- 查询Student表中年龄次小和第三小的学生信息,输出其Sid、Sname和Sdate 3列内容。
答题要求附上对象设计的SQL程序和调用文本,并粘贴必要的运行结果截图。
- 试编写一个有参存储过程proc2,要求实现以下功能。
以输入参数pName为学生姓名条件查询该生的选课数并通过输出参数pMax完成输出操作。
最后调用设计好的存储过程proc2,查询输出学生“周梅”的选课数。
答题要求附上对象设计的SQL程序和调用文本,并粘贴必要的运行结果截图。
- 试编写一个触发器trig,要求实现以下功能。
向临时表Temp中添加已经开设的课程(课号Cid)时,第2个Cname课程名字段值自动填入对应Course表中的课程名,第3个AScore字段值自动填入对应SC表中该课程的平均成绩值。
请测试添加课程“02”的效果。
答题要求附上对象设计的SQL程序和测试语句,并附上运行截图!
写在最后
上辈子像无惨哥哥一样杀人放火,这辈子才会在ciee的计算机系学数据库。
选课的时候早点去隔壁大数据的课,不然会追悔莫及,佛来了都救不了你的那种。
至于为什么不回顾理论,首先30个小题+6个概念论述题+至少7个计算分析题,我觉得还是按照我上一句话说的做比较好。
当然,以上仅是菜鸡的发言。如果你是超级大佬,可以忽略我这部分的话语。