![]() |
1
5651
假设您连接的列没有重复项,这是非常常见的情况:
实例 假设您有两个表,每个表只有一列,数据如下:
请注意,(1,2)对于A是唯一的,(3,4)对于B是唯一的,(5,6)对于B是唯一的。 内连接 使用任意一个等价查询的内部联接提供两个表的交集,即它们有共同的两行。
左外连接 左外部联接将给出A中的所有行,以及B中的任何公共行。
右外部联接 右外部联接将给出B中的所有行,以及A中的任何公共行。
全外部连接 一个完整的外部连接将为您提供A和B的联合,即A中的所有行和B中的所有行。如果A中的某些内容在B中没有相应的数据,那么B部分为空,反之亦然。
|
![]() |
2
2532
|
![]() |
3
604
|
![]() |
4
576
维恩图并不是真的适合我。 例如,它们不显示交叉联接和内部联接之间的任何区别,或者更一般地显示不同类型的联接谓词之间的任何区别,或者提供一个关于它们将如何操作的推理框架。 理解逻辑处理是不可替代的,不管怎样,它都比较容易掌握。
(注意:在实践中,查询优化程序可能会找到比上述纯逻辑描述更有效的执行查询的方法,但最终结果必须相同) 我将从一个动画版本的 全外部连接 . 下面是进一步的解释。
解释源表
先从A开始
从交叉连接中选择A.颜色,B.颜色
内部和外部联接有一个“on”子句谓词。
一些实例从内部连接中选择A.颜色,B.颜色A.颜色=B.颜色 上面是典型的equi连接。
动画版本
从内部连接中选择A.颜色,B.颜色A.颜色不在(‘绿色’、‘蓝色’)
内部联接条件不必是相等条件,也不需要引用来自两个表(甚至其中一个表)的列。评价
从1=1的内部连接B中选择A.颜色,B.颜色 对于交叉联接结果中的所有行,联接条件的计算结果都为true,因此这与交叉联接相同。我不会再重复16行的图片了。 从左侧外部连接处选择A.颜色,B.颜色A.颜色=B.颜色
外部联接的逻辑计算方式与内部联接相同,但如果左表中的一行(对于左联接)根本不与右表中的任何行联接,则在结果中保留
从左侧外部连接处选择A.颜色,B.颜色,A.颜色=B.颜色,其中B.颜色为空
这只会将前一个结果限制为只返回
为
从右侧外部连接处选择A.颜色,B.颜色A.颜色=B.颜色右外部联接的作用类似于左外部联接,但它们保留右表中不匹配的行,空扩展左列。
从一个完整的外部连接中选择A.颜色,B.颜色,A.颜色=B.颜色完全外部联接结合了左联接和右联接的行为,并保留左表和右表中不匹配的行。
从1=0的完整外部连接B中选择A.颜色,B.颜色
交叉联接中没有与
从1=0的完整外部连接B中选择“合并”(a.colour,b.colour)作为颜色。
通过对前面的查询进行细微的修改,可以模拟
从左侧外部连接B中选择A.颜色,B.颜色A.颜色=B.颜色,其中B.颜色=绿色
请注意
…然后是“where”子句。
如果只包含b中颜色为绿色的行和a中的所有行,不管正确的语法是什么 在A.colour=B.colour和B.colour='green'上从左侧外部连接B中选择A.colour、B.colour
SQL小提琴请参阅这些示例 run live at SQLFiddle.com . |
![]() |
5
127
联接 用于组合来自两个表的数据,结果是一个新的临时表。连接是基于一个叫做谓词的东西来执行的,它指定了执行连接时要使用的条件。内部联接和外部联接的区别在于,内部联接只返回基于联接谓词实际匹配的行。 让我们考虑雇员和位置表:
内部连接: 内部联接通过组合两个表的列值来创建新的结果表( 员工 和 位置 )基于连接谓词。查询比较 员工 每行 位置 查找满足联接谓词的所有行对。当通过匹配非空值满足联接谓词时,每个匹配行对的列值 员工 和 位置 合并为结果行。 下面是内部联接的SQL将是什么样子的:
外部连接: 外部联接不需要两个联接表中的每个记录都有匹配的记录。联接的表保留每个记录,即使不存在其他匹配的记录。外部联接进一步细分为左外部联接和右外部联接,具体取决于保留的表行(左或右)。 左外部连接: 表的左外部联接(或简单的左联接)的结果 员工 和 位置 始终包含“左”表的所有记录( 员工 ,即使联接条件在“right”表中找不到任何匹配的记录。( 位置 ) 下面是左外部联接的SQL,使用上面的表:
右外部连接: 右外部联接(或右联接)与左外部联接非常相似,除非对表进行相反的处理。“右”表中的每一行( 位置 )将至少出现在联接表中一次。如果“左”表中没有匹配的行( 员工 )存在,空值将出现在来自的列中 员工 对于那些没有匹配的记录 位置 . 这就是SQL的样子:
使用上面的表,我们可以显示右外部联接的结果集是什么样子的:
全外部连接:
完全外部联接或完全联接是通过在联接的结果中包含不匹配的行来保留不匹配的信息,请使用完全外部联接。它包括两个表中的所有行,不管另一个表是否具有匹配的值。
|
![]() |
6
118
内连接
只检索匹配的行,即,
左外连接从第一个表中选择所有记录,在第二个表中选择任何记录 与联接键匹配的表。
全外部连接从第二个表中选择所有记录,并选择第一个表中的所有记录 与联接键匹配的表。
工具书类 |
![]() |
7
104
简单来说: 安 内连接 仅检索匹配的行。 而一个 外部连接 从一个表中检索匹配的行,并从另一个表中检索所有行……结果取决于所使用的行:
|
![]() |
8
96
只有在联接的另一侧(右侧)有匹配记录时,内部联接才会显示行。 (左)外部联接在左侧显示每条记录的行,即使联接的另一侧(右)上没有匹配的行。如果没有匹配的行,则另一侧(右侧)的列将显示空值。 |
![]() |
9
71
内部联接要求联接表中存在具有相关ID的记录。 外部联接将返回左侧的记录,即使右侧不存在任何记录。 例如,您有一个orders和一个orderdetails表。它们通过“orderID”关联。 命令
订单详情
请求
将只返回在orderdetails表中也有内容的订单。 如果您将其更改为左外联接
然后它将从orders表返回记录,即使它们没有orderdetails记录。
您可以使用它来查找没有任何orderdetails指示可能孤立订单的订单,方法是添加一个类似于WHERE的子句
|
![]() |
10
60
简单来说: 内连接 ->仅从父表和子表中获取公用记录,其中父表的主键与子表中的外键匹配。 左连接 -gt; 伪码
右连接 :与左连接完全相反。在右联接中,将左联接中的表名放在右联接中的右侧,得到与左联接相同的输出。
外部连接
:显示两个表中的所有记录
例子:
现在假设两张桌子
这里,employees表是主表,phone_numbers_employees是子表(它包含
内连接 记下两张桌子的记录 仅当Employees表的主键(其ID)与子表的外键Phone_Numbers_Employees(Emp_ID)匹配时 . 所以查询应该是:
这里只取主键=外键上的匹配行,如上所述。这里,主键=外键上的不匹配行由于联接而被跳过。 左连接 : 左联接保留左表的所有行,而不管右表上是否有匹配的行。
外接 :
从图中可以看出:
|
![]() |
11
54
你用
在
|
![]() |
12
52
|
![]() |
13
50
同样地,
|
![]() |
14
38
答案是每一个的意义,所以在结果中。
我的回答基于上面 注释 . 如果有两张这样的桌子:
交叉连接/外部连接:
内部连接:
左[外部]连接:
完全外部联接:
嗯,根据您的需要,您可以选择满足您需要的每一个;)。 |
![]() |
15
30
内部连接。 联接正在合并两个表中的行。安 内连接 尝试根据您在查询中指定的条件来匹配这两个表,并且只返回匹配的行。如果联接中第一个表中的一行与第二个表中的两行匹配,则结果中将返回两行。如果第一个表中有一行与第二个表中的一行不匹配,则不会返回该行;同样,如果第二个表中有一行与第一个表中的一行不匹配,则不会返回该行。 外部连接。 一 左连接 尝试查找第一个表中的行与第二个表中的行匹配。如果找不到匹配项,它将返回第一个表中的列,并将第二个表中的列留空(空)。 |
![]() |
16
24
在其他答案中,我看不到关于性能和优化器的详细信息。
有时只知道这一点是好事
一般来说,尝试使用
关于这种奇怪的联想行为,这里有几个很好的例子和解释: |
![]() |
17
19
|
![]() |
18
19
精确的算法
注:
中指定的条件
注: 左连接=左外部连接,右连接=右外部连接。 |
![]() |
19
16
最简单的定义 内部联接:返回 匹配记录 从两张桌子。 完全外部联接:返回匹配的和 不匹配的记录 对于来自的不匹配记录,两个表都为空 两表 . 左外部联接:仅从上的表返回匹配和不匹配的记录 左侧 . 右外部联接:仅从上的表返回匹配和不匹配的记录 右侧 . 简而言之 匹配+左不匹配+右不匹配= 全外部连接 匹配+左不匹配= 左外连接 匹配+右不匹配= 右外部联接 匹配= 内连接 |
![]() |
20
13
例如:
|
![]() |
21
10
它们是SQL中最常用的存在主义运算符,其中
考虑这些查询:
寻找基于集合的解决方案(行业术语)的人会将各自的查询识别为:
将这些转换为标准SQL:
其他人则会按照类似的集合包含方式思考:
将这些转换为标准SQL:
有些人会考虑在集合内的“存在”,例如
将这些转换成标准的SQL(注意,我们现在需要使用范围变量,即
但是,我发现“行业标准”方法是专门使用连接。我不知道这里的想法是什么( Law of the Instrument ? Premature optimization ?),所以我将直接转到语法:
需要注意的事项:
闭幕词:
有时连接仅用于查询,以确定值是否存在于另一个集合中。学习仔细查看正在投影的属性(中的列
|
![]() |
22
5
简单来说, 1。 内部连接或同等连接: 返回仅与两个表中的条件匹配的结果集。 2。 外部连接: 返回两个表中所有值的结果集,即使条件是否匹配。 三。 左连接: 返回左表中所有值的结果集,仅返回与右表中条件匹配的行。 4。 右连接: 返回右表中所有值的结果集,仅返回与左表中条件匹配的行。 5。 完全连接: 完全联接和完全外部联接相同。 |
![]() |
23
4
1。 内部连接: 也称为连接。它返回左表和右表中的行 如果有匹配的 . 否则,它返回零个记录。 例子:
2。 完全外部联接: 也称为完全联接。它返回 所有的行 出现在左表和右表中。 例子:
三。 左外部联接: 或者简单地称为左连接。它返回左表中的所有行以及右表中的匹配行(如果有)。 4。 右外部联接: 也称为右连接。它返回左表中的匹配行(如果有),以及右表中的所有行。
连接的优点
|
![]() |
24
3
|
![]() |
25
1
内部连接和外部连接的区别如下:
|
![]() |
26
1
(SQL标准2006 SQL/FAST 7.7语法规则1,一般规则1 B,3 C和D,5 B)
所以不要
找出
what rows
阅读我的评论有许多困惑和糟糕的答案。 然后阅读我的评论这里有许多困惑和糟糕的答案。 |
![]() |
27
1
考虑以下两个表: 电磁脉冲
系
内部连接:大多写得像是 加入 在SQL查询中。它只返回表之间匹配的记录。 找出所有员工及其部门名称:
如你所见,
所以,内部联接或只是联接,只返回匹配的行。 左连接:这将返回左表中的所有记录,并且仅匹配右表中的记录。
因此,如果您观察上面的输出,那么左表(EMP)中的所有记录都将打印为右表中的匹配记录。
所以,左联接返回左表中的所有行,并且只匹配右表中的行。 也可以检查演示 here . |
![]() |
blogger13 · 视频租赁店数据库的规范化 5 月前 |
![]() |
ì¤ì¤í · 为什么LEFT INNER JOIN被弃用? 6 月前 |
![]() |
relatively_random · 确保两个表之间一致的共同参考 6 月前 |
|
Grenish Rai · Firestore错误“用户文档不存在” 9 月前 |
![]() |
Saijo-Shi · PLpgsql中的更新触发器 10 月前 |
![]() |
Dante · Django::配置不当:池不支持持久连接 10 月前 |
![]() |
YouLocalRUser · 删除重复行,保留第一行 11 月前 |