将Join Query转换为嵌套子查询的说明

时间:2016-03-31 22:10:20

标签: mysql join

我知道这个问题很多。但是,我无法理解为什么会这样。我正在斯坦福大学的数据库入门课程中做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') )

为什么会这样?有没有直观的方法来解释为什么这两个查询是相同的?

1 个答案:

答案 0 :(得分:0)

对于嵌套查询:

  1. Highschoolers表中,找到Gabriel的ID。
  2. Friends表中,找到结果为1的朋友的ID。
  3. Highschoolers表中,找到结果为2的所有人的姓名。
  4. 对于联接查询:

    1. Highschoolers中的所有人,通过将Highschoolers.IDFriends.ID1相匹配,找到所有朋友的ID。
    2. 通过将Friends.ID2Highschoolers.ID的第二个实例匹配来查找所有朋友的姓名。
    3. 因为我们需要同时查看Highschoolers中的两行,所以我们需要对表进行两次单独的引用。你可以想象这有两个相同的Highschoolers副本,只要你记得真的只有一个副本,你只需要使用它两次。

      1. 只记录朋友姓名为“Gabriel。”的记录。
      2. 基本上,这两个查询从相反的两端接近同样的问题。

        希望有所帮助。