Records

Join SQL

Dalam praktik di dunia nyata, data yang dibutuhkan seringkali berasal dari berbagai tabel sumber. Pada tulisan ini, saya akan membahas tentang JOIN yang merupakan cara untuk menggabungkan satu atau lebih tabel dengan kesamaan kolom. PostgreSQL mendukung kita untuk melakukan beberapa operasi seperti INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN, NATURAL JOIN, dan jenis khusus yang disebut SELF-JOIN.

INNER JOIN

Operasi INNER JOIN akan memberikan hasil berupa baris yang memiliki kesamaan nilai pada kolom di setiap tabelnya. Berikut sintaksis penggunaan INNER JOIN:

SELECT
	daftar_kolom
FROM
	tabel1 t1
INNER JOIN tabel2 t2
ON
	t1.nama_kolom = t2.nama_kolom

Jika kedua nama kolom baik pada tabel 1 maupun tabel 2 bernilai sama, maka kamu bisa menggunakan kata kunci USING dengan sintaksis berikut:

SELECT
	daftar_kolom
FROM
	tabel1 t1
INNER JOIN tabel2 t2
		USING(nama_kolom)

Untuk setipa baris di tabel1, inner join akan membandingkan nilai pada nama_kolom dengan nilai di setiap baris pada tabel2. Jika nilai di kedua tabel bernilai sama, inner join akan membuat satu baris baru termasuk semua kolom dari kedua tabel dan menaruhnya di hasil kueri. Sebaliknya, jika nilai kolom di kedua tabel memiliki nilai yang berbeda maka pasangan baris dari kedua tabel tidak akan diproses. Proses tersebut diulangi ke baris berikutnya sehingga semua baris pada tabel selesai dicocokkan.

INNER JOIN untuk menggabungkan dua tabel

Pada contoh kali ini, saya akan menggabungkan dua tabel dari database dvdrental yakni tabel film_actor dan tabel actor dengan kolom sebagai berikut:

table_name|column_name|
----------+-----------+
film_actor|actor_id   |
film_actor|film_id    |
film_actor|last_update|
table_name|column_name|
----------+-----------+
actor     |actor_id   |
actor     |last_update|
actor     |first_name |
actor     |last_name  |

dari kedua tabel tersebut terdapat kesamaan kolom actor_id. Dengan melakukan operasi inner join, kita dapat mengetahui nama aktor yang bermain pada suatu film. Berikut contoh kueri untuk mendapatkan daftar nama aktor yang bermain pada film dengan id tertentu.

SELECT
	fa.film_id ,
	a.first_name || ' ' || a.last_name AS actor_name
FROM
	film_actor fa
INNER JOIN actor a USING(actor_id)
WHERE
	fa.film_id = 8

Berikut hasil kueri:

film_id|actor_name |
-------+-----------+
      8|Fay Kilmer |
      8|Gene Willis|
      8|Susan Davis|
      8|Lucille Dee|

INNER JOIN untuk menggabungkan tiga tabel

Kalau sebelumnya kita sudah berhasil mengetahui nama aktor yang bermain pada film tertentu. Selanjutnya saya akan tunjukkan cara menggabungkan tiga tabel untuk mengetahui judul film apa yang diperankan oleh nama aktornya. Konsepnya sama seperti sebelumnya, kamu cukup menambahkan tabel dan kolom yang menjadi kunci untuk melakukan join.

Berikut contoh kueri untuk mengetahui nama film, dan nama lengkap dari para aktornya. Pada kueri ini saya akan menggabungkan tabel film, film_actor dan actor.

SELECT
	f.title ,
	a.first_name || ' ' || a.last_name AS actor_name
FROM
	film f
INNER JOIN film_actor fa
		USING(film_id)
INNER JOIN actor a
		USING(actor_id)
WHERE
	fa.film_id = 8
ORDER BY 2

LEFT JOIN

Penggunaan LEFT JOIN akan menggabungkan tabel kiri dengan tabel kanan dan akan mengembalikkan baris dari tabel kiri yang mungkin punya atau tidak punya kesamaan nilai pada tabel kanan.

Berikut contoh kueri untuk menampilan daftar film yang stoknya sedang kosong di inventori. Saya akan melakukan LEFT JOIN terhadap tabel film dan inventory dengan join key berupa kolom film_id.

SELECT
	f.film_id ,
	f.title ,
	i.inventory_id
FROM
	film f
LEFT JOIN inventory i
		USING(film_id)
WHERE
	i.film_id IS NULL
ORDER BY
	f.title;

hasil kueri:

film_id|title                 |inventory_id|
-------+----------------------+------------+
     14|Alice Fantasia        |      [NULL]|
     33|Apollo Teen           |      [NULL]|
     36|Argonauts Town        |      [NULL]|
     38|Ark Ridgemont         |      [NULL]|
     41|Arsenic Independence  |      [NULL]|
     87|Boondock Ballroom     |      [NULL]|

Pada kueri tersebut, akan dihasilkan film yang ada di tabel film terlepas dari kondisi apakah ada baris dengan nilai film_id yang sama dengan nilai film_id di tabel inventory.

RIGHT JOIN

Konsep yang dilakukan oleh RIGHT JOIN sebenarnya mirip dengan LEFT JOIN namun posisi tabelnya yang ditukar. Pada praktiknya fungsi ini lebih jarang digunakan dibanding dengan LEFT JOIN yang lebih umum.

Berikut contoh kueri untuk memberikan hasil yang sama dengan contoh kueri pada bagian LEFT JOIN sebelumnya.

