inner join 和outer join的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了inner join 和outer join的区别相关的知识,希望对你有一定的参考价值。

inner join是内连接,查询两个表中字段的值必须相等(a.id=b.id),如果a.id存在(1、1、1、1)而b.id只存在(1),那么会有四行结果(及笛卡尔积),b.id重复三次。
select *
from a inner join b
on a.id=b.id

outer join分为左外连接,右外连接两个:left outer join ,right outer join。
用上面的例子:left outer join(a left outer join b,那么这里要看左边的脸色,一切向左边看齐,先把左边表全显示了,右边满足条件a.id=b.id的显示,不满足显示为空) 右连接同理。
参考技术A 介绍 Inner Join 及 Outer Join 以及其应用
Inner Join
Inner Join 应该是最常用的 Join 方式, 它只会传回符合 Join 规则的纪录, 还是先来看看语法
Select From
[On ]
现在我们利用 MS SQL 内建的北风数据库来实际练习一下! 想多了解 MS SQL 的内建数据库, 你可以看看 SQL Server 的内建数据库 这篇文章
请打开 QA (Query Analyzer), 为了使用北风数据库, 请先执行 Use Northwind, 然后执行
Select ProductId, ProductName, SupplierId From Products
从 Products 产品资料表中取出三个字段, 分别是产品代码, 产品名称, 供货商代码, 但查询出来的结果保证让你的老板很不满意, 因为供货商代码对于人类实在是无虾米意义, 这个时候 Join 就可以帮上忙了, 藉由 Join Suppliers 这个资料表我们便可以查询到供货商名称
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Inner Join Suppliers
Products.Suppliers = Suppliers.SupplierId
这款的查询结果是不是卡清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉
Outer Join
这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法
Select From
[Outer] Join On
语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料, 接下来我们还是来做些实际操作, 仍然是使用北风数据库, 但要先做一些小小的修改, 才能达到我们要的结果
首先要拿掉 Products 资料表的 Foreign Key, 否则没有法度在 Products 资料表新增一笔 SupplierId 没有对映到 Suppliers 资料表的纪录, 要知影一个资料表的 Constraint 你可以执行 SQL 内建的 sp_helpconstraint , 在 QA 执行
sp_helpconstraint Products
接下来删除 FK_Products_Suppliers 这个 Foreign Key
Alter Table Products
Drop Constraint FK_Products_Suppliers
再来新增一笔纪录于 Products 资料表, SupplierId 使用 50 是因为它并没有对映到 Suppliers 资料表中的记录
Insert Into Products (ProductName,SupplierId,CategoryId)
values ('Test Product','50','1')
现在我们再执行头前的查询, 只是将 Inner Join 改为 Left Outer Join
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Left Outer Join Suppliers
Products.Suppliers = Suppliers.SupplierId
比较一下两种 Join 方式的查询结果, 你应该就会知影其中的差别!
再来看看 Right Outer Join, 请新增下底这笔记录
Insert Into Suppliers (CompanyName)
values ('LearnASP')
现在请使用 Right Out Join 来作查询, 比较看看查询的结果和 Inner Join 有什么不同!
寻找不相符纪录
这里我们来看看如何使用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来
Select Suppliers.CompanyName From Products
Right Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Products.SupplierId is Null
执行结果你会找到一笔资料为 LearnASP, 该笔供货商资料存在, 但基本上已经没有产品是来自这个供货商, 想象一下如果不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询结果! 知道 Outer Join 的好用了吧! 再执行
Select Products.ProductName
From Products
Left Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Suppliers.SupplierId is Null
这个查询结果你会发现 Test Product 这项产品竟然找不到供货商的资料!

INNER join和OUTER join有啥区别[重复]

【中文标题】INNER join和OUTER join有啥区别[重复]【英文标题】:What is difference between INNER join and OUTER join [duplicate]INNER join和OUTER join有什么区别[重复] 【发布时间】:2013-10-16 12:42:02 【问题描述】:

内连接和外连接的区别。我正在使用两个表并想从两个表中获取数据,所以我们应该使用哪种类型的连接,我们可以解决我们的问题

【问题讨论】:

【参考方案1】:

INNER JOIN:当两个表中至少有一个匹配时返回所有行

LEFT JOIN:从左表返回所有行,从右表返回匹配的行

RIGHT JOIN:从右表返回所有行,从左表返回匹配的行

FULL JOIN:当其中一个表匹配时返回所有行

【讨论】:

我喜欢你解释它的简单方式。【参考方案2】:

内连接匹配键上的表,但外连接只匹配一侧的键。 例如,当您使用左外连接时,查询会带来整个左侧表并将右侧与左表主键匹配,而没有匹配的地方为空。

【讨论】:

【参考方案3】:

这是理解连接的最好和最简单的方法:

感谢本文作者HERE

【讨论】:

【参考方案4】:

内连接 - 使用任一等效查询的内连接给出两个表的交集,即它们共有的两行。 左外连接 - 左外连接将给出 A 中的所有行,以及 B 中的所有公共行。 全外连接 - 全外连接将为您提供 A 和 B 的并集,即 A 中的所有行和 B 中的所有行。如果 A 中的某些内容在 B 中没有对应的数据,则 B 部分为空,反之亦然反之亦然。 检查this

【讨论】:

以上是关于inner join 和outer join的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL中inner join,outer join和cross join的区别

SQL中inner join,outer join和cross join的区别

SQL中inner join,outer join和cross join的区别

“INNER JOIN”和“OUTER JOIN”有啥区别?

“INNER JOIN”和“OUTER JOIN”有啥区别?

left join ,right join ,inner join,outer join,union all,union有啥区别?怎么用?