我知道这个问题很多。但是,我无法理解为什么会这样。我正在斯坦福大学的数据库入门课程中做Q1:https://lagunita.stanford.edu/courses/DB/SQL/SelfPaced/courseware/ch-sql/seq-exercise-sql_social_query_core/
找到与名为Gabriel的人成为朋友的所有学生的姓名。
查询将是:
SELECT h1.name
FROM Highschooler h1
INNER JOIN Friend f1 ON (h1.ID = f1.ID1)
INNER JOIN Highschooler h2 ON (h2.ID = f1.ID2)
WHERE h2.name = 'Gabriel'
在线查看答案,这相当于:
SELECT name
FROM Highschooler
WHERE ID IN (SELECT ID1
FROM Friend
WHERE ID2 IN (SELECT ID FROM Highschooler WHERE name='Gabirel') )
为什么会这样?有没有直观的方法来解释为什么这两个查询是相同的?
答案 0 :(得分:0)
对于嵌套查询:
Highschoolers
表中,找到Gabriel的ID。Friends
表中,找到结果为1的朋友的ID。Highschoolers
表中,找到结果为2的所有人的姓名。对于联接查询:
Highschoolers
中的所有人,通过将Highschoolers.ID
与Friends.ID1
相匹配,找到所有朋友的ID。Friends.ID2
与Highschoolers.ID
的第二个实例匹配来查找所有朋友的姓名。因为我们需要同时查看Highschoolers
中的两行,所以我们需要对表进行两次单独的引用。你可以想象这有两个相同的Highschoolers
副本,只要你记得真的只有一个副本,你只需要使用它两次。
基本上,这两个查询从相反的两端接近同样的问题。
希望有所帮助。