θ连接之等值连接
首先声明有以下五个表(表的信息均来自mooc网的战德臣的数据库系统上课程):
S# 学号 (主键) Sname 名字 Ssex 性别 Sage 年龄 D# 所属院系系号 Sclass 所属班级
C# 课程号(主键) Cname 课程名称 Chours 课时数 Ccredit 学分 T# 教该课程的教师号
T# 教师号(主键) Tname 教师名称 D# 教师所在院系号 Salary 教师薪水
D# 院系号(主键) Dname 院系名称 Dean 院系主任
S# 学生学号(是sutdent的外键) C# 课程号(是course的外键,与S#共同形成主键) Score 该学号的学生在该门课程的成绩
虽然这里给出了一些数据,但在我们接下来的考虑中不仅只考虑这些数据,有些数据项可能会重复,有些数据项可能为空值,总之我们要尽可能缜密地考虑问题。
问题一:按‘001’号课成绩由高到低顺序显示所有学生的姓名。
问题中,“成绩”来自SC表,“姓名”来自Student表,而“001”号课在Course表和SC表中都有,当然能不用Course表则不用Course表(避免问题复杂化),于是我们将SC表和Student表笛卡儿积一下,试想一下这样的结果是什么?
不难发现,笛卡尔积出来的许多元组是没有意义的,我们要筛选出对我们有意义的元组,因此我们要找到这两个表的共同列即S#,这才是我们想要寻找的元组,具体地我们可以理解这样的操作就可以得到这个学号的人他的选课情况和他的学生信息。同理,如果把SC表和Course表笛卡儿积并通过C#连接,那么我们就可以得到该课号的课程情况和选该课的人的学号以及他的该课成绩。
回到题目,然后就是分析where后面的条件了,条件是课程号为“001”,即SC.C# = '001',然后按分数从高到低就是order by desc,如果是降序就要写desc,如果是升序就可以不用写(默认升序)。
select Sname from SC,Student where SC.S# = Student.S# and SC.C# = '001' order by Score desc;