理解SQL问题的唯一方法是了解您正在处理的数据。如果您无法以某种方式可视化表,则SQL的整个业务将变得非常抽象。因此,我们要做的第一件事是了解问题编号为No的表。让我们看一下我们的数据库。本文使用Self JOIN SQL ZOO教程上的练习编号10,以一种对初学者友好的方式来教授self JOIN。
假设您已经了解基本知识,所以我不会讲授如何编写SQL查询。相反,我将展示如何尝试理解数据库。我将思考过程分为以下步骤。
1.选择所有项目
如果我们的表有数百万行,则返回所有项目的查询可能需要花费很多时间才能加载。您始终可以使用LIMIT 50或类似的方式,这样就不会永久加载表。在我们的例子中,SQL ZOO已经只返回查询的前50行,因此我们不必担心。让我们看看它是什么样的。
好了,id和stop是我们用来连接两个表的键,这就是为什么它们在每一行中总是相同的原因。我们得到了车站的名称,公共汽车号和公共汽车公司。我们从一个较早的问题中了解到,通常我们会按编号和公司名称来引用总线,例如“ 124 SMT”。因此,通过查看我们的表,我们可以假设在A的车站我们可以乘坐124 SMT公共汽车。
到目前为止,一切都很好,但是我花了更多时间来了解pos是什么。在页面的开始,有一个链接可以将我们带到一个地方,他们可以告诉我们表中每一列的含义。他们说pos是停靠点的顺序,但是我仍然无法仅通过查看表格就可以看到它的含义。现在,对我们而言,好消息是我们不需要使用pos来解决问题,但是我仍然会告诉您如何在下一步中理解它。
2.使用ORDER BY了解发生了什么
如果我们被责令NUM然后通过位置,我们会看到“1轻轨的巴士,例如,从利思叶然后在往返去,直到它在其他9个站停车后回来雷斯。如果我们坐下来,我们会发现并不是所有的公交车都是往返的,因为它们不会总是停在起点的同一站。
就像我说的那样,我们不需要在此练习中使用pos,但是,如果我们试图查找(例如)不仅可用的公交车,而且要查找最短的路线,这可能会很有用。
好的,现在我们对正在发生的事情有了更清晰的了解,让我们看看问题想要我们做什么。
好的,所以,通过告诉我们我们需要两辆巴士,我们知道从A地点到B地点没有直达的巴士。换句话说,我们需要找到在A停靠的公交车,以及在B停靠的公交车。因为那是他们下车和换乘公共汽车的地方。我希望这很清楚。正如我所说,不查看地图可能很难将其可视化。但希望它会在一秒钟内变得更加清晰。
与一切一样,我们可以通过多种方式来做事情。在进行下一步时,请记住这一点。
3.永远不要忘记自我联接会创建一个新表
当您进行自我联接时,您可能会试图将其可视化为以某种方式联接到自身的桌子。但是考虑的方式是两个看起来完全一样的单独的表。您将新的加入第一个的一侧。因为它们完全相同,所以任何列都可以成为键。换句话说,您可以选择主键。这就是乐趣的开始!
现在,每行只有一个停靠站,但是对于下一步,我们需要另一个停靠站,即转移停靠站。所以,这就是我们可以做的:我们可以将一个新的路由表连接到我们已经拥有ON num AND company的表。
您会看到,我们的r2表被追加到我们的r1表中,并累加了所有列。r1和r2始终具有相同的num和company(在相同的行中),因为这是我们加入它们的地方。
我们已经看到“ 1 LRT”线贯穿11个站点。这就是为什么我们可以在每个新站点看到站点名称重复11行的原因。换句话说,您可以从Leith到达最右边一列中列出的所有站点。让我们减少显示的列数,以便可以更好地查看数据。
4.通过自我加入,横向思考
在要过滤数据之前,容易造成一些损失。如果您将表格可视化为水平地图,将很有帮助。在您的左边,您将要离开的地方是:A。在您的右边,您将拥有-我将很快显示它-您的转机站,然后是目的地。
因此,让我们用“ A” 过滤列名。
因此,如果考虑到“ 停靠站”列,那么我们现在要看的是可以从A出发的所有停靠站的列表。
现在,想象一下我们可以为洛亨德做同样的事情,但是不是将其作为出发,而是将其作为到达。让我们看看会是什么样子。
现在,“ 停止”列显示了所有我们可以乘公共汽车前往洛兴德的站点。
在此之前的查询中,我们看到了可以从克雷格洛克哈特出发的所有停留站。在这一过程中,我们拥有前往洛兴德的所有停留地点。换句话说,我们要做的就是将这两个表连接在一起。同样,请记住以下几点:JOIN s将表水平或左右连接。有一种叫做UNION的东西可以垂直堆叠表-彼此叠放,但是JOIN可以将它们水平粘合。
那么,如何连接刚刚看到的这两个查询?我将首先向您展示很长的路要走,然后再向您展示较短的语法。
好了,我仍然没有删除不需要的列,但让我们看一下。
现在,我们有四个路线表和一个停靠站表-向我们显示了转乘停靠站。现在,我们要做的是通过“ A”过滤r1的停靠点,并通过“ B”过滤r4的停靠点,我们将得到答案。为此,我们可以在表的开头加入另一个Stops表,然后在表的末尾附加另一个Stops。但是,相反,我们可以将学到的知识用于子查询,就像这样。
我们得到了解决方案。我们怎么知道?它说“列太多”。因此,我们知道我们只需要调整显示的列数即可。让我们看一下问题标题。
它说某些数据仍然不正确。让我们调查原因。如果我们向下滚动表格,则可以单击一个链接,该链接向我们显示答案的外观。来做吧。
当我们将其答案与他们的答案进行比较时,我们意识到这可能只是按照他们希望的方式订购色谱柱的问题。万一您无法立即可视化要ORDER BY的列,则可能需要做一些试验,但是最后,这就是我们要做的。
好极了!我们得到了笑脸和解决问题的方法。我只会向您展示的是针对同一解决方案的较短语法。
当然,它并没有那么短,当然也没有那么直观,但是您已经拥有了。同样重要的是要注意,当您使用JOIN ... ON语法时,始终可以在ON子句或WHERE上编写条件。
上述就是关于使用SQLZOO学习自我JOIN查询的全部内容,想了解更多关于SQL数据库的信息,请继续关注中培伟业。