有时您可能倾向于组合跨多个表的数据。在这些时候,您可能想知道什么样的SQL语法是最好的。答案当然是JOIN。但这是一个比这更复杂的答案。

加入是通常用于组合和整合两个或更多表的语法。表一次加入两个,使得一个新表,其中包含来自原始两个表的所有可能的行组合 - 或者一次使用多个表。有许多类型的连接命令,具体取决于需要组合的表和它们内部的数据。因为有多种类型的加入命令,所以要了解所有这些都是一个好主意。这样,当您准备开始创建自己的语句时,您永远不会混淆使用哪种类型的连接。

完整的SQL Bootcamp 2021:从零到英雄

上次更新10月2020年

畅销书
  • 83讲座
  • 所有级别
4.7 (97097)

成为SQL的专家!|何塞波罗拉

探索课程

作为开发人员,您可能有不同的方法来处理数据库查询。在本教程中,我们将详细介绍如何使用一些更常用的方法连接表——包括如何将多个表上的查询合并到一个语句中。虽然其中一些选项可能会影响性能、增加或减少处理时间或弹出错误,但实践和经验将使您更容易知道何时使用哪种类型的查询。

如果您是编写SQL查询的新手,或者需要复习一下,您可能希望从我们的有用SQL命令列表开始。它将概述如何使用INSERT INTO、DELETE和ORDERBY等操作。

加入多个表的最简单方法

首先,让我们从连接多个表的最简单方法开始。它是如此简单,以至于你可能已经在做了。

查询多个表的最快,最简单的方法是直接通过SELECT语句。您可以使用FROM子句调用多个表格来组合来自多个表的结果。

选择表。column1,表二。column2 FROM table1, table2 WHERE table1。column1 = table2.column1;

使用SELECT语句,大多数人将在没有每天实现它的情况下加入表格。Select语句的优势是它非常简单;如上所述,大多数人甚至没有意识到他们已经使用过它。但是,SELECT语句的缺点是它对您如何加入桌子的控制权并不起。

而且,当然,它也会感到凌乱。因为必须用其表名和自己的名称调用每个列,因此很难读取。

假设您希望在从多个表中选择数据时控制表的顺序,特别是连接到左表,或者使用外键。其他类型的连接和SQL查询可能更适用,您可能需要高级的连接操作。

其他JOIN SQL查询将为您提供对数据操作的更多控制。这不仅可以帮助您获得所需的结果,还可以控制完成查询时使用的资源。连接多个表通常是资源密集型的,包括CPU和内存。因此,您需要确保尽可能地简化和优化查询。

UNION语句是用一个查询从多个表返回信息的另一种方法。UNION语句允许您对多个表执行查询,并在统一集中返回结果,如下例所示:

SELECT column1, column2, column3 FROM table1;

这将返回一个结果集,其中包含三列包含来自两个查询的数据。默认情况下,除非使用UNION所有关键字,否则union语句将省略表之间的重复。

当不同表返回的列没有可以比较和连接的列或数据时,或者当它阻止运行多个查询和在应用程序代码中附加结果时,UNION是有用的。与子查询一样,UNION语句可能会在数据库服务器上创建沉重的负载,但偶尔使用时,它们可以节省大量时间。

如果您发现自己需要做很多工会查询,那么它或多或少可能必须重构数据库,以便在单个表中包含这些表,或者至少可能需要移位一些数据。由于其繁重的资源负荷,Union查询不应频繁或内置于应用程序中;由于需要执行的数据操作量,它们并不像许多其他查询那样可扩展。

执行SQL连接命令

使用SELECT和UNION,某些数据库可能限制他们可以处理的表数量。这是使用SQL JOIN语句加入两个或更多表的好主意。加入表格可能在SQL Server上具有更多压力,但也取决于所使用的SQL Join语句的类型和JOIN子句。

实际上,有多种类型的SQL语句。有一个SQL语句用一次性和手段,由手动查询数据库的开发人员使用。某些程序员甚至在其应用程序中包含了SQL命令。将SQL语句添加到应用程序中时,它们必须可扩展。SQL Join是一个强大的工具,但考虑在数据库增长并且随着应用程序的使用情况时,它将如何适应它。

让我们看一下所有类型的SQL连接。

SQL连接的类型

下面是不同类型的SQL连接:

为什么需要这么多JOIN命令?

这些都将连接多个表。但是它们与SQL中的表有不同的关联;有了这些SQL JOIN和正确的JOIN条件,您就可以深入控制如何标识和返回数据。

理解上面的join就像拥有一个非常好的工具箱。所有这些JOIN语句都适合不同的场景,它们都不是“一体化”的工具。在区分它们时,您需要考虑希望数据如何配对,希望返回哪些数据,以及资源使用的重要性。

对于刚刚学习的许多SQL开发人员来说,真正了解这些连接语句的最佳方法是创建两个(或更多)表并在它们上运行这些语句。通过运行这些语句并查看结果,您将学到更快的工作。

SQL内连接

定义:返回满足连接条件的多个表中的所有行,或者返回table1和table2相交的记录。INNER JOIN将只返回两个表中都有数据的行。它指定两个表的完全叉乘。

从table1.column = table2.column中选择来自table1内连接表2的列;

内部连接与外部连接非常相似,但您需要知道您要事先要做什么 - 无论您需要返回所有记录还是您是否只想想要适用的记录。外部加入为您提供更多对数据的控制,但内部连接将返回您可能需要的所有内容。

但是,内联也可能提供不适用于您需求的信息。因为它们将包括不符合您所有要求的行,因此可以使用空结果填充您的查询。

左外连接

定义:这种类型的连接返回来自用ON条件指定的left表的所有行,只返回来自另一个表的满足连接条件的行。该语句返回table1中的所有记录,仅返回table2中与table1相交的记录。

从Table1中选择列的列[Outlue]加入表2在Table1.Column = Table2.Column ;Column ;Column;

许多人会默认使用SQL LEFT OUTER JOIN,而没有必要考虑他们可能需要一个SQL RIGHT OUTER JOIN代替。还有一些人只使用OUTER JOIN或INNER JOIN,而不指定LEFT或RIGHT表。

事实上,使用左或右表通常更进一步,大多数人只会在没有得到他们需要的数据的情况下进行。尽管如此,对左右加入的更深层次理解可以更容易找到和操作数据。

记住:左右术语是相对的。他们将反映您列出您表格的顺序。

经典的内联连接或外部连接声明通常是某人将使用的内容,如果选择或联合语句没有为它们工作。换句话说,内连接和外连接语句是最常见的连接类型,没有任何左,右或外部特征。所以,如果您要学习任何类型的加入陈述,您将要了解这两个。

SQL右外连接

说明:此类型的连接从带有ON条件指定的右侧表中返回所有行,并且只能满足连接条件的其他表中的那些行。换句话说,此语句返回表2的所有记录,并且只与表2相交的表1的记录。

从Table1中选择列[Outlue]加入表2在Table1.Column = Table2.Column ;Column;

当然,您还可以控制引入的表的顺序。你总是可以把Table1带入Table2,反之亦然。因此,很少使用RIGHT OUTER JOIN,因为可以用LEFT OUTER JOIN代替它,而不会真正失去功能。

考虑一下,当您先引用CUSTOMERS然后再引用ORDERS时,CUSTOMERS表是LEFT,而ORDERS表是RIGHT。但是你也可以很容易地提到order和CUSTOMERS。所以,LEFT和RIGHT确实能帮助你理解抽象的东西,但实际上,你可以按照你想要的顺序排列,而LEFT JOIN通常会做你想做的事情。

However, there may be times when you want to be consistent regarding which tables are always “LEFT” and which tables are always “RIGHT” — usually if you’re going to conceptualize some tables (like the “customers” table) as being the main table with the major data storage.

SQL全外连接

定义:这种类型的连接返回来自left表和right表的所有行。如果不满足连接条件,则插入空值。JOIN操作之后的结果将是table1和table2中的所有记录。

在Table1.Column = Table2.Column中选择来自Table1 Full [Outlue]加入表2的列;

有些数据库将FULL OUTER JOIN关键字替换为FULL JOIN,因此您应该确保检查数据库使用的语法。

Oracle、Microsoft SQL和MySQL等所有数据库都源于SQL标准。话虽如此,它们并不是都以相同的方式遵循和实现这些SQL标准。正因为如此,一些语法可能会根据正在运行的程序而有所不同。您应该总是首先与您的SQL服务器签入。

除文档外,大多数SQL服务器还有一个“帮助”命令,可以让您了解有关函数的更多信息。如果您在没有任何修改器的情况下键入函数,则还可以概述其语法以及如何成功使用它。

SQL交叉连接

定义:这将返回第一个表中的每一行与第二个表中的每一行相结合的所有记录。可以通过两种方式指定CROSS JOIN:使用JOIN语法或在由逗号分隔的FROM子句中列出表,而不使用WHERE子句提供连接条件。

从[表1]中选择*交叉连接[表2]或从[表1]中选择*,[表2]

交叉连接是一个非常高级的加入类型,但它实际上非常简单;它只需创建第一表行和第二表的行的组合。它也被称为笛卡尔联接。但是因为它看起来很复杂,很好地关注你正在使用的语法。

虽然交叉连接是强大的(并且巧妙地简单),但您可能永远不会使用它;大多数人将使用其他形式的加入或以另一种方式连接他们的数据。但是,当使用时,它提供了从多个表中易于整合数据。

总结

您的成功作为成功的DBA在于构造和开发一个适当的设计和链接数据库,这将帮助您从您所需要的表中检索信息,根据表中的任何数据指定检索条件,并按任何顺序显示结果你喜欢。

加入命令最初似乎很复杂。但它们并不像似乎一样复杂。加入命令的主要问题是它们通常不是人类可读。他们往往非常漫长,并不“优雅”。通常,您需要对您选择的列和值非常具体,这导致乍一看看起来很困惑的查询。

但是,一旦去除JOIN命令中更复杂的部分,它们就非常简单了。它们只是比较数据集的一种方式。例如,如果您查看电子表格,这些类型的数据整合将变得非常直观。

虽然大多数人倾向于使用Select语句加入表,但了解其他类型的SQL联接深入将使某人成为更好的DBA。了解您可以使用的所有工具意味着当另一个工具最适合这项工作时,您也会熟悉。同时,这并不意味着您应该始终使用最复杂的格式。加入查询确实以一个价格来了;加入查询可能更复杂(和有趣),资源密集型的可能性越有可能。

始终记住,性能是子查询的一个重要因素。每个查询在作为主查询的资源使用之前都要单独处理。因此,创造性地使用JOIN语句可以在更短的延迟时间内提供更好的结果。但是,如果您发现正在经历高资源使用,并且需要使用大量JOIN语句来获得所需的结果,那么您可能还需要改变数据库的结构。

SQL顶级课程

SQL和PostgreSQL:完整的开发人员指南
斯蒂芬格莱德里
4.7 (1,285)
评价最高
SQL棘手的面试问题准备课程
KnowledgePowerhouse !
4.4 (200)
完整的SQL Bootcamp 2021:从零到英雄
何塞波罗拉
4.7 (97097)
畅销书
Ultimate MySQL BootCamp:从SQL初学者到专家
柯尔特·斯蒂尔,这是伊恩·斯库诺弗
4.6 (53,217)
畅销书
SQL - MySQL的数据分析和商业智能
365年职业生涯
4.6 (27,071)
畅销书
完整的SQL和数据库Bootcamp:零掌握[2021]
安德烈Neageie,Mo Binni
4.6 (1368)
SQL for初学者:使用MySQL和数据库设计学习SQL
Tim Buchalka的学习编程学院,Jon Avis - SQL教练
4.5 (9185)
SQL & PostgreSQL初学者:成为一个SQL专家
Jon Avis - SQL教练
4.5 (3,126)
畅销书
应用SQL的数据分析/数据科学与BigQuery
杰夫·詹姆斯
4.8 (22)
评价最高
SQL数据分析-与SQL Server
特拉维斯Cuzick
4.7 (489)

多个SQL课程

SQL学生也学习

赋予你的团队。引领行业。

使用Udemy for Business订阅在线课程库和数字学习工具。

请求一个演示