关系数据库允许您使用主键和外键连接您的表。数据库管理关系,但查询时只有一个表的结果集返回 - 除非您链接数据。用于链接数据的最常用方法是外连接和内连接,但是也有不同类型的连接(例如自动连接和左连接)。

在本文中,您将更多地了解如何使用内部连接从两个表返回行,以及如何构建SQL语法查询以获得所需的数据。

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

上次更新10月2020年

畅销书
  • 83课
  • 各级
4.7 (97,704)

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

探索课程

什么是SQL内连接与SQL外连接?

在开始加入表之前,您需要知道您是否尝试生成内连接或外连接。内连接产生两个表的交叉点,而外部连接提供两个表的联合。这些会带来大幅不同的结果。

内连接不会包含不匹配的行,而外部连接可以具有匹配的行和脱匹次行。这是一个主要的区别。您可以运行内联连接和外部连接以查看每个数据,每个数据都会生成并识别哪一个适合您。

男装白色礼服衬衫

还有另一种类型的连接:左连接。左连接将在左侧表中生成所有记录,无论是否与其他表匹配,而内部连接会(再次)不包含与不匹配的行。但是左连接往往比内部连接更昂贵的资源。

如果您尝试找到应始终匹配的数据(在每个表中使用内容生成行),则内部连接通常是正确的选择。但是,如果要生成表的所有内容,是否行匹配,外连接更好。

连接的主键和外键

连接表的概念源于初级和外键。SQL数据库中的每个表都应具有主键。主键必须是唯一的,不能为null。您可以使用复合键,这意味着多个表列构成主键。

无论您选择什么,主键都是唯一标识您的记录的列或列组。例如,如果您有一个客户表,您需要主键来确定您的客户id。

现代数据库没有总是有主要键。值得注意的是,这是一个最佳实践,但这不是一个练习SQL系统强制执行。可以拥有没有唯一ID或主键的整个系统,在这种情况下,您需要创建它。还可以通过链接数据库的多个因素来创建主键“在--fly”,例如该人的名字和姓氏 - 以及一些主键是电子邮件地址的类似。无论哪种方式,都必须有一些唯一的桌子指示灯。

大多数关系数据库,如Microsoft SQL Server和MySQL,都有自动增量的功能。自动递增列自动向最后一条记录添加1,并将新编号插入到列中。一些小型企业和数据库开发人员使用这种技术为表创建主键。自动递增列保证表总是有唯一的列。如果您试图创建重复的主键,SQL数据库将返回一个错误。但是,尽管拥有这种类型的惟一标识符是最佳实践,但并不是每个人都使用它。

外键包含相同的主键值,但它们存在于相关表中。例如,电子商务商店为客户和订单提供表。客户表包含标识客户的主键,Orders表包含一个外键,例如“CustomerID”,其中包含每个记录中的客户的主键值。这个主要和外界关系是内部连接查询的基础。

编写内部连接查询

现在我们了解主键和不同类型的加入查询,我们将查看SQL Inner Join的语法。但首先,一个简单的SQL查询。

下面的代码从“customers”表返回一个客户列表:

从客户选择*

上面的查询可能是您可以为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代码将获取在最近7天内注册的所有客户以及在最近5天内下的任何订单:

Select * from Customers C内部连接订单O其中C.customerID = O.CustomerID其中C.Signupdate> = GetDate() -  7和O.OrderDate> = GetDate() -  5

请注意两个列使用的别名。“C”别名告诉SQL数据库该列位于客户表中。“o”表示列在订单表中。这些别名需要是基于表的表格。

您需要对查询所需的最终更改列在列出列以返回。现在,星号表示数据库返回所有列。返回数据集是一种低效的方法。您通常只需要在记录中的几列,以便在应用程序的前端使用它。要修复问题,请指定列。您还需要将您的别名用于返回的列。以下代码是示例:

从客户中选择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外连接查询。

另请注意,您不能只需将插入件切入“选择”;您无法加入INSERT,连接条件不会翻译。

使用内连接查询时常见错误

除了使用一些复杂的语法外,内连接相当简单。使用内连接查询时的一个常见错误是意外地使用了错误的主键。可以使用错误的标识符,或者可以使用实际唯一的标识符,例如全名 - 可以有多个具有相同名称的客户。也可以使用错误类型的连接,例如左外连接或全外连接,而不是更简单的方法。

