加入術語內外半抗...
假設我們有兩個表(A 和 B)並且它們的一些行匹配(相對於給定的 JOIN 條件,無論在特定情況下它是什麼):
我們可以使用各種連線型別從任一側包含或排除匹配或不匹配的行,並通過從上圖中選擇相應的術語來正確命名連線。
以下示例使用以下測試資料:
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');
內部聯接
組合匹配的左右行。
SELECT * FROM A JOIN B ON X = Y;
X Y
------ -----
Lisa Lisa
Marco Marco
Phil Phil
左外連線
有時縮寫為左連線。組合匹配的左右行,幷包括不匹配的左行。
SELECT * FROM A LEFT JOIN B ON X = Y;
X Y
----- -----
Amy NULL
John NULL
Lisa Lisa
Marco Marco
Phil Phil
正確的外部加入
有時縮寫為右連線。組合匹配的左右行,幷包括不匹配的右行。
SELECT * FROM A RIGHT JOIN B ON X = Y;
X Y
----- -------
Lisa Lisa
Marco Marco
Phil Phil
NULL Tim
NULL Vincent
完全外部加入
有時縮寫為完全加入。左右外連線聯合。
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
左半連線
包括與右行匹配的左行。
SELECT * FROM A WHERE X IN (SELECT Y FROM B);
XLisa
Marco
Phil
右半連線
包括與左行匹配的右行。
SELECT * FROM B WHERE Y IN (SELECT X FROM A);
YLisa
Marco
Phil
如你所見,左半對半連線沒有專用的 IN 語法 - 我們只需在 SQL 文字中切換表位置即可實現此效果。
左反半連線
包括與右行不匹配的左行。
SELECT * FROM A WHERE X NOT IN (SELECT Y FROM B);
XAmy
John
警告: 如果你碰巧在 NULL-able 列上使用 NOT IN,請小心! 更多細節在這裡 。
右反半連線
包括與左行不匹配的右行。
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