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


当前回答

内部加入

回收相匹配的行只,也就是说, 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

idA ColumnTableA idB
1 Jonh 1
2 Sarah 1
3 Clark 2
4 Barbie NULL

图B如下:

idB ColumnTableB
1 Connor
2 Kent
3 Spock

内部加入:

from tableA join tableB on tableA.idB = tableB.idB
idA ColumnTableA idB ColumnTableB
1 Jonh 1 Connor
2 Sarah 1 Connor
3 Clark 2 Kent

左边加入:

from tableA left join tableB on tableA.idB = tableB.idB
idA ColumnTableA idB ColumnTableB
1 Jonh 1 Connor
2 Sarah 1 Connor
3 Clark 2 Kent
4 Barbie NULL NULL

向外加入:

from tableA right join tableB on tableA.idB = tableB.idB
idA ColumnTableA idB ColumnTableB
1 Jonh 1 Connor
2 Sarah 1 Connor
3 Clark 2 Kent
NULL NULL 3 Spock

全外加入:

from tableA full join tableB on tableA.idB = tableB.idB
idA ColumnTableA idB ColumnTableB
1 Jonh 1 Connor
2 Sarah 1 Connor
3 Clark 2 Kent
4 Barbie NULL NULL
NULL NULL 3 Spock

左 加入 在 返回 内部加入 在 联盟 行 所有 未匹配 左 表 行 延伸 以 零 。

右 加入 返回 内 加入 在 联盟 行 所有 未匹配 右 表 行 延伸 零。

外部是可选的,没有效果。

(SQL Standard 2006 SQL/Foundation 7.7 Syntax Rules 1, 一般规则 1b, 3c&d, 5b)

所以不要在外部加入,直到你知道什么基础内加入涉及。


在返回中查找内部加入的行列:CROSS JOIN vs INNER JOIN 在 SQL 中

这也解释了为什么Venn(类似)图表不对内部与外部合并有用。 更多关于为什么它们不对合并有用:Venn 图表为自然合并

简单的说法:

左边“加入”

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

右加入 : 正反对左加入. 在右加入中的左加入中输入表名称,您将获得与左加入相同的输出。

外部加入: 显示两张表中的所有记录 不管是什么. 如果左表中的记录不符合基于首要, 前进密钥的右表,则使用加入结果的 NULL 值。

例子:

1. 工人, 2.phone_numbers_工人

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

在这里,员工表是主表,电话_数字_员工是儿童表(它包含 emp_id 作为外国密钥,连接员工.id 因此其儿童表)。

内部加入

问答会是:

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

在这里只采取相匹配的行在主键 = 外国键如上所述。在这里不相匹配的行在主键 = 外国键因加入而被排除。

左联盟保留左桌的所有行,无论是否有一个行在右桌上相匹配。

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

外面加入:

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

格式上看起来如下:

简单的说法:

一个内部合并只接收相匹配的行列。

虽然一个外部加入从一个表中获取相匹配的行,而在另一个表中的所有行......结果取决于你使用哪个行:

左: 右桌上的匹配行和左桌上的所有行 右: 左桌上的匹配行和右桌上的所有行 或 完整: 所有桌上的所有行。

一次示威

设置

跳进 psql 并创建一个小数据库的猫和人类. 你可以只是复制这个整个部分。

CREATE DATABASE catdb;
\c catdb;
\pset null '[NULL]' -- how to display null values

CREATE TABLE humans (
  name text primary key
);
CREATE TABLE cats (
  human_name text references humans(name),
  name text
);

INSERT INTO humans (name)
VALUES ('Abe'), ('Ann'), ('Ben'), ('Jen');

INSERT INTO cats (human_name, name)
VALUES
('Abe', 'Axel'),
(NULL, 'Bitty'),
('Jen', 'Jellybean'),
('Jen', 'Juniper');

求求

SELECT
humans.name AS human_name,
cats.name AS cat_name
FROM humans
[SOMETHING JOIN] cats ON humans.name = cats.human_name
ORDER BY humans.name;

任何人,没有猫或猫,没有人,都被排除在外。

 human_name | cat_name
------------+-----------
 Abe        | Axel
 Jen        | Jellybean
 Jen        | Juniper

A FULL OUTER JOIN returns all humans and all cats, with zero if there is no match on both sides. 全外加入将返回所有人类和所有猫,如果双方都没有比赛,则零。

 human_name | cat_name
------------+-----------
 Abe        | Axel
 Ann        | [NULL]
 Ben        | [NULL]
 Jen        | Jellybean
 Jen        | Juniper
 [NULL]     | Bitty

 human_name | cat_name
------------+-----------
 Abe        | Axel
 Ann        | [NULL]
 Ben        | [NULL]
 Jen        | Jellybean
 Jen        | Juniper

每只猫,没有人,都会在人名列中获得零;每只猫,没有人,都会被排除。

 human_name | cat_name
------------+-----------
 Abe        | Axel
 Jen        | Jellybean
 Jen        | Juniper
 [NULL]     | Bitty

你可以看到,虽然一个内部加入只获得匹配夫妇,每个类型的外部加入包括一些没有比赛的项目。

加入本身意味着内部左加入,右加入和外加入,所有意味着外加入。