我有两个表,A
和B
:
A
,其中3行全1,1,1(单列)B
,其中2行全部为1 1,单列我在这些表上使用了所有可用的连接o / p是相同的:
A B
1 1
1 1
1 1
1 1
1 1
1 1
这些连接如何工作?
我在接受跨国公司采访时面对这些问题。
答案 0 :(得分:1)
选中此项以了解不同类型的连接: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/
在您的情况下,结果与所有连接类型相同,因为您的值在所有表中都是相同的。
加入类型解释
FULL OUTER JOIN
从左(第一)和右(第二)表中选取所有记录,并在可用的情况下从两侧匹配记录。如果没有匹配,则缺少的一方将填充NULL。
LEFT OUTER JOIN
左连接从左(第一)表中选取所有记录,然后从右(第二)表传递所有匹配的记录。如果找不到匹配项,则右表的列将填充NULL
RIGHT OUTER JOIN
与左连接相同,只是订单已更改。
INNER JOIN
内连接选择连接条件为真的两个连接表中的所有记录。 (这是两组记录的交集)
CROSS JOIN
创建两个表中记录的所有组合。
** T-SQL(MSSQL)测试代码**
DECLARE @test1 TABLE (num INT, name VARCHAR(10))
DECLARE @test2 TABLE (num INT, value VARCHAR(10))
INSERT INTO @test1 (num, name) VALUES (1, 'first')
INSERT INTO @test1 (num, name) VALUES (2, 'second')
INSERT INTO @test1 (num, name) VALUES (3, 'third / 1')
INSERT INTO @test1 (num, name) VALUES (3, 'third / 2')
INSERT INTO @test2 (num, value) VALUES (1, 'one / 1')
INSERT INTO @test2 (num, value) VALUES (1, 'one / 2')
INSERT INTO @test2 (num, value) VALUES (3, 'three')
INSERT INTO @test2 (num, value) VALUES (4, 'four')
SELECT
*
FROM
@test1 T1
FULL OUTER JOIN @test2 T2
ON T1.num = T2.num
SELECT
*
FROM
@test1 T1
LEFT JOIN @test2 T2
ON T1.num = T2.num
SELECT
*
FROM
@test1 T1
RIGHT JOIN @test2 T2
ON T1.num = T2.num
SELECT
*
FROM
@test1 T1
INNER JOIN @test2 T2
ON T1.num = T2.num
SELECT
*
FROM
@test1 T1
CROSS JOIN @test2 T2
答案 1 :(得分:0)
执行查询的过程按以下方式工作。
假设您有查询
select A.Id, B.Id
From A
inner join B on A.Id = B.Id
Sql server引擎首先在A和B之间进行交叉连接,在虚拟表中创建所有记录(A行的B行)的列表。 然后它根据连接过滤记录。 与示例中一样,连接是内连接,条件是A.Id = B.Id. 在您的特定情况下,所有行都将满足连接条件,因此将返回所有记录。
现在,您可以对所有其他连接(左外连接,右外连接,全外连接,交叉连接)采用相同的方法。
在这种特定情况下,所有连接都将提供相同的输出。
检查网址:http://www.databaseskill.com/4841542/,详细了解查询的逻辑处理阶段。
此外,youtube上还有一个关于此的视频。您可以查看:https://www.youtube.com/watch?v=m1lIaTJ_oDM