加入术语内外半抗...
假设我们有两个表(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