質問: sqlでfrom句に複数テーブルを記載し、テーブル同士の結合条件(onやwhereを用いる)を記載しない場合、取得できるレコードはどのようなものになるでしょうか? ``` SELECT * FROM Aテーブル , Bテーブル ``` ※自分で調べた限りだと、「CROSS JOIN」もしくは「NATURAL JOIN」で結合した場合と同じ結果を返すと記載されているサイトがありました。
回答: > > sqlでfrom句に複数テーブルを記載し、テーブル同士の結合条件(onやwhereを用いる)を記載しない場合、取得できるレコードはどのようなものになるでしょうか? > > > この質問の答えはすでにroot_jpさんやsk_3122さんの書かれているように、 AテーブルとBテーブルのすべての組み合わせのレコードが返されます。 レコード数はAテーブルのレコード数×Bテーブルのレコード数です。 呼び方は単純結合以外にもクロス結合とか直接結合と呼ばれるようです。 用途についてはOdacchiさんが「大量のテストデータ作成」と書かれていますが、 それ以外にもすべての組み合わせのパターンを取得したいときに使えるかもしれません。 例えばAテーブル(製品マスタ)、Bテーブル(色マスタ)とした場合に、 すべての製品と色の組み合わせが作り出せます。 (それが使えるかどうかはわかりませんが・・・) 他のサイトでは算数の九九表が作れるといった例もありました。 > > ※自分で調べた限りだと、「CROSS JOIN」もしくは「NATURAL JOIN」で結合した場合と同じ結果を返すと記載されているサイトがありました。 > > > CROSS JOINは訳すとクロス結合なので間違いないと思いますが、 NATURAL JOINは若干違います。 NATURAL JOINは自然結合と呼ばれます。以下のように規定されているようです。 > > 自然結合は一般に、外部キー値から親キー値への照合に基づいた結合を指します。 > > ただし、SQL92 規格ではこの用語が少し違った意味で使用されています。 > > SQL92 規格では、同じ名前を持つ 2つの列が親キーと外部キーであるかのように照合されます。 > > つまり、そのデータベース設計が列名の一致は実際に親キーと外部キーをあらわすと取り決めている場合に、NATURAL JOIN 演算子を使用すべきだと、いう考え方です。 > > > もう少しわかりやすく説明するとAテーブルとBテーブルとで同じ名前を持つ列で自動的に結合されます。 CROSS JOINもNATURAL JOINもテーブル同士の結合条件を記述しない点で共通していますが、 前者はすべての組み合わせを返すのに対し後者は内部で結合をしていますので異なります。 NATURAL JOINのSQL文付きでの説明は以下のサイトにあります。 CROSS JOIN / 自然結合 / 指定結合 / UNION JOIN