2

今天在接受采访时,我被以下问题击中:

给定两个表 A 和 B,其中 A 和 B 各有 10 行,以下 SQL 语句将返回多少行?: Select * from A, B;

我的回答很明显:20。然而,我的面试官告诉我据说是100,尽管他说他自己没有买。任何人都可以对此有所了解吗?

4

5 回答 5

3

A该查询返回表和的笛卡尔积B。表 A 中的每一行都将与表 B 中的每一行匹配。10 行 * 10 行 = 100 行。

您可能将其解释为 a UNION,其中表 B 中的所有行都附加到表 A 中的行的底部。该查询如下所示:

SELECT * FROM A
UNION
SELECT * FROM B

请注意,这仅在A和的结构B相同时才有效。

于 2012-11-28T20:17:07.933 回答
2

那是笛卡尔JOIN。A 中的所有行都将连接到 B 中的每一行,从而在输出中产生 100 行:

A1, B1
A1, B2
A1, B3
. . .
A2, B1
A2, B2
A2, B3,
. . .
A10, B8
A10, B9
A10, B10
于 2012-11-28T20:17:14.670 回答
0

如果您选择两个表而不应用任何联接,则数据库将自动将笛卡尔积视为默认联接。因此您将有 100 行作为结果集。

于 2012-11-28T20:17:29.877 回答
0

这相当于在 T-SQL 中使用 CROSS JOIN,因此您将获得笛卡尔积,因为您没有用于关联表的 ON 子句,也没有用于过滤结果的 WHERE 子句。请参阅http://msdn.microsoft.com/en-us/library/ms190690(v=sql.105).aspx

于 2012-11-28T20:17:57.223 回答
0

当您不使用任何连接条件时,SQL 将执行笛卡尔积,并且您的第一个表的每一行都映射到您的第二个表的每一行。

您将获得以下记录:

  table1row1   table2row1 
  table1row1   table2row2 
  table1row1   table2row3 
  ........
  ........
  table1row2   table2row1
  .....
  and so on 
  .....

      表 1 行 10 表 2 行 10

因此,您将获得 100 条记录。

于 2012-11-28T20:18:11.330 回答