此外,如何适应左外加入,右外加入和全外加入?


当前回答

内部加入

回收相匹配的行只,也就是说, A 交叉 B。

此分類上一篇

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

左向外加入

从第一张表中选择所有记录,以及与附件密钥相匹配的第二张表中的任何记录。

此分類上一篇

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

全外加入

从第二张表中选择所有记录,以及与附件密钥相匹配的第一张表中的任何记录。

此分類上一篇

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

参考

内部和外部加入 SQL 示例和加入区块 SQL: JOINS

其他回答

内部加入 - 使用相同的查询中的任何一个内部加入将交叉两个表,即它们有两个行,左外加入 - 左外加入将提供所有行在A,加上任何常见行在B。

EmpID EmpName
13 Jason
8 Alex
3 Ram
17 Babu
25 Johnson

位置

EmpID EmpLoc
13 San Jose
8 Los Angeles
3 Pune, India
17 Chennai, India
39 Bangalore, India

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Employee.EmpId Employee.EmpName Location.EmpId Location.EmpLoc
13 Jason 13 San Jose
8 Alex 8 Los Angeles
3 Ram 3 Pune, India
17 Babu 17 Chennai, India

左外加入:- 对员工和位置表的左外加入(或仅仅是左外加入)的结果总是包含“左”表(员工)的所有记录,即使加入条件在“右”表(位置)中找不到任何匹配记录。

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Employee.EmpId Employee.EmpName Location.EmpId Location.EmpLoc
13 Jason 13 San Jose
8 Alex 8 Los Angeles
3 Ram 3 Pune, India
17 Babu 17 Chennai, India
25 Johnson NULL NULL

右外登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

使用上面的表,我们可以显示一个正确的外部加入的结果设置会是什么样子:

Employee.EmpId Employee.EmpName Location.EmpId Location.EmpLoc
13 Jason 13 San Jose
8 Alex 8 Los Angeles
3 Ram 3 Pune, India
17 Babu 17 Chennai, India
NULL NULL 39 Bangalore, India

请注意,虽然没有员工被列为在巴格罗尔工作,但它仍然被列入结果中,员工字段被删除。

Employee.EmpId Employee.EmpName Location.EmpId Location.EmpLoc
13 Jason 13 San Jose
8 Alex 8 Los Angeles
3 Ram 3 Pune, India
17 Babu 17 Chennai, India
25 Johnson NULL NULL
NULL NULL 39 Bangalore, India

Oracle 加入活动

这里有很多很好的答案,非常准确的相对 algebra 例子. 这里是一个非常简单的答案,这可能有助于爱好者或初学者编码器与 SQL 编码 dilemmas。

基本上,更常见的是,JOIN询问会分为两个案例:

对于一个数据组的选项:

使用 INNER JOIN 当您正在寻找的相关 B 数据必须根据数据库设计存在;使用 LEFT JOIN 当您正在寻找的相关 B 数据 MIGHT 或 MIGHT NOT 根据数据库设计存在。

最简单的定义

内部加入:从两个表中返回相匹配的记录。

Full Outer 加入:从两个表中返回相匹配和未相匹配的记录,从两个表中返回未相匹配的记录为零。

左外加入:只从左侧的桌子上返回匹配和不匹配的记录。

右外加入:只从右侧的桌子上返回相匹配和不相匹配的记录。

短短

相匹配 + 左不相匹配 + 右不相匹配 = 全外加入

相匹配 + 左不相匹配 = 左外加入

相匹配 + 相匹配不相匹配 = 相匹配不相匹配

相匹配 = 内部加入

我在其他答案中看不到很多关于性能和优化的细节。

有时,知道只有INNER JOIN是合并的,这意味着优化器有最多的选择与它一起玩,它可以重新订单加入顺序,使它更快地保持相同的结果,优化器可以使用最多加入模式。

一般来说,尝试使用 INNER JOIN 而不是不同类型的插件是很好的做法(当然,如果可以考虑到预期的结果设置)。

这里有几个好例子和解释这个奇怪的协会行为:

是否留在外部合并合并合并?合并命令在SQL中的内容?