今天在接受采访时,我被以下问题击中:
给定两个表 A 和 B,其中 A 和 B 各有 10 行,以下 SQL 语句将返回多少行?:
Select * from A, B;
我的回答很明显:20。然而,我的面试官告诉我据说是100,尽管他说他自己没有买。任何人都可以对此有所了解吗?
今天在接受采访时,我被以下问题击中:
给定两个表 A 和 B,其中 A 和 B 各有 10 行,以下 SQL 语句将返回多少行?:
Select * from A, B;
我的回答很明显:20。然而,我的面试官告诉我据说是100,尽管他说他自己没有买。任何人都可以对此有所了解吗?
A
该查询返回表和的笛卡尔积B
。表 A 中的每一行都将与表 B 中的每一行匹配。10 行 * 10 行 = 100 行。
您可能将其解释为 a UNION
,其中表 B 中的所有行都附加到表 A 中的行的底部。该查询如下所示:
SELECT * FROM A
UNION
SELECT * FROM B
请注意,这仅在A
和的结构B
相同时才有效。
那是笛卡尔JOIN。A 中的所有行都将连接到 B 中的每一行,从而在输出中产生 100 行:
A1, B1
A1, B2
A1, B3
. . .
A2, B1
A2, B2
A2, B3,
. . .
A10, B8
A10, B9
A10, B10
如果您选择两个表而不应用任何联接,则数据库将自动将笛卡尔积视为默认联接。因此您将有 100 行作为结果集。
这相当于在 T-SQL 中使用 CROSS JOIN,因此您将获得笛卡尔积,因为您没有用于关联表的 ON 子句,也没有用于过滤结果的 WHERE 子句。请参阅http://msdn.microsoft.com/en-us/library/ms190690(v=sql.105).aspx。
当您不使用任何连接条件时,SQL 将执行笛卡尔积,并且您的第一个表的每一行都映射到您的第二个表的每一行。
您将获得以下记录:
table1row1 table2row1
table1row1 table2row2
table1row1 table2row3
........
........
table1row2 table2row1
.....
and so on
.....
表 1 行 10 表 2 行 10
因此,您将获得 100 条记录。