Artikel ini memberikan gambaran umum tentang CROSS JOIN
dalam SQL, serta beberapa contoh dasar.
SQL CROSS JOIN
(atau FULL OUTER JOIN
) mengembalikan baris yang menggabungkan setiap baris dari tabel pertama dengan setiap baris dari tabel kedua.
Dengan kata lain, ini mengembalikan produk Cartesian dari baris dari tabel di gabungan.
Sintaks
Anda menentukan gabungan silang di FROM
ayat.
Sintaksnya seperti ini:
SELECT *
FROM Table1 CROSS JOIN Table2
ON Table1.Column = Table2.Column;
Contoh 1
Berikut ini contoh untuk didemonstrasikan.
Contoh Data
Pertama, berikut adalah tabel yang akan kita gunakan sebagai contoh.
t1
tabel:
+--------+ | col1 | |--------| | a | | b | | c | +--------+
t2
tabel:
+--------+ | col1 | |--------| | 1 | | 2 | | 3 | +--------+
Kueri Gabung Salib
Berikut adalah contoh melakukan cross join terhadap kedua tabel tersebut.
SELECT * FROM t1
CROSS JOIN t2;
Hasil:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Jadi kueri kami mengembalikan 9 baris, meskipun hanya ada 3 baris di setiap tabel.
Ini karena cara kerja cross join. Jumlah baris yang dikembalikan adalah jumlah baris pada tabel kiri, dikalikan dengan jumlah baris pada tabel kanan.
Lihat bagaimana iterasi melalui tabel kiri, menampilkan setiap baris di tabel kanan untuk setiap baris di tabel kiri.
Ini memiliki efek yang sama dengan melakukan hal berikut:
SELECT * FROM t1, t2
Hasil:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Contoh 2
Inilah yang terjadi jika kita menambahkan WHERE
klausa untuk bergabung silang kami.
SELECT * FROM t1
CROSS JOIN t2
WHERE t1.col1 = 'a';
Hasil:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | a | 2 | | a | 3 | +--------+--------+ (3 rows affected)
Contoh 3
Misalkan kita memiliki tabel berikut.
PetTypes
tabel:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabel:
+---------+-------------+-----------+-----------+------------+ | 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)
Dalam hal ini, Pets.PetTypeId
kolom adalah kunci asing dari PetTypes.PetTypeId
kolom.
Sekarang, inilah contoh menjalankan cross join pada kedua tabel tersebut, tetapi menggunakan WHERE
klausa.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;
Hasil:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Menambahkan WHERE
klausa ke cross join mengubahnya menjadi inner join.
Inilah yang terjadi jika kita menghapus WHERE
klausa.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt;
Hasil:
+-----------+-----------+ | 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)
Kami mendapatkan gabungan silang yang mengembalikan 32 baris.