3

上周我进行了一次技术面试,面试官问我如果运行以下查询会发生什么:

SELECT * FROM tbl1, tbl2

我想我回答正确,但这不是一个深入的答案。

我说我会选择两个表中的所有列。例如,如果 tbl1 有 3 列,而 tbl2 有 4 列。结果集将有 7 列。

然后他问我为什么是7?我说是因为我从每张桌子上选择了所有东西。

这是一个糟糕的答案,但我想不出别的。

切入正题,在接受采访后,我使用两张表执行了后一条语句。

表 A,有 3 种动物:狗、猫和大象。

表 B 有 2 个名字:Mat 和 Beth

这是我在执行语句后得到的结果集:

*********************************************
| id_tbl1 | name_tbl1 | id_tbl2 | name_tbl2 |
*********************************************
|   1     |  dog      |    1    | Mat       |
|   2     |  cat      |    1    | Mat       |
|   3     |  elephant |    1    | Mat       |
|   1     |  dog      |    2    | Beth      |
|   2     |  cat      |    2    | Beth      |
|   3     |  elephant |    2    | Beth      |
*********************************************

所以我的问题是,为什么声明会这样?

换句话说:

为什么表 B 的记录会重复,直到我到达表 A 的末尾,然后又重新开始?

你会如何以一种会让面试官“惊叹”的方式回答这个问题?

如果此问题不属于 SO,请随时删除或关闭它!

4

3 回答 3

7

如果您执行这样的选择,则一个结果集中的所有行都将连接到另一个结果集中(笛卡尔积)中的所有行。

因此,您将获得第一个表的所有行和第二个表的第一行的列表,然后是第二行的所有条目,依此类推。订单可以是实施细节。不确定是否定义了第一个顺序是由第一个表,它可能在不同的实现中有所不同。如果您连接三个(或更多)表,那么所有表的所有行都会发生同样的情况。当然,这不仅适用于表,也适用于连接的任何结果集。

于 2013-04-17T06:48:02.677 回答
5

结果将是一个笛卡尔积看看这个例子

SQL 示例

您可以看到有两个表,一个有 5 条记录,另一个有 4 条记录,结果是 20 条记录。表示 5 * 4 = 20 而不是您假设的 5 + 4 = 9。

表格1

| IDX |   VAL |
---------------
|   1 | 1val1 |
|   1 | 1val2 |
|   2 | 2val1 |
|   2 | 2val2 |
|   2 | 2val3 |

表2

| ID | POINTS |
---------------
|  1 |      2 |
|  2 |     10 |
|  3 |     21 |
|  4 |     29 |

以下查询的结果

SELECT * FROM Table1 , Table2


| IDX |   VAL | ID | POINTS |
-----------------------------
|   1 | 1val1 |  1 |      2 |
|   1 | 1val1 |  2 |     10 |
|   1 | 1val1 |  3 |     21 |
|   1 | 1val1 |  4 |     29 |
|   1 | 1val2 |  1 |      2 |
|   1 | 1val2 |  2 |     10 |
|   1 | 1val2 |  3 |     21 |
|   1 | 1val2 |  4 |     29 |
|   2 | 2val1 |  1 |      2 |
|   2 | 2val1 |  2 |     10 |
|   2 | 2val1 |  3 |     21 |
|   2 | 2val1 |  4 |     29 |
|   2 | 2val2 |  1 |      2 |
|   2 | 2val2 |  2 |     10 |
|   2 | 2val2 |  3 |     21 |
|   2 | 2val2 |  4 |     29 |
|   2 | 2val3 |  1 |      2 |
|   2 | 2val3 |  2 |     10 |
|   2 | 2val3 |  3 |     21 |
|   2 | 2val3 |  4 |     29 |   
于 2013-04-17T06:49:55.600 回答
2

我认为您通过运行一个包含两个具有相同字段的表的示例来混淆自己。您指的是一个联合,它将一个表的值与另一个表的值结合起来,使用您的示例,这将为您提供 3 + 4 = 7 个结果。

逗号分隔的 FROM 语句正在执行 JOIN,它将遍历表 X 中的所有值并将它们与表 Y 的所有值配对。这将导致 X 的大小 * Y 的大小结果,使用您的示例这将是 3 * 4 = 12。

于 2013-04-17T06:50:56.950 回答