この記事では、CROSS JOIN
の概要を説明します。 SQL、およびいくつかの基本的な例。
SQL CROSS JOIN
(またはFULL OUTER JOIN
)は、最初のテーブルの各行と2番目のテーブルの各行を組み合わせた行を返します。
つまり、結合内のテーブルから行のデカルト積を返します。
構文
FROM
でクロス結合を指定します 句。
構文は次のようになります:
SELECT *
FROM Table1 CROSS JOIN Table2
ON Table1.Column = Table2.Column;
例1
実例を示します。
サンプルデータ
まず、例で使用するテーブルを次に示します。
t1
テーブル:
+--------+ | col1 | |--------| | a | | b | | c | +--------+
t2
テーブル:
+--------+ | col1 | |--------| | 1 | | 2 | | 3 | +--------+
クロス結合クエリ
これら2つのテーブルに対してクロス結合を実行する例を次に示します。
SELECT * FROM t1
CROSS JOIN t2;
結果:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
したがって、各テーブルに3行しかない場合でも、クエリは9行を返します。
これは、クロスジョインの仕組みによるものです。返される行数は、左側のテーブルの行数に右側のテーブルの行数を掛けたものです。
左側のテーブルを繰り返し処理し、左側のテーブルの各行に対して右側のテーブルの各行を出力する方法を確認してください。
これは、次のことを行うのと同じ効果があります。
SELECT * FROM t1, t2
結果:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
例2
WHERE
を追加するとどうなりますか クロスジョインの条項。
SELECT * FROM t1
CROSS JOIN t2
WHERE t1.col1 = 'a';
結果:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | a | 2 | | a | 3 | +--------+--------+ (3 rows affected)
例3
次のテーブルがあるとします。
PetTypes
テーブル:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
テーブル:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
この場合、Pets.PetTypeId
columnは、PetTypes.PetTypeId
の外部キーです。 列。
次に、これら2つのテーブルでクロス結合を実行し、WHERE
を使用する例を示します。 条項。
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;
結果:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
WHERE
を追加する クロス結合の句は、それを内部結合に変えました。
WHERE
を削除するとどうなりますか 条項。
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt;
結果:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Bird | | Fetch | Bird | | Scratch | Bird | | Wag | Bird | | Tweet | Bird | | Fluffy | Bird | | Bark | Bird | | Meow | Bird | | Fluffy | Cat | | Fetch | Cat | | Scratch | Cat | | Wag | Cat | | Tweet | Cat | | Fluffy | Cat | | Bark | Cat | | Meow | Cat | | Fluffy | Dog | | Fetch | Dog | | Scratch | Dog | | Wag | Dog | | Tweet | Dog | | Fluffy | Dog | | Bark | Dog | | Meow | Dog | | Fluffy | Rabbit | | Fetch | Rabbit | | Scratch | Rabbit | | Wag | Rabbit | | Tweet | Rabbit | | Fluffy | Rabbit | | Bark | Rabbit | | Meow | Rabbit | +-----------+-----------+ (32 rows affected)
32行を返すクロス結合を取得します。