SELECT
	f.film_id ,
	f.title ,
	i.inventory_id
FROM
	inventory i
RIGHT JOIN film f 
		USING(film_id)
WHERE
	i.film_id IS NULL
ORDER BY
	f.title;

SELF JOIN

Sesuai dengan namanya, self join merupakan istilah untuk melakukan proses join pada tabel yang sama. Kamu dapat menggunakaan nama alias yang berbeda pada tabel yang sama untuk melakukan self join. Self join biasanya digunakan untuk melakukan pengecekan kondisi pada tabel seperti mencari kondisi yang sama atau yang berhubungan dengan hirarki. Berikut contoh kueri untuk mencari film dengan durasi dan durasi peminjaman yang sama.

SELECT
	f1.title,
	f2.title ,
	f1.length,
	f1.rental_duration
FROM
	film f1
INNER
JOIN film f2 ON
	f1.film_id > f2.film_id -- agar dua judul berbeda bisa dibandingkan
	AND f1.length = f2.length
	AND f1.rental_duration = f2.rental_duration 

hasil kueri:

title                  |title                      |length|rental_duration|
-----------------------+---------------------------+------+---------------+
Arabia Dogma           |Airplane Sierra            |    62|              6|
Dying Maker            |Antitrust Tomatoes         |   168|              5|
Baby Hall              |Apollo Teen                |   153|              5|
Banger Pinocchio       |Attacks Hate               |   113|              5|
Bilko Anonymous        |Behavior Runaway           |   100|              3|
Born Spinal            |Anonymous Human            |   179|              7|

FULL OUTER JOIN

Proses FULL OUTER JOIN akan menggabungkan dua tabel atau lebih dan akan menghasilkan semua baris dari semua tabel, baik yang memiliki kesesuaian nilai maupun yang tidak. Kata kunci OUTER bersifat opsional sehingga jenis join ini dikenal juga dengan FULL JOIN.

Sebagai contoh, saya akan melakukan operasi FULL OUTER JOIN menggunakan tabel dosen dan matakuliah.

(tabel dosen)
dosen_id|nama_dosen|mk_id |
--------+----------+------+
       1|Diluc     |     1|
       2|Rosaria   |     1|
       3|Keqing    |     2|
       4|Zhongli   |     3|
       5|Sayu      |     4|
       6|Clorinde  |[NULL]|
(tabel matakuliah)
mk_id|nama_mk          |
-----+-----------------+
    1|Database         |
    2|Algoritma        |
    3|Sistem Operasi   |
    4|Kecerdasan Buatan|

Berikut adalah contoh kueri FULL JOIN dari kedua tabel tersebut:

SELECT
	nama_dosen,
	nama_mk
FROM
	dosen
FULL JOIN matakuliah
		USING(mk_id);

Berikut hasil kuerinya:

nama_dosen|nama_mk          |
----------+-----------------+
Diluc     |Database         |
Rosaria   |Database         |
Keqing    |Algoritma        |
Zhongli   |Sistem Operasi   |
Sayu      |Kecerdasan Buatan|
Clorinde  |[NULL]           |

baris dengan nama_dosen bernilai Clorinde tetap ditampilkan pada hasil kueri meskipun baris tersebut tidak memiliki nilai pada kolom mk_id.

CROSS JOIN

Dalam PostgreSQL, CROSS JOIN memungkinkan kamu untuk menggabungkan dua tabel dengan mengkombinasikan setiap baris dari tabel pertama dengan setiap baris pada tabel kedua. Dalam teori himpunan, bisa dikatakan bahwa hasil dari CROSS JOIN adalah perkalian kartesian dari baris di kedua tabel.

Sebagai contoh, saya akan melakukan CROSS JOIN dari tabel dosen dan matakuliah yang sebelumnya digunakan sebagai contoh namun kali ini saya hanya akan mengambil masing-masing kolom nama_dosen dan nama_mk. Berikut contoh kueri untuk mendapatkan hasil tersebut:

SELECT
	*
FROM
	(
	SELECT
		nama_dosen
	FROM
		dosen) AS dosen
CROSS JOIN (
	SELECT
		nama_mk
	FROM
		matakuliah) AS matakuliah;

berikut cuplikan hasil kuerinya:

nama_dosen|nama_mk          |
----------+-----------------+
Diluc     |Database         |
Diluc     |Algoritma        |
Diluc     |Sistem Operasi   |
Diluc     |Kecerdasan Buatan|
Rosaria   |Database         |
Rosaria   |Algoritma        |
(24 Rows)

Karena terdapat 6 jenis nilai di nama_dosen dan 4 jenis nilai di nama_mk maka akan dihasilkan 6 * 4 = 24 baris pada hasil kueri.

NATURAL JOIN

Konsep NATURAL JOIN akan membuat join secara implisit berdasarkan kolom yang digunakan. Berikut contoh kueri NATURAL JOIN menggunakan tabel dosen dan matakuliah seperti sebelumnya:

SELECT
	*
FROM
	dosen
NATURAL JOIN matakuliah;

Hasil kueri:

mk_id |dosen_id|nama_dosen|nama_mk          |
------+--------+----------+-----------------+
     1|       1|Diluc     |Database         |
     1|       2|Rosaria   |Database         |
     2|       3|Keqing    |Algoritma        |
     3|       4|Zhongli   |Sistem Operasi   |
     4|       5|Sayu      |Kecerdasan Buatan|

Kueri yang diberikan pada contoh di atas ekivalen dengan INNER JOIN dengan kolom mk_id sebagai key joinnya.