加入术语内外半抗...

假设我们有两个表(A 和 B)并且它们的一些行匹配(相对于给定的 JOIN 条件,无论在特定情况下它是什么):

StackOverflow 文档

我们可以使用各种连接类型从任一侧包含或排除匹配或不匹配的行,并通过从上图中选择相应的术语来正确命名连接。

以下示例使用以下测试数据:

CREATE TABLE A (
    X varchar(255) PRIMARY KEY
);

CREATE TABLE B (
    Y varchar(255) PRIMARY KEY
);

INSERT INTO A VALUES
    ('Amy'),
    ('John'),
    ('Lisa'),
    ('Marco'),
    ('Phil');

INSERT INTO B VALUES
    ('Lisa'),
    ('Marco'),
    ('Phil'),
    ('Tim'),
    ('Vincent');

内部联接

组合匹配的左右行。

StackOverflow 文档

SELECT * FROM A JOIN B ON X = Y;

X      Y
------ -----
Lisa   Lisa
Marco  Marco
Phil   Phil

左外连接

有时缩写为左连接。组合匹配的左右行,并包括不匹配的左行。

StackOverflow 文档

SELECT * FROM A LEFT JOIN B ON X = Y;

X      Y
-----  -----
Amy    NULL
John   NULL
Lisa   Lisa
Marco  Marco
Phil   Phil

正确的外部加入

有时缩写为右连接。组合匹配的左右行,并包括不匹配的右行。

StackOverflow 文档

SELECT * FROM A RIGHT JOIN B ON X = Y;

X      Y
-----  -------
Lisa   Lisa
Marco  Marco
Phil   Phil
NULL   Tim
NULL   Vincent

完全外部加入

有时缩写为完全加入。左右外连接联合。

StackOverflow 文档

SELECT * FROM A FULL JOIN B ON X = Y;

X      Y
-----  -------
Amy    NULL
John   NULL
Lisa   Lisa
Marco  Marco
Phil   Phil
NULL   Tim
NULL   Vincent

左半连接

包括与右行匹配的左行。

StackOverflow 文档

SELECT * FROM A WHERE X IN (SELECT Y FROM B);

XLisa
Marco
Phil

右半连接

包括与左行匹配的右行。

StackOverflow 文档

SELECT * FROM B WHERE Y IN (SELECT X FROM A);

YLisa
Marco
Phil

如你所见,左半对半连接没有专用的 IN 语法 - 我们只需在 SQL 文本中切换表位置即可实现此效果。

左反半连接

包括与右行匹配的左行。

StackOverflow 文档

SELECT * FROM A WHERE X NOT IN (SELECT Y FROM B);

XAmy
John

警告: 如果你碰巧在 NULL-able 列上使用 NOT IN,请小心! 更多细节在这里

右反半连接

包括与左行匹配的右行。

StackOverflow 文档

SELECT * FROM B WHERE Y NOT IN (SELECT X FROM A);

YTim
Vincent

正如你所看到的,左侧和右侧反半连接没有专用的 NOT IN 语法 - 我们只需在 SQL 文本中切换表位置即可实现此效果。

交叉加入

笛卡尔积的所有产品都留有所有权利。

SELECT * FROM A CROSS JOIN B;

X      Y
-----  -------
Amy    Lisa
John   Lisa
Lisa   Lisa
Marco  Lisa
Phil   Lisa
Amy    Marco
John   Marco
Lisa   Marco
Marco  Marco
Phil   Marco
Amy    Phil
John   Phil
Lisa   Phil
Marco  Phil
Phil   Phil
Amy    Tim
John   Tim
Lisa   Tim
Marco  Tim
Phil   Tim
Amy    Vincent
John   Vincent
Lisa   Vincent
Marco  Vincent
Phil   Vincent

交叉连接等效于具有始终匹配的连接条件的内连接,因此以下查询将返回相同的结果:

SELECT * FROM A JOIN B ON 1 = 1;

自加入

这只是表示与自身连接的表格。自连接可以是上面讨论的任何连接类型。例如,这是一个内部自联接:

SELECT * FROM A A1 JOIN A A2 ON LEN(A1.X) < LEN(A2.X);

X     X
----  -----
Amy   John
Amy   Lisa
Amy   Marco
John  Marco
Lisa  Marco
Phil  Marco
Amy   Phil