SQL连接和SQL Server Management Studio查询设计器

有一大堆文章,博客条目和教程,寻求解释SQL如何加入工作。其中一些很棒,其他人只是令人困惑。我正在尝试澄清联盟的原因是突出显示如何正确使用可用的工具可以严重减少获取加入语法或类型错误的机会。由于Joins都是关于如何将数据从一个表与另一个表中联系到另一个表中,我认为使用父母和儿童(可能或可能与彼此有关)来说明主题是合适的。所以让我们见到家人。

彼得有2个孩子:乔和罗杰
玛丽有1个孩子:苏珊
爱丽丝有2个孩子:凯文和雷切尔
约翰有1个孩子:大卫
吉米没有孩子。
萨姆和伊恩没有父母。他们是孤儿。

这就是它们在数据库表中出现的方式:父母和儿童。孩子们与父母的父母有关。

内心联接 - 所有父母都有孩子

如果我们在SQL Server Management Studio中打开查询设计器,并添加2个表,则默认使用内部连接将在AdantridId上连接。如果它们不会自动加入(通过表之间出现的行),则您未将子表中的adutlid设置为外键。但是,您可以简单地拖动父母桌子上,并将其放在父母表中的成人身上以创造这种关系。

在Repsective列中选择AdightName和ChildName生成以下SQL:

当SQL执行时,所有父母 孩子们被归还:

所以谁丢了? Batchelor Jimmy无处可见(因为他没有孩子),也不是我们的孤儿,山姆和伊恩。内连接只返回来自两个表的行,其中基于加入谓词存在匹配,在这种情况下,该案例是父父项的何处。

左外联 - 所有父母,他们的孩子如果他们有的话

右键单击查询设计器中的连接行中间的菱形,显示了一个上下文菜单,其中包含一些选项。如果我们选择"从父母中选择所有行",钻石的左侧填充,生成一些新的SQL:

执行此操作时,左外连接返回所有父母(包括Jimmy),无论他们是否有孩子,都是:

它还返回有父母的所有孩子。在吉米的情况下,他对儿童名列有空,因为他没有孩子。

正确的外部加入 - 所有孩子,他们的父母如果有的话

我们取消选择"从父母中选择所有行", and select "从儿童中选择所有行"反而。现在填写了钻石的右手侧(或也许右侧侧面?),并且SQL改变以反映这一点:

执行时,我们的孤儿会出现在Shordname列中,其中null对父列。吉米无处可见。我觉得他只是讨厌孩子们。

全外联 - 所有父母和所有孩子

从“加入属性”菜单中选择两个选项给我们一个完整的外部连接:

这返回与关系的两侧的所有记录,无论是否存在匹配记录:

交叉加入 - 笛卡尔产品

如果我们删除加入线:

我们得到一个十字架加入,结果,在执行时,在两个表的笛卡尔产品中 - 5父母x 8儿童= 40行。这意味着一个表中的每一行与其他表中的每一行都匹配:

注意没有加入谓词。交叉连接有一些模糊的用途,包括创建测试数据,但通常,它们不使用。

使用加入查找无与伦比的记录

如果您研究了例如左外部连接的结果,您会注意到Jimmy在ResultSet的子表侧中的空值返回。将其应用于加入查询的过滤器对于在一个表中查找具有第二表中没有相关记录的表中的记录非常有用。

如果我们类型"IS NULL"在滤波器列对左侧外连接的儿童表的AdumantId列,我们最终结束了下图和SQL:

并执行此结果的结果是jimmy作为父母表中的唯一记录,在儿童表中没有匹配记录的唯一记录:

相反,在正确的外部连接中的成人桌子中对成人表做同样的事情:

导致此SQL和图表:

在返回的两个孤儿中执行的结果,因为再次,他们在父母表中没有匹配记录:

从发布到新闻组和论坛的问题中,在我看来,很多人要么没有意识到查询设计师的存在,要么不使用它,因为他们认为这是一种作弊。对于前集团来说,希望这篇文章将向您展示新的东西。对于后一组,使用您的工具可以使用任何错误。它加快了开发,减少了错误的错误。