我目前正在参加斯坦福大学的在线MOOC课程。我有一个关于SQL查询的问题。我有三个表:.Range(Cells(4, NextColumn), Cells(OutputLastRow, NextColumn)).Formula = _
"=VLOOKUP(D4,'" & sourceSheet.Name & "'!$A$2:$H$" & SourceLastRow & ",6,0)*1000" & "*" & ColumnStr3 & 4
,Student
和Apply
。学生有学生证(College
)和GPA(sID
)。 Apply具有学院名称(GPA
)和学生ID。学院有大学名称(cName
),学院所在州(cName
)。这是老师正在使用的查询:
state
我不明白为什么我们需要Select distinct College.cName, state, GPA
From College, Apply, Student
Where College.cName = Apply.cName
And Apply.sID = Student.sID
And GPA >= all (select GPA from Student, Apply
Where Student.sID = Apply.sID
And Apply.cName = College.cName)
。我知道它确保它们匹配,但为什么这是必要的?
答案 0 :(得分:1)
你的教授正在使用旧式连接,这种连接在这里难以理解,是用新式连接编写的
Select distinct College.cName, state, GPA
From Student
JOIN College on College.cName = Apply.cName
JOIN Apply on Apply.sID = Student.sID
WHERE GPA >= all (
select GPA
from Student
JOIN Apply ON Student.sID = Apply.sID AND Apply.cName = College.cName
)
旧式连接在90年代很老了。你的老师生活在过去。
当然,这个例子对于任何一般教学来说都是可怕的,但如果学生们甚至不理解简单的连接,那就更糟了。
对不起。
旁注 - 如果您的问题是,
相同Student.sID = Apply.sID AND Apply.cName = College.cName
中的订单是否重要 - 答案是否定的。在这样的比较中,它与Apply.sID = Student.sID AND College.cName = Apply.cName
答案 1 :(得分:0)
这是为了找到学生已申请大学的Apply表中的所有匹配行,并找到学生从大学表中申请的所有大学名称。另外,让我纠正你的学生,申请和学院不是这里的数据库。它们是数据库的表。希望这是有道理的。
答案 2 :(得分:0)
该专栏:来自大学,申请,学生 是一个隐式连接。是Student.sID = Appply.sID和Apply.cName = College.cName行告诉查询如何将表匹配在一起。
如果没有给出任何限制,它将采取学院表格中的每个项目,将其复制为申请中的行数,并修改每行适用于学院的每一行(交叉乘法)。然后复制新创建的表格' College加入Apply'对于表Student上的每个项目,将表Student上的每个项目应用于每个重复的行。