Artikel ini memberikan ikhtisar tentang gabungan alami dalam SQL, serta beberapa contoh dasar.
Apa itu Gabung Alami?
SQL natural join adalah tipe equi-join yang secara implisit menggabungkan tabel berdasarkan kolom dengan nama dan tipe yang sama. Predikat join muncul secara implisit dengan membandingkan semua kolom pada kedua tabel yang memiliki nama kolom yang sama pada tabel join.
Kumpulan hasil hanya berisi satu kolom untuk setiap pasangan kolom dengan nama yang sama. Jika tidak ditemukan kolom dengan nama yang sama, hasilnya adalah gabungan silang.
Sintaks
Gabung alami dapat diterapkan ke INNER
mana saja , LEFT
, RIGHT
, atau FULL
Ikuti. Anda cukup mengawali tipe join dengan NATURAL
kata kunci.
Contoh sintaks yang digunakan pada inner join:
SELECT *
FROM Table1 NATURAL INNER JOIN Table2
ON Table1.Column = Table2.Column;
Melihat sebagai INNER
adalah nilai default, Anda juga dapat melakukannya seperti ini:
SELECT *
FROM Table1 NATURAL JOIN Table2
ON Table1.Column = Table2.Column;
NATURAL
kata kunci menempatkan USING
implicit implisit klausa untuk bergabung kendala. Ini membentuk USING
list yang terdiri dari semua nama kolom yang muncul di kedua tabel input. Ini jelas hanya berlaku untuk DBMS yang mendukung USING
klausa.
Tidak semua DBMS mendukung penggabungan alami, jadi periksa dokumentasi DBMS Anda.
Saat saya menulis ini, gabungan alami didukung di PostgreSQL, MySQL, MariaDB, SQLite, dan Oracle. Namun, gabungan alami tidak didukung di SQL Server (2019).
Contoh
Berikut adalah beberapa contoh untuk ditunjukkan.
Contoh Data
Pertama, berikut adalah tabel yang akan kita gunakan untuk contoh.
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)
Owners
tabel:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | 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 | Eastwood | (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.
Contoh 1 – Penggabungan Batin Alami
Berikut adalah contoh melakukan inner join alami terhadap dua tabel tersebut.
SELECT
PetName,
PetType
FROM Pets
NATURAL JOIN PetTypes;
Hasil:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat (8 rows)
Dalam contoh ini, gabungan alami secara implisit bergabung dengan tabel pada dua PetTypeId
kolom (yaitu Pets.PetTypeId
kolom, dan PetTypes.PetTypeId
kolom).
Ini adalah cara implisit untuk melakukan hal berikut:
SELECT
PetName,
PetType
FROM Pets
INNER JOIN PetTypes USING (PetTypeId);
Yang sebenarnya melakukan hal berikut.
SELECT
p.PetName,
pt.PetType
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Contoh 2 – Penggabungan Hak Alami
Berikut adalah contoh melakukan penggabungan kanan alami terhadap dua tabel tersebut. Kali ini kita harus menentukan tipe join, mengingat kita tidak menginginkan inner join (default).
SELECT
p.PetName,
pt.PetType
FROM Pets p
NATURAL RIGHT JOIN PetTypes pt;
Hasil:
petname | pettype ---------+--------- Fluffy | Cat Fetch | Dog Scratch | Cat Wag | Dog Tweet | Bird Fluffy | Dog Bark | Dog Meow | Cat | Rabbit (9 rows)
Dalam hal ini, sama saja dengan melakukan hal berikut:
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Contoh 3 – Gabung Penuh Alami pada 3 Tabel
Berikut adalah contoh melakukan full join alami pada ketiga tabel.
SELECT
PetName,
PetType,
CONCAT(FirstName, ' ', LastName) AS PetOwner
FROM Owners NATURAL FULL JOIN Pets
NATURAL FULL JOIN PetTypes;
Hasil:
petname | pettype | petowner ---------+---------+---------------- Fluffy | Cat | Nancy Simpson Fetch | Dog | Nancy Simpson Scratch | Cat | Bart Pitt Wag | Dog | Nancy Simpson Tweet | Bird | Homer Connery Fluffy | Dog | Boris Trump Bark | Dog | Bart Pitt Meow | Cat | Boris Trump | | Woody Eastwood | Rabbit | (10 rows)
Kali ini kami memiliki pemilik hewan peliharaan yang tidak memiliki hewan peliharaan, serta jenis hewan peliharaan yang tidak ditetapkan untuk hewan peliharaan.
Contoh 4 – Menggunakan Asterisk (*
) Karakter Wildcard
Berikut adalah contoh yang menggunakan karakter wildcard asterisk (*) untuk memilih semua kolom.
SELECT *
FROM Pets
NATURAL JOIN PetTypes;
Hasil:
pettypeid | petid | ownerid | petname | dob | pettype -----------+-------+---------+---------+------------+--------- 2 | 1 | 3 | Fluffy | 2020-11-20 | Cat 3 | 2 | 3 | Fetch | 2019-08-16 | Dog 2 | 3 | 2 | Scratch | 2018-10-01 | Cat 3 | 4 | 3 | Wag | 2020-03-15 | Dog 1 | 5 | 1 | Tweet | 2020-11-28 | Bird 3 | 6 | 4 | Fluffy | 2020-09-17 | Dog 3 | 7 | 2 | Bark | | Dog 2 | 8 | 4 | Meow | | Cat (8 rows)
Perhatikan bahwa pettypeid
kolom hanya dikembalikan satu kali, meskipun ada dua kolom dengan nama itu (satu di setiap tabel). Beginilah cara natural join menangani kolom dengan nama yang sama di seluruh tabel.