Artikel ini memberikan gambaran umum tentang FULL JOIN
dalam SQL, serta beberapa contoh dasar.
SQL FULL JOIN
(atau FULL OUTER JOIN
) mengembalikan semua baris, selama ada data yang cocok di salah satu tabel.
Ini seperti memiliki kedua kiri kanan bergabung dalam satu gabungan.
Sintaks
Anda menentukan bergabung penuh di FROM
ayat. Anda dapat menggunakan salah satu FULL JOIN
atau FULL OUTER JOIN
sintaks.
Menggunakan FULL JOIN
sintaks:
SELECT *
FROM Table1 FULL JOIN Table2
ON Table1.Column = Table2.Column;
Menggunakan FULL OUTER JOIN
sintaks:
SELECT *
FROM Table1 FULL OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Keduanya melakukan hal yang persis sama. Hanya saja bagian OUTER
kata kunci adalah opsional.
Contoh
Berikut adalah beberapa contoh untuk ditunjukkan.
Contoh Data
Pertama, berikut adalah tabel yang akan kita gunakan untuk contoh.
PetTypes
tabel:
+-------------+------------+| PetTypeId | PetType ||-------------+------------|| 1 | Burung || 2 | Kucing || 3 | Anjing || 4 | Kelinci |+-------------+------------+(4 baris terpengaruh)
Pets
tabel:
+---------+-------------+-----------+---------- --+------------+| ID Hewan Peliharaan | PetTypeId | ID Pemilik | Nama Hewan Peliharaan | DOB ||---------+-------------+-----------+----------- +------------|| 1 | 2 | 3 | Halus | 2020-11-20 || 2 | 3 | 3 | Ambil | 16-08-2019 || 3 | 2 | 2 | Gores | 01-10-2018 || 4 | 3 | 3 | goyang | 15-03-2020 || 5 | 1 | 1 | Tweet | 28-11-2020 || 6 | 3 | 4 | Halus | 17-09-2020 || 7 | 3 | 2 | Kulit | NULL || 8 | 2 | 4 | meong | NULL |+---------+-------------+-----------+----------- +------------+(8 baris terpengaruh)
Owners
tabel:
+-----------+-------------+------------+------- ---------+-------------------+| ID Pemilik | Nama Depan | Nama Belakang | Telepon | Email ||-----------+-------------+------------+-------- --------+-------------------|| 1 | Homer | Connery | (308) 555-0100 | [email protected] || 2 | Bart | Pitt | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trump | (349) 611-8908 | NULL || 5 | Woody | Kayu Timur | (308) 555-0112 | [email protected] |+------------+-------------+------------+---- ------------+-------------------+
Perhatikan bahwa:
PetTypeId
kolomPets
tabel adalah kunci asing dariPetTypeId
dariPetTypes
tabel (yang merupakan kunci utama dari tabel tersebut).OwnerId
kolomPets
tabel adalah kunci asing dariOwnerId
kolomOwners
meja.
Kueri Gabung Lengkap
Berikut adalah contoh melakukan penggabungan penuh terhadap dua tabel tersebut.
SELECT
p.PetName,
pt.PetType
FROM Pets p
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Hasil:
+-----------+-----------+| Nama Hewan Peliharaan | PetType ||-----------+------------|| Tweet | Burung || Halus | Kucing || Gores | Kucing || meong | Kucing || Ambil | Anjing || goyang | Anjing || Halus | Anjing || Kulit | Anjing || NULL | Kelinci |+------------+------------+(9 baris terpengaruh)
Dalam contoh ini, kita mendapatkan PetType
nilai yang tidak sesuai dengan PetName
. Ini karena tidak ada kelinci sebagai hewan peliharaan. Tetapi penggabungan penuh menyebabkan Rabbit
untuk dikembalikan, meskipun tidak ada hewan peliharaan di Pets
tabel jenis itu. Ini menghasilkan NULL
nilai dalam PetName
kolom melawan Rabbit
.
Ini adalah hasil yang sama yang akan kita dapatkan jika kita menggunakan gabungan yang benar, karena PetTypes
tabel berada di sebelah kanan JOIN
kata kunci. Ini tidak akan terjadi dengan gabungan kiri, karena PetTypes
tabel tidak berada di sebelah kiri JOIN
kata kunci. Jika kita ingin membuatnya kembali dengan gabungan kiri, kita harus mengubah urutan tabel, sehingga PetTypes
tabel berada di sebelah kiri JOIN
kata kunci.
Inilah yang terjadi jika kita mengganti urutan tabel dalam kueri kita saat menggunakan gabungan penuh.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
FULL JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Hasil:
+-----------+-----------+| Nama Hewan Peliharaan | PetType ||-----------+------------|| Tweet | Burung || Halus | Kucing || Gores | Kucing || meong | Kucing || Ambil | Anjing || goyang | Anjing || Halus | Anjing || Kulit | Anjing || NULL | Kelinci |+------------+------------+(9 baris terpengaruh)
Kami mendapatkan hasil yang sama persis. Ini karena full join mengembalikan semua baris, selama ada data yang cocok di salah satu tabel. Seperti yang disebutkan, ini seperti memiliki gabungan kiri dan kanan dalam satu gabungan.
Gabung Penuh pada 3 Tabel
Berikut adalah contoh melakukan full join pada ketiga tabel.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Hasil:
+-----------+-----------+----------------+| Nama Hewan Peliharaan | Jenis Hewan Peliharaan | PetOwner ||-----------+-----------+----------------|| Tweet | Burung | Homer Connery || Gores | Kucing | Bart Pitt || Kulit | Anjing | Bart Pitt || Halus | Kucing | Nancy Simpson || Ambil | Anjing | Nancy Simpson || goyang | Anjing | Nancy Simpson || Halus | Anjing | Boris Trump || meong | Kucing | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kelinci | |+-----------+-----------+----------------+(10 baris terpengaruh)Kali ini kami memiliki pemilik hewan peliharaan yang tidak memiliki hewan peliharaan, serta jenis hewan peliharaan yang tidak ditetapkan untuk hewan peliharaan.
Jika kita mengacak urutan tabel, kita mendapatkan hasil yang sama, meskipun baris terdaftar dalam urutan yang berbeda.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner FROM PetTypes pt FULL JOIN Pets p ON p.PetTypeId = pt.PetTypeId FULL JOIN Owners o ON p.OwnerId = o.OwnerId;
Hasil:
-----------+-----------+----------------+| Nama Hewan Peliharaan | Jenis Hewan Peliharaan | PetOwner ||-----------+-----------+----------------|| Tweet | Burung | Homer Connery || Halus | Kucing | Nancy Simpson || Gores | Kucing | Bart Pitt || meong | Kucing | Boris Trump || Ambil | Anjing | Nancy Simpson || goyang | Anjing | Nancy Simpson || Halus | Anjing | Boris Trump || Kulit | Anjing | Bart Pitt || NULL | Kelinci | || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(10 baris terpengaruh)Dan jika kita mengacaknya sekali lagi, kita masih mendapatkan hasil yang sama.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner FROM Pets p FULL JOIN Owners o ON p.OwnerId = o.OwnerId FULL JOIN PetTypes pt ON p.PetTypeId = pt.PetTypeId;
Hasil:
+-----------+-----------+----------------+| Nama Hewan Peliharaan | Jenis Hewan Peliharaan | PetOwner ||-----------+-----------+----------------|| Halus | Kucing | Nancy Simpson || Ambil | Anjing | Nancy Simpson || Gores | Kucing | Bart Pitt || goyang | Anjing | Nancy Simpson || Tweet | Burung | Homer Connery || Halus | Anjing | Boris Trump || Kulit | Anjing | Bart Pitt || meong | Kucing | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kelinci | |+-----------+-----------+----------------+(10 baris terpengaruh)Jika Anda bertanya-tanya mengapa
PetOwner
terakhir bukanNULL
(seperti terakhirPetName
is), itu karena ini adalah hasil dari rangkaian string. Saya menggunakan T-SQLCONCAT()
berfungsi untuk menggabungkan nama depan dan belakang pemilik.