另一个问题可以尝试比较不具有相同数据类型的项目或意外地从错误的表中拔出错误的值。因为播放中有多个表,所以开发人员指定他们尝试从中拉动数据的表是非常重要的。如果两个表都有列共享相同名称但包含不同数据的列,则可能会令人困惑。

例如,涉及“客户”时,可能会在客户表(Customer.Email)下记录的电子邮件地址,但也可能有一个订单(Order.email)记录的电子邮件地址。这些电子邮件地址可能是相同的;客户可能已指定电子邮件地址具体的到正在进行的订单。在这种情况下,开发人员必须非常清楚他们是否正在尝试将客户的电子邮件地址或附加到订单附加的电子邮件地址 - 都在概念级别和语法级别。比较运算符尤为重要。

除此之外,当多个开发人员在同一个团队中工作时,内连接查询可能会很复杂。您应该留下注释和注释来描述内部连接查询试图完成的内容,因为连接查询往往比其他类型的查询“可读性更差”——很难一眼就得出查询试图完成的内容。

使用内部连接查询时的主要问题

与大多数连接查询一样,内部连接查询可能会使用系统中的大量资源。连接查询对CPU和RAM都有要求。因此,在编写这些连接查询时一定要特别小心。如果一个应用程序需要许多广泛的连接查询才能工作,那么最好重新构造数据库,使它们不再是必需的。

开发的最高课程bob外围官网

100天的代码 - 完整的Python Pro Bootcamp 2021
安吉拉Yu博士
4.7 (26,447)
深度学习A-Z™:手动人工神经网络
基里尔·埃雷门科,哈德林·德·蓬特维斯,利朗西团队
4.5 (36565)
畅销书
完整的2021年颤振开发训练营与Dartbob外围官网
安吉拉Yu博士
4.7 (30,966)
畅销书
数据科学课程2021:完整的数据科学训练营
365职业,365职业团队
4.6 (90,693)
畅销书
Unreal Engine C ++开发人员:学习C ++并制作视频游戏
Ben Tristem,Sam Pattuzzi,Gamev.TV团队,Rob Brooks
4.6 (51,240)
畅销书
终极MySQL训练营:从SQL初学者到专家
Colt Steele,Ian Schoonover
4.6 (53535)
畅销书

更多的发展bob外围官网课程

随着连接查询变得越来越复杂,它可能会变得越来越“占用资源”。连接查询中涉及的表越多,系统工作起来就越困难。理想情况下,开发人员应该要求从连接查询返回的信息尽可能少,操作的数据也尽可能少。只要资源使用受到保护,就可以连接多个表。

在语法上,加入查询很复杂。如果选择了错误类型的连接查询(例如需要内部的外部),所提供的数据将不准确。此外,加入查询并不总是可读的。因为它们很复杂,所以鉴于提供的查询,这可能并不总是显而易见的。因此,您应该彻底研究查询以确保它们产生正确的结果。这个问题正确也很重要:“加入表2”并不像“加入客户”一样描述。

无论如何都有一些缺点要使用加入查询,它们通常是在多个表中获取数据集的最佳和最简单的方法。加入查询在应用程序中很有用作作为Google地图和作为登录页面的简单 - 并掌握,它们非常强大。

现在已经介绍了内部连接,让我们看看一些更有用的SQL命令。

SQL中的顶级课程

通过简单的例子学习SQL概念
M K.
4.6 (15)
新的
SQL和PostgreSQL:完整的开发人员指南
Stephen主梁
4.7 (1340)
收视率最高
完整的SQL Bootcamp 2021:从零到英雄
何塞Portilla
4.7 (97,704)
畅销书
终极MySQL训练营:从SQL初学者到专家
Colt Steele,Ian Schoonover
4.6 (53535)
畅销书
SQL - 用于数据分析和商业智能的MySQL
365职业
4.6 (27320)
畅销书
高级SQL:SQL Expert认证准备课程
Oracle Master Training•全球80,000多名学生,Code Star Academy
4.4 (2,089)
完整的SQL和数据库训练营:零到精通[2021]
Andrei Neagoie, Mo Binni
4.6 (1,391)
SQL for初学者:使用MySQL和数据库设计学习SQL
Tim Buchalka的学习编程学院,Jon Avis - SQL讲师
4.5 (9,909)
SQL&PostgreSQL为初学者:成为一个SQL专家
Jon Avis - SQL教练
4.5 (3,156)
畅销书

更多SQL课程

SQL学生还学习

让你的团队。领导行业。

通过Udemy为Business获取组织的在线课程和数字学习工具库的订阅。

请求演示