如何懒于SQL3 —初学者参考

我是唯一手动编写SQL3有困难的人吗? 即使我们可以使用ORM系统轻松优雅地与数据库进行交互,但我还是深信,了解SQL3的机制很重要。 除了臭名昭著的以每个SQL3命令结尾的分号之外,语法还有些繁琐。 特别是乍一看,我绝对没有在语法所说的和语言如何工作之间建立自然联系。

您可以重新概念化您的SQL3方法,以节省时间和麻烦。 根据我的经验, 对于SQL3的实际运行您绝对需要某种形式的图像或过程感 ,否则,您将沮丧并陷入困境,疯狂地测试您不太了解的语法(根据个人经验进行保证)。 此外,正如我们在Flatiron的最初几周所学到的那样,尽管您可能只是对事物有一个肤浅的了解而潜入了一些早期的实验或问题,但是随着复杂性的提高,您不能只是艰难地解决并最终完成线。 您实际上将无法解决问题。 由于功能位于基本概念之上,因此除非您拥有在任何文字语法之外都有意义的元视图,否则您将迷失方向。 考虑一个可靠的图像(例如,可视化实际的列移动和连接),语法将从中有机地产生。

对我来说,找到一个SQL3连接策略是非常重要的一步。 我将在下面的示例中分享我的过程。 三个常规步骤:概念化过大的联接表,规划如何将其缝合在一起,最后根据分配参数剔除庞大的联接表。 显然,这是我自己的方法,如果可以帮助您,那么,如果您使自己的梦想成真,那是很好的。

注意。 Flatiron建议这样做-如果您曾经通过命令行对SQL3进行编码,请输入三个修饰符以方便您查看。 我十分同意。 他们是:

上的.headers

.mode栏

.width自动

  1. 概念化过大的联接表。

就我而言,这是最简单的开始方法。 不要考虑限制,分组,排序或任何其他类型的精美数据处理。 暂时不要区分表中的琐碎数据。 相反,请准确了解哪些表包含最终需要处理和显示的信息。

从广义上讲,您只是将具有显示数据和排序数据的列连接在一起。 这些类别不会总是重叠。 您可能没有显示用于对显示的列进行排序的列。 可见与否,您的“排序”或“分组”列是未过滤的联接表的一部分,位于包含显示数据的列旁边。

在开始出现问题时尝试尝试权衡所有奇特的数据处理是很诱人的,但这可能非常令人困惑-尤其是如果您对SQL3语法不坚定的话。 所以我说从最基本的开始。 哪些列包含我需要显示或操作的信息? 哪些列包含我需要对显示信息进行排序的信息? 所有这些都必须在您的联接表中。 而已。 暂时不要考虑排序,选择,分组或任何类型的处理。 只需在那里获取基本数据即可。

2.确定如何联接表。

正如我们所教的那样,SQL3是一个了不起的工具,可通过它们与其他数据的关系来访问数据。 如果您正在使用同一数据库中的不同表,则它们可能与其他表直接或间接相关。 我们的Flatiron SQL3练习当然设置为在表之间具有这些连接,因此我们可以联接表并对其进行操作以进行练习。 例如,我们的数据表通常通过著名的“具有许多/属于”关系进行关联,其中表x中的一项在表y中具有许多项,而表y中的一项属于表x中的一项。 我们还被告知,“具有很多/属于”动态是通过在每个“拥有”项上赋予“ foreign_key”来实现的,该“外国”键链接到“拥有者”项的主键id整数。

我认为这是返回到我们的列可视化效果的地方。 您可以将多个外键连接链接在一起,其唯一目的是联接两个间接相关的表。 实际上,即使这些中间表在最终结果中不可见,它们的列仍会集成到我们未经过滤的初始联接表中。 合并后,无论是否需要,您都可以访问这些“链接器”表的内容。

假设您终于确定了需要访问哪些表,并且已经成功映射了它们的连接。 恭喜你! 但是您的表很可能以许多列开头。 当您将它们随意地连接在一起时,就像我建议的那样,您的连接表将包含您需要的所有数据,而您不需要的大约50列。 不过,这很好,因为相关数据仍然存在。 您可以清楚地看到,SQL3只是将来自不同表的一堆列连接在一起,随后,您(用户)可以在这堆数据上使用SQL3的所有强大处理工具,但是您认为合适。

3.让我们从Learn.co上的SQL3众筹实验室中获得一个非常基本的示例。 以下是合并两个表,项目和认捐的结果。 我们是怎么来到这里的?

<<-SQL

选择 *

来自项目

加入承诺

ON projects.id = pledges.project_id;

的SQL

^对于我们的数据库,上面的代码将在下表中显示:

假设地,我们一直非常仔细地研究表格中的信息。 我们了解如何通过外键将数据链接到此联接表中。 我们知道,SQL3现在可以一次访问此表中的数据。 让我们一起看一个(IMHO)复杂的问题,并找出正在发生的事情。

来自Learn.co SQL3 Crowdfunding实验室的问题3需要代码

哇! 起初这吓到我了。 但是,我们拥有了所需的所有数据,这个问题为SQL3作为一种语言带来了一些好处。 让我们潜入。

这是最终答案:

最终SQL3查询

让我们逐一遍查代码。 首先,要获得上图所示的联接表,我们必须知道我们正在将项目表与誓约表联接在一起。 考虑问题的措辞以及相关数据的位置。我们需要项目标题和目标,但是我们也需要仅在认捐表中存在的认捐额。 因此,在某些时候我们需要以下内容:

在更大的范围内,此摘要最终将加入我们的项目和认捐表。 现在让我们谈谈“ SELECT”数据:

由于问题要求我们显示项目标题,因此我们在此处添加了“ SELECT projects.title”。 因此,我们知道我们需要该列。 接下来的添加稍微复杂一些。

我们的问题要求我们显示每个项目的认捐资金总额超过目标的金额。 我们如何得到这个?

使用方便的SQL3聚合器SUM累计认捐额。

现在,我们在这里缺少一个非常关键的元素。 我们是否要“求和”所有承诺金额,而不管项目是什么,然后从那个值中减去每个项目的资助目标? 我认为我们实际上是想分别将与每个项目相对应的认捐金额相加,并从其唯一的认捐金额总计中减去每个项目的单独融资目标。 因此,我们在“ JOIN”子句下面使用SQL3的“ GROUP BY”方法。

现在让我们看看我们的代码以及它向我们揭示的内容。

编码:

;

结果表:

哇! 因此,SUM列中的负数表示尚未达到其融资目标的项目。 该问题要求我们仅显示符合其目标的项目的数据。 在“ GROUP BY”子句之后,我们需要一个附加子句来隐藏未资助的项目。

最终代码:

结果是非常简短的表格(众筹很难!):

我希望您可以从本演练中受益匪浅。 IMO最大的收获甚至不是专门针对续集,而是关于理解语法概念。 我发现花更多的时间阅读Learn.co课程可以节省大量的时间,因为更高级的代码实际上是有意义的。 如有疑问,请返回该技术的第一原理,并确保您具有基本的支柱。 从那时起,您应该对更高级的功能有很好的掌握,并且应该具有对代码进行创意的能力。

附带说明一下,您可以通过一些研究使最终表中的这些丑陋的,非描述性的列标题变得更好。

如果您有时间回应评论,问题或批评,我们将不胜感激! 希望能更好地写博客。 直到下一次,感谢您的阅读。