Mayoritas developer dan profesional database familiar dengan standar tipe inner, outer, left, dan right JOIN. Meskipun ini dapat ditulis menggunakan ANSI SQL, ada beberapa tipe join lain yang didasarkan pada operator aljabar relasional yang tidak memiliki representasi syntax dalam SQL. Hari ini kita akan membahas salah satu jenis join tersebut: Semi Join. Minggu depan kita akan membahas Anti Join yang serupa. Untuk mendapatkan pemahaman yang lebih baik bagaimana tipe join ini bekerja, kita akan mengeksekusi beberapa query SELECT dari Navicat Premium Lite 17 terhadap dvdrental database PostgreSQL. Ini adalah database gratis yang berbasiskan pada Sakila Sample Database MySQL.
Penjelasan Semi Join
Bayangkan sejenak bahwa ANSI SQL mendukung Semi Join. Jika ya, syntaxnya mungkin akan mirip dengan ekstensi syntax Cloudera Impala, yaitu LEFT SEMI JOIN dan RIGHT SEMI JOIN. Dengan mengingat hal itu, berikut ini adalah tampilan query yang menggunakan Semi Join:
SELECT * FROM actor LEFT SEMI JOIN film_actor USING (actor_id)
Query di atas akan menampilkan semua aktor yang bermain dalam film. Masalahnya adalah kita tidak ingin ada film dalam hasil, kita juga tidak ingin beberapa baris aktor yang sama. Kita hanya ingin setiap aktor muncul satu kali (atau nol kali) dalam hasil. Kata "Semi" berasal dari bahasa Latin dan diterjemahkan menjadi "setengah" dalam bahasa Inggris. Oleh karena itu, query kita hanya mengimplementasikan "setengah gabungan", dalam hal ini, setengah bagian kiri. Dalam SQL, ada dua sintaks alternatif yang dapat kita gunakan untuk menyelesaikan Semi Join: EXISTS dan IN.
Semi Join Menggunakan EXISTS
Berikut ini adalah ekuivalen Semi Join menggunakan EXISTS:
SELECT * FROM actor a WHERE EXISTS ( SELECT * FROM film_actor fa WHERE a.actor_id = fa.actor_id )
Jika kita mengeksekusi query kita di Navicat Premium Lite 17, kita dapat melihatnya bekerja sesuai ekspetasi:
Daripada menggunakan join, operator EXISTS memeriksa keberadaan satu atau beberapa baris untuk setiap aktor dalam tabel film_actor. Berkat klausa WHERE, sebagian besar database akan dapat mengenali bahwa kita melakukan SEMI JOIN daripada predikat EXISTS() biasa.
Semi Join Menggunakan IN
IN dan EXISTS adalah emulasi SEMI JOIN yang sama persis, sehingga query berikut akan menghasilkan hasil yang sama persis di sebagian besar database seperti query EXISTS sebelumnya:
SELECT * FROM actor WHERE actor_id IN ( SELECT actor_id FROM film_actor )
Berikut ini query dan hasilnya di Navicat Premium Lite 17:
EXISTS dianggap sebagai syntax yang lebih kuat (meskipun sedikit lebih bertele-tele).
Conclusion
Dalam blog hari ini, kita mempelajari cara meniru Semi Join menggunakan sintaks ANSI SQL. Selain menjadi solusi optimal dalam hal "kebenaran", ada juga beberapa manfaat kinerja saat menggunakan "SEMI" JOIN daripada INNER JOIN, karena database dapat berhenti mencari kecocokan segera setelah menemukan kecocokan pertama.
Tertarik mencoba Navicat Premium Lite 17? Anda dapat mengunduhnya untuk 14 hari uji coba GRATIS berfungsi penuh. Ini tersedia untuk system operasi Windows, macOS, dan Linux.