要求
在teacher、student、course、tc、sc表上完成以下任务:
请用两种方式完成以下任务,两种方式建立的索引或者视图的名字加序号区别,
如两种方式建立的同一个视图的名字分别为view1和view2
建立视图:
(1) 请实现能查询选课学生的姓名、选课门数、总分、平均分,最高分、最低分的视图
(2) 请实现能查询每个学生的姓名、选课门数、总分、平均分,最高分、最低分的视图
(3) 请实现能查询每门课程的课程名称、选课人数、平均分,最高分、最低分,且按平均分降序排列的视图
(4) 请实现能查询开课教师的教师编号、姓名、开课门数的视图
(5) 请实现能查询选课学生的姓名、课程名、成绩的视图
(6) 请实现能查询至少有一门与“张建国”选课相同的学生的姓名、课程名和系别。
(7) 请实现能查询选修课号为“01001”课程且成绩高于课程“01002”学生的姓名和这两门课程的课程名和成绩。
建立索引:
(1) 对教师表Teacher中的教师号Tno创建聚簇索引,并按降序排列。
(2) 对学生选课表SC,按学号Sno升序,课号Cno升序排列,再按成绩Score降序排列。
(3) 对学生表Student中的姓名Sname创建唯一索引,并按升序排列。
过程
1.建立视图
注意:view2----交互式,view1----sql语句
(1)请实现能查询选课学生的姓名、选课门数、总分、平均分,最高分、最低分的视图
a.sql语句
SELECT sname AS 姓名,count(cno) AS 选课门数, sum(Score) AS 总分,avg(Score) as 平均分,max(Score) AS 最高分, min(Score) AS 最低分 FROM SC,Student WHERE SC.Sno=Student.Sno GROUP BY SC.Sno
b.交互式
(2)请实现能查询每个学生的姓名、选课门数、总分、平均分,最高分、最低分的视图
a.sql语句
create view view21 AS SELECT sname AS 姓名,ifnull(count(SC.cno),0) AS 选课门数, IFNULL(sum(SC.Score),0) AS 总分,IFNULL(avg(Score),0) as 平均分,IFNULL(max(Score),0) AS 最高分, IFNULL(min(Score),0) AS 最低分 FROM Student LEFT JOIN SC ON SC.Sno=Student.Sno GROUP BY Student.Sname,Student.Sno SELECT * FROM view21
b.交互式
(3)请实现能查询每门课程的课程名称、选课人数、平均分,最高分、最低分,且按平均分降序排列的视图
a.sql语句
CREATE view view31 AS SELECT Cname AS 课程名称,IFNULL(count(SC.Sno),0) AS 选课人数,IFNULL(avg(Score),0) as 平均分,IFNULL(max(Score),0) AS 最高分, IFNULL(min(Score),0) AS 最低分 FROM Course LEFT JOIN SC ON SC.Cno=Course.Cno COLLATE utf8mb4_unicode_ci GROUP BY Course.cno ,Course.Cname ORDER BY 平均分 DESC SELECT * FROM view31
b.交互式
(4)请实现能查询开课教师的教师编号、姓名、开课门数的视图
a.sql语句
CREATE view view41 AS SELECT TC.Tno AS 教师编号,Tname AS 姓名,count(Tc.Tno) AS 开课门数 FROM TC,Teacher WHERE TC.Tno=Teacher.Tno GROUP BY TC.tno SELECT * FROM view41
b.交互式
(5)请实现能查询选课学生的姓名、课程名、成绩的视图
a.sql语句
CREATE VIEW view51 AS SELECT sname AS 姓名,cname AS 课程名,score AS 成绩 FROM SC,Student,Course WHERE sc.sno=Student.sno AND sc.cno=Course.cno COLLATE utf8mb4_unicode_ci SELECT * FROM view51
b.交互式
(6)请实现能查询至少有一门与“张建国”选课相同的学生的姓名、课程名和系别。
a.sql语句
CREATE VIEW view61 AS SELECT sname AS 姓名,cname AS 课程名,dept AS 系别 FROM SC AS a1,Student,Course WHERE student.sname!="张建国" and a1.sno=Student.sno AND Course.cno=a1.cno COLLATE utf8mb4_unicode_ci AND EXISTS ( SELECT 1 FROM student,SC AS a2 WHERE Student.sname="张建国" AND a2.sno=Student.sno AND a1.cno=a2.cno COLLATE utf8mb4_unicode_ci ) SELECT * FROM view61
b.交互式
(7)请实现能查询选修课号为“01001”课程且成绩高于课程“01002”学生的姓名和这两 门课程的课程名和成绩。
a.sql语句
CREATE VIEW view71 AS SELECT sname AS 姓名,cname AS 课程名, score AS 成绩 FROM Student,sc as a3,Course WHERE a3.sno=Student.sno AND a3.cno = Course.cno COLLATE utf8mb4_unicode_ci AND EXISTS ( SELECT 1 FROM sc AS a1,SC as a2 WHERE a1.cno="01001" AND a2.cno="01002" AND a1.sno=a3.sno AND a2.sno=a3.sno AND a1.score > a2.score COLLATE utf8mb4_unicode_ci) SELECT * FROM view71
b.交互式
2.建立索引
(1) 对教师表Teacher中的教师号Tno创建聚簇索引,并按降序排列。
a.sql语句
ALTER TABLE Teacher ADD PRIMARY KEY(tno DESC) SELECT * from Teacher
b.交互式
在mysql语句中自动将主键设置为聚簇索引,该交互式的结果和sql语句结果一致
(2) 对学生选课表SC,按学号Sno升序,课号Cno升序排列,再按成绩Score降序排列。
a.sql语句
CREATE INDEX idx_sc on SC (sno ,cno,score DESC)
b.交互式
(3) 对学生表Student中的姓名Sname创建唯一索引,并按升序排列。
a.sql语句
CREATE UNIQUE INDEX idx_student ON Student(sname)
b.交互式