3

先週、技術面接を受けましたが、面接担当者は、次のクエリを実行するとどうなるかを尋ねました。

SELECT * FROM tbl1, tbl2

正しく答えたと思いますが、深い答えではありませんでした。

両方のテーブルのすべての列を選択すると言いました。たとえば、tbl1 に 3 つの列があり、tbl2 に 4 つの列があるとします。結果セットには 7 列が含まれます。

それから彼はなぜ7なのかと私に尋ねました。各テーブルからすべてを選択していたので、私は言いました。

それは悪い答えでしたが、他に何も思いつきませんでした。

要するに、インタビューを受けた後、2 つのテーブルを使用して後者のステートメントを実行しました。

表 A には、犬、猫、象の 3 種類の動物がありました。

テーブル B には、Mat と Beth の 2 つの名前がありました。

これは、ステートメントが実行された後に取得した結果セットです。

*********************************************
| 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      |
*********************************************

だから私の質問は、なぜステートメントはそのように振る舞うのですか?

言い換えると:

テーブル A の最後に到達するまでテーブル B のレコードが繰り返され、その後最初からやり直されるのはなぜですか?

インタビュアーを「驚かせる」ような方法で、質問にどのように答えますか?

この質問が SO に属していない場合は、遠慮なく削除するか、閉じてください。

4

3 に答える 3

7

このような選択を行うと、1 つの結果セットのすべての行が他の結果セットのすべての行に結合されます (デカルト積)。

したがって、最初のテーブルのすべての行と 2 番目のテーブルの最初の行のリストを取得し、次に 2 番目の行のすべてのエントリなどを取得します。順序は実装の詳細である場合があります。最初の注文が最初のテーブルによるものであると定義されているかどうかは不明ですが、実装によって異なる可能性があります。3 つ (またはそれ以上) のテーブルを結合すると、すべてのテーブルのすべての行で同じことが起こります。もちろん、これはテーブルだけでなく、結合からの結果セットにも当てはまります。

于 2013-04-17T06:48:02.677 に答える
5

結果はデカルト積になります この例を見てください

SQL の例

2 つのテーブルがあり、一方には 5 つのレコードがあり、もう一方には 4 つのレコードがあり、結果は 20 レコードであることがわかります。あなたが想定しているように、5 + 4 = 9ではなく5 * 4 = 20を意味します。

表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

同じフィールドを持つ 2 つのテーブルで例を実行することで、混乱していると思います。1 つのテーブルの値を別のテーブルと組み合わせる Union を参照しています。この例を使用すると、3 + 4 = 7 の結果が得られます。

コンマ区切りの FROM ステートメントは JOIN を実行しています。これは、テーブル X のすべての値を調べ、それらをテーブル Y のすべての値とペアにします。これにより、X のサイズ * Y のサイズの結果が得られ、例を使用すると、これは 3 になります。 * 4 = 12。

于 2013-04-17T06:50:56.950 に答える