Di SQL, Anda dapat menggabungkan tiga tabel atau lebih dengan menambahkan gabungan lain setelah yang pertama.
Anda juga dapat menjalankan gabungan bersarang dengan menetapkan satu gabungan sebagai kondisi bergabung untuk yang lain.
Sintaks
Cara paling umum untuk menggabungkan tiga tabel adalah seperti ini:
SELECT *FROM Table1 INNER JOIN Table2 ON ConditionINNER JOIN Table3 ON Condition;
Ini menggunakan gabungan dalam, tetapi Anda dapat menentukan jenis gabungan yang diinginkan seperti gabungan lainnya. Anda juga dapat menggabungkan jenis gabungan jika diperlukan (contoh di bawah).
Anda juga dapat menggunakan gabungan bersarang dengan menetapkan satu gabungan sebagai kondisi bergabung untuk gabungan lainnya. Seperti ini:
SELECT *FROM Table1 JOIN (Table2 JOIN Table3 ON Condition)ON Condition;
Contoh Data – 3 Tabel
Misalkan kita memiliki tiga tabel berikut.
Pelanggan
tabel:
+-------------+----------------+-------------- --+----------------+| ID Pelanggan | Nama Pelanggan | PostalCityId | Nomor Telepon ||--------------+----------------+--------------- -+----------------|| 1 | Homer McKenzie | 19586 | (308) 555-0100 || 2 | Marge Pratt | 33475 | (406) 555-0100 || 3 | Vlad Bernanke | NULL | (480) 555-0100 || 4 | Bart Pitt | 21692 | (316) 555-0100 || 5 | Lisa McQueen | 12748 | (212) 555-0100 || 6 | Steve Simpson | 17054 | (701) 555-0100 || 7 | Vinn Allen | 12152 | (423) 555-0100 || 8 | Veejay Smith | 3673 | (303) 555-0100 || 9 | Kasey Chin | 23805 | (201) 555-0100 || 10 | Borat Lee | 37403 | (701) 555-0100 |+--------------+----------------+---------- ------+----------------+(10 baris terpengaruh)
Kota
tabel:
+----------+----------------+------------------ --+--------------+| Id Kota | Nama Kota | Id ProvinsiProvinsi | Populasi ||----------+----------------+------------------- +--------------|| 3673 | Busur Mar | 6 | 866 || 12152 | Frankewing | 44 | NULL || 12748 | Gasport | 33 | 1248 || 21692 | Pondok Obat | 17 | 2009 || 26483 | Lembah Peeples | 3 | 428 || 33475 | Silvanit | 27 | 103 || 17054 | Jessie | 35 | 25 || 19586 | Lisco | 28 | NULL || 37403 | Wimbledon | 35 | 216 |+----------+----------------+------------------- +--------------+(9 baris terpengaruh)
Provinsi Negara
tabel:
+-------------------+---------------------+---- -----------------+-------------+--------------+| Id ProvinsiProvinsi | KodeProvinsi Negara | NamaProvinsi Negara | ID Negara | Populasi ||-------------------+---------------------+----- ----------------+-------------+--------------|| 3 | AZ | Arizona | 230 | 6891688 || 6 | CO | Colorado | 230 | 5698265 || 17 | KS | Kansas | 230 | 2893957 || 28 | NE | Nebraska | 230 | 1943256 || 31 | NJ | Jersey Baru | 230 | 8899339 || 33 | NY | New York | 230 | 20437172 || 35 | ND | Dakota Utara | 230 | 723393 || 44 | TN | Tennessee | 230 | 6495978 |+-------------------+---------------------+----- ----------------+-------------+--------------+(8 baris terpengaruh )
Contoh 1 – Gabung Dalam 3 Tabel
Jenis gabungan yang paling populer adalah gabungan dalam, jadi kita akan mulai dengan itu.
Berikut adalah contoh menggabungkan ketiga tabel di atas dengan dua gabungan bagian dalam.
PILIH s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces sINNER GABUNG KOTA SEBAGAI ciON ci.StateProvinceID =s.StateProvinceIDINNER GABUNG Pelanggan cu DI cu.PostalCityId =cicode>CityId;
Hasil:
+---------------------+----------------+------- ---------+| NamaProvinsi Negara | Nama Kota | NamaPelanggan ||---------------------+----------------+-------- --------|| Nebraska | Lisco | Homer McKenzie || Kansas | Pondok Obat | Bart Pitt || New York | Gasport | Lisa McQueen || Dakota Utara | Jessie | Steve Simpson || Tennessee | Frankewing | Vinn Allen || Colorado | Busur Mar | Veejay Smith || Dakota Utara | Wimbledon | Borat Lee |+---------------------+----------------+------- ---------+(7 baris terpengaruh)
Contoh 2 – Menggabungkan Jenis Penggabungan
Anda dapat menggabungkan jenis gabungan saat menggabungkan tiga tabel atau lebih.
Berikut adalah contoh menggabungkan gabungan dalam dengan gabungan kiri.
PILIH s.StateProvinceName, ci.CityName, cu.CustomerNameFROM StateProvinces sINNER GABUNG KOTA SEBAGAI ciON ci.StateProvinceID =s.StateProvinceIDLEFT GABUNG Pelanggan cu DI cu.PostalCityId =cicode>CityId;
Hasil:
---------------------+----------------+-------- --------+| NamaProvinsi Negara | Nama Kota | NamaPelanggan ||---------------------+----------------+-------- --------|| Colorado | Busur Mar | Veejay Smith || Tennessee | Frankewing | Vinn Allen || New York | Gasport | Lisa McQueen || Kansas | Pondok Obat | Bart Pitt || Arizona | Lembah Peeples | NULL || Dakota Utara | Jessie | Steve Simpson || Nebraska | Lisco | Homer McKenzie || Dakota Utara | Wimbledon | Borat Lee |+---------------------+----------------+------- ---------+(8 baris terpengaruh)
Dalam hal ini, kami memiliki kota (Peeples Valley) yang belum memiliki pelanggan.
Alasan kita sekarang dapat melihat informasi tersebut adalah karena gabungan kiri mengembalikan baris yang memiliki data di tabel kiri, meskipun tidak ada baris yang cocok di tabel kiri.
Contoh sebelumnya yang menggabungkan dua gabungan dalam tidak mengembalikan baris ini, karena gabungan dalam membuang baris yang tidak cocok dari kedua tabel. Itu hanya mengembalikan baris ketika ada setidaknya satu baris di kedua tabel yang cocok dengan kondisi gabungan.
Data Sampel Baru – 3 Tabel Berbeda
Untuk contoh lainnya, kami akan menggunakan tabel berikut.
Tipe Hewan Peliharaan
tabel:
+-------------+------------+| PetTypeId | PetType ||-------------+------------|| 1 | Burung || 2 | Kucing || 3 | Anjing || 4 | Kelinci |+-------------+------------+(4 baris terpengaruh)
Hewan peliharaan
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)
Pemilik
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
kolomHewan peliharaan
tabel adalah kunci asing dariPetTypeId
dariTipe Hewan Peliharaan
tabel (yang merupakan kunci utama dari tabel tersebut).OwnerId
kolomHewan peliharaan
tabel adalah kunci asing dariOwnerId
kolomPemilik
meja.
Contoh 3 – Kiri Gabung 3 Tabel
Mari kita lakukan penggabungan tiga tabel menggunakan dua gabungan kiri.
Berikut adalah contoh menjalankan dua gabungan kiri terhadap tabel tersebut.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwnerFROM Pemilik o LEFT JOIN Pets p ON p.OwnerId =o.OwnerIdLEFT 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 |+-----------+-----------+----------------+(9 baris terpengaruh)
Di sini, kami memiliki pemilik hewan peliharaan yang tidak memiliki hewan peliharaan. Kami dapat memverifikasinya dengan melihat Pets.OwnerId
kolom, dan melihat bahwa tidak ada nilai yang sesuai dengan OwnerId
Woody Eastwood di Pemilik
tabel.
Contoh 4 – Menggabungkan 3 Tabel dengan Kanan
Gabung kanan adalah kebalikan dari Gabung kiri. Berikut ini contoh menggunakan tiga tabel yang sama.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwnerFROM Pets p RIGHT JOIN Owners o ON p.OwnerId =o.OwnerIdRIGHT JOIN PetTypes pt ON p. PetTypeId =pt.PetTypeId;
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 | |+-----------+-----------+---------------+(9 baris terpengaruh)
Kali ini kami mendapatkan jenis hewan peliharaan tambahan (Kelinci
), tetapi bukan pemilik tambahan. Ini karena gabungan kanan mengembalikan baris yang memiliki data di tabel kanan, meskipun tidak ada baris yang cocok di tabel kiri.
Omong-omong, alasan PetOwner
terakhir bukan NULL
(seperti terakhir PetName
is) adalah karena ini adalah hasil dari rangkaian string. Saya menggunakan T-SQL CONCAT()
berfungsi untuk menggabungkan nama depan dan belakang pemilik.
Contoh 5 – Gabung Penuh 3 Tabel
Gabung penuh seperti memiliki kiri dan kanan bergabung menjadi satu. Ini mengembalikan semua baris, selama ada data yang cocok di salah satu tabel.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) SEBAGAI PetOwnerFROM Owners o FULL JOIN Pets p PADA p.OwnerId =o.OwnerIdFULL 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 kita mendapatkan kombinasi dari hasil yang kita dapatkan pada dua contoh sebelumnya.
Contoh 6 – Penggabungan Bersarang
Seperti yang disebutkan, Anda juga dapat melakukan penggabungan bersarang.
Berikut ini contoh gabungan bersarang.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwnerFROM Pemilik o LEFT JOIN (Pets p LEFT JOIN PetTypes pt ON p.PetTypeId =pt.PetTypeId) PADA p.OwnerId =o.OwnerId;
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 |+-----------+-----------+----------------+(9 baris terpengaruh)