此外,如何适应左外加入,右外加入和全外加入?
当前回答
内部加入与外部加入之间的区别如下:
内部合并是基于匹配图表的合并,而外部合并是基于匹配图表和未匹配图表的合并。内部合并是从两个图表中匹配序列的合并,而外部合并是从两个图表中匹配序列的合并,而外部合并是从两个图表中匹配序列的合并,而未匹配序列是以零值填写的合并。
其他回答
左 加入 在 返回 内部加入 在 联盟 行 所有 未匹配 左 表 行 延伸 以 零 。
右 加入 返回 内 加入 在 联盟 行 所有 未匹配 右 表 行 延伸 零。
外部是可选的,没有效果。
(SQL Standard 2006 SQL/Foundation 7.7 Syntax Rules 1, 一般规则 1b, 3c&d, 5b)
所以不要在外部加入,直到你知道什么基础内加入涉及。
在返回中查找内部加入的行列:CROSS JOIN vs INNER JOIN 在 SQL 中
这也解释了为什么Venn(类似)图表不对内部与外部合并有用。 更多关于为什么它们不对合并有用:Venn 图表为自然合并
内部加入需要附加表中包含相关 ID 的记录。
外部连接将为左侧返回记录,即使没有对右侧的记录。
例如,您有一个订单和一个订单细节表,它们由一个“订单ID”相关。
命令
客戶名稱
命令细节
商品名稱 Qty 價格
请求
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
只会返回订单,该订单还包含在订单详细信息表中的一些东西。
如果您将其更改为向左加入
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
然后它将从订单表中返回记录,即使它们没有订单详细记录。
您可以使用此来查找没有订单详细信息的订单,并通过添加一个在哪里条款,如Where OrderDetails.OrderID IS NULL。
加入更容易用一个例子来解释:
此分類上一篇
模拟在单独的表中存储的人和电子邮件,
表 A 和表 B 由表_A.id = 表_B.name_id 添加
内部加入
此分類上一篇
只显示相匹配的IDS行。
外面加入
此分類上一篇
表 A 的匹配 ID 和不匹配行显示。
此分類上一篇
显示表 B 的匹配 ID 和不匹配行。
相匹配的ID和不相匹配的行从两个表显示。
注意:在 MySQL 上不存在完整的外部加入
此分類上一篇
INNER JOIN 最典型的加入为两个或多个表. 它返回数据匹配在两个表上 ON primarykey 和 forignkey 关系. OUTER JOIN 与 INNER JOIN 相同,但它还包含结果设置上的 NULL 数据. LEFT JOIN = INNER JOIN + 未匹配的左表数据与右表上的 Null 匹配. RIGHT JOIN = INNER JOIN + 未匹配的右表数据与左表上的 Null 匹配. FULL JOIN = INNER J
例如:
SELECT *
FROM tablea a
INNER JOIN tableb b
ON a.primary_key = b.foreign_key
INNER JOIN tablec c
ON b.primary_key = c.foreign_key
假设你加入没有复制的列,这是一个非常常见的案例:
A 和 B 的内部结合会产生 A 交叉B 的结果,即 Venn 图表交叉的内部部分; A 和 B 的外部结合会产生 A 联盟 B 的结果,即 Venn 图表联盟的外部部分。
例子
假设你有两个表,每个单列,并数据如下:
A B
- -
1 3
2 4
3 5
4 6
内部加入
使用相同的查询中的任何一个内部连接提供两张表的交叉,即它们共通的两行。
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
左边加入
左向外加入将提供A中的所有行,加上B中的任何常见行。
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
向外加入
一个正确的外部加入将给所有行在B,加上任何常见行在A。
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
全外加入
一个完整的外部加入会给你A和B的联盟,即A中的所有行和B中的所有行,如果A中的任何东西没有相应的日期在B,那么B部分是零,反之亦然。
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?