SQL Inner Join:链接数据库表
关系数据库允许您使用主键和外键连接您的表。数据库管理关系,但查询时只有一个表的结果集返回 - 除非您链接数据。用于链接数据的最常用方法是外连接和内连接,但是也有不同类型的连接(例如自动连接和左连接)。
在本文中,您将了解更多有关使用内连接到从两个表返回行的信息 - 以及如何构建SQL语法查询以获取所需的数据。
什么是SQL内连接vs. SQL外连接?
在开始连接表之前,您需要知道是要生成内连接还是外连接。内连接产生两个表的交集,而外连接提供两个表的并集。这将带来截然不同的结果。
内连接不会包含不匹配的行,而外部连接可以具有匹配的行和脱匹次行。这是一个主要的区别。您可以运行内联连接和外部连接以查看每个数据,每个数据都会生成并识别哪一个适合您。
还有另一种类型的连接:左连接。左连接将在左侧表中生成所有记录,无论是否与其他表匹配,而内部连接会(再次)不包含与不匹配的行。但是左连接往往比内部连接更昂贵的资源。
如果您尝试找到应始终匹配的数据(在每个表中使用内容生成行),则内部连接通常是正确的选择。但是,如果要生成表的所有内容,是否行匹配,外连接更好。
加入的主要和外键
连接表的概念源于初级和外键。SQL数据库中的每个表都应具有主键。主键必须是唯一的,不能为null。您可以使用复合键,这意味着多个表列构成主键。
无论您的选择如何,主键都是唯一标识记录的列或列组。例如,如果您有客户表,则需要主键来确定客户ID。
现代数据库没有总是有主要键。值得注意的是,这是一个最佳实践,但这不是一个练习SQL系统强制执行。可以拥有没有唯一ID或主键的整个系统,在这种情况下,您需要创建它。还可以通过链接数据库的多个因素来创建主键“在--fly”,例如该人的名字和姓氏 - 以及一些主键是电子邮件地址的类似。无论哪种方式,都必须有一些唯一的桌子指示灯。
大多数关系数据库,如Microsoft SQL Server和MySQL具有自动增量功能。自动增量列会自动添加1到最后一条记录并将新号码插入列。一些小企业和数据库开发人员使用此技术为表创建主键。自动递增列保证您的表始终具有唯一列。如果您尝试创建重复的主键,则SQL数据库将返回错误。但是,虽然有这种类型的唯一标识符的最佳实践,但不是每个人都使用一个。
外键包含相同的主键值,但它们存在于相关表中。例如,电子商务商店为客户和订单提供表。客户表包含标识客户的主键,Orders表包含一个外键,例如“CustomerID”,其中包含每个记录中的客户的主键值。这个主要和外界关系是内部连接查询的基础。
编写内部连接查询
现在我们了解主键和不同类型的加入查询,我们将查看SQL Inner Join的语法。但首先,一个简单的SQL查询。
以下代码从“客户”表中返回客户列表:
从客户中选择*
上面的查询可能是您可以为SQL数据库编写的最基本查询。上面的查询没有过滤器,无排序,没有子查询,没有连接。但是,对于大多数应用来说,这不是很有用。要为查询添加一点有用性,请使用“where”子句过滤记录。以下SQL代码获得了上周内签名网站的客户列表:
选择*来自SignUpdate> = GetDate() - 7的客户
现在,如果您只需要客户列表,但假设您需要一个客户和相关订单的查询非常棒?您可以获得订单列表并将其链接到前端代码中的客户,但它完全效率低,不准确。
这就是内在加入查询发挥作用的地方。以下代码使用相同的“其中”子句过滤器,但它还为您的客户返回订单列表:
Select * from Customers C内部连接订单O其中C.CustomerID = O.CustomerID其中C.Signupdate> = GetDate() - 7
顺便提一下,对于Microsoft SQL Server,您可以消除加入查询的“内部”部分,并且SQL将假设您的意思是“内部”短语。返回的记录集包含客户和Orders表中的每列。注意“C”和“O”别名。如果您没有指定这些别名,则需要写出整个表名以加入列。别名使您更容易参考表。如果您的客户的表和订单表都具有“SignUpdate”,则SQL Server将返回一个指示您引用了模糊的列名称的错误。
内连接和替代外部连接之间的一个区别是显示的记录数。如果SQL数据库服务器找不到客户的链接顺序,则从记录集中消除客户。因此,您收到的记录只有在过去七天内的订单和注册日期。或者,外连接查询将返回所有客户记录和任何客户订单。使用外连接,您可以查看记录集,您可以看到客户没有任何订单记录的订单的空值。
例如,以下SQL代码查询SQL Server并使用外连接返回相同的逻辑记录集。在注册中的所有客户记录,如果存在订单,则“其中”条款随意返回:
选择*来自客户C外左连接ORDER O.CUSTOMERID = O.CustomerID其中C.Signupdate> = GetDate() - 7
最后几个例子仅使用客户的列来过滤记录。您还可以使用已加入的表列。以下SQL代码获取在过去七天内签名的所有客户以及在过去五天内的任何订单:
Select * from Customers C内部连接订单O其中C.customerID = O.CustomerID其中C.Signupdate> = GetDate() - 7和O.OrderDate> = GetDate() - 5
请注意这两列使用的别名。“c”别名告诉SQL数据库该列位于客户表中。“o”表示该列在orders表中。这些别名需要基于表。
您需要对查询进行的最后更改是列出要返回的列。现在,星号指示数据库返回所有列。这是一种低效的返回数据集的方法。通常只需要记录集中的几列就可以在应用程序前端使用它。要修复这个问题,可以指定列。您还需要为返回的列使用别名。以下代码是一个示例:
从客户中选择c.first_name,c.last_name,o.OrderDate C.CustomerID = O.CustomerID的Chuider C连接订单O.CustimerID,其中C.Signupdate> = GetDate() - 7和O.OrderDate> = GetDate() - 5
在上面的示例中,返回名字和姓氏列。您知道它们从“C”别名前缀中出现在客户表中。返回的最后一列是订单日期。您知道此列出现在“O”别名中的订单表中存在。
这只是从多个表中从数据库返回数据的开始。您可以继续添加内联(和外部连接),直到您将所有表链接到所有表格并获取您需要的所有列需要前端应用程序。
现在,应该注意的是,有时数据库将更好地结构,以便不需要加入。如果组织定期使用“Customer_ContAct_Information”的“客户”表,例如,它将对客户表提供更多意义包括客户联系信息。
但在上面的例子中,加入是有道理的。客户和订单是离散表的命令对桌子进行了意义,因此,在比较表时使用连接进一步有意义。由于开发人员对寻找不匹配订单的客户(以及与客户不匹配的订单)的客户不感兴趣,因此有意义SQL内连接查询而不是SQL外连接查询。
还要注意的是,你不能仅仅把插入转换成选择;不能联接插入,联接条件也不会转换。
使用内连接查询时常见错误
除了使用一些复杂的语法外,内连接相当直接。使用内连接查询时的常见错误之一意外使用错误的主键。可以使用不正确的标识符,或标识符可以使用实际上不是唯一的,例如全名——可能有多个客户具有相同的名称。也有可能使用错误的连接类型,如左外连接或完全外连接,而不是使用更简单的方法。
另一个问题可以尝试比较不具有相同数据类型的项目或意外地从错误的表中拔出错误的值。因为播放中有多个表,所以开发人员指定他们尝试从中拉动数据的表是非常重要的。如果两个表都有列共享相同名称但包含不同数据的列,则可能会令人困惑。
例如,当涉及到一个“客户”时,可能会在客户表(customer.email)下记录一个电子邮件地址,但也可能会有一个与订单(order.email)一起记录的电子邮件地址。这些电子邮件地址可能不是是相同的;客户可能已指定电子邮件地址具体的到正在进行的订单。在这种情况下,开发人员必须非常清楚他们是否正在尝试将客户的电子邮件地址或附加到订单附加的电子邮件地址 - 都在概念级别和语法级别。比较运算符尤为重要。
除此之外,当多个开发人员在同一支队工作时,内连接查询可能很复杂。您应该留下注释和注释来描述内部连接查询尝试的内容,因为加入查询往往比其他类型的查询更少“可读” - 这可能很难派生查询尝试的内容 - a-瞥一眼。
使用内部连接查询时的主要问题
与大多数加入查询一样,内连接查询可能会在系统中使用大量资源。加入查询往往在CPU和RAM方面都需要苛刻。因此,在编写这些加入查询时要特别小心是很重要的。如果应用程序工作需要许多广泛的连接查询,则可以更好地重组数据库,以便不需要。
开发的最高课程betwayapp下载安装
随着加入查询变得更加复杂,它可能变得更为令人指向的“资源猪”。涉及加入查询的表越多,系统将需要工作。理想情况下,开发人员应要求尽可能返回的少数信息,并且随着少数数据被操纵。只要保护资源使用,就可以加入多个表。
在语法上,加入查询很复杂。如果选择了错误类型的连接查询(例如需要内部的外部),所提供的数据将不准确。此外,加入查询并不总是可读的。因为它们很复杂,所以鉴于提供的查询,这可能并不总是显而易见的。因此,您应该彻底研究查询以确保它们产生正确的结果。这个问题正确也很重要:“加入表2”并不像“加入客户”一样描述。
无论如何都有一些缺点要使用加入查询,它们通常是在多个表中获取数据集的最佳和最简单的方法。加入查询在应用程序中很有用作作为Google地图和作为登录页面的简单 - 并掌握,它们非常强大。
现在您已覆盖内部连接,让我们来看看一些更有用的SQL命令。