加入術語內外半抗...

假設我們有兩個表(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