Navicat Blog

Menulis Query SELECT dengan EXISTS Sep 26, 2024 by Robert Gravelle

Operator SQL EXISTS menawarkan cara mudah untuk mengambil data berdasarkan keberadaan (atau ketidakberadaan) beberapa data lainnya. Lebih khusus lagi, ini adalah operator logika yang mengevaluasi hasil subquery dan mengembalikan nilai boolean yang menunjukkan apakah baris dikembalikan atau tidak. Meskipun operator IN dapat digunakan untuk tujuan yang hampir sama, ada beberapa perbedaan yang perlu diperhatikan. Blog hari ini akan membahas cara menggunakan operator EXISTS menggunakan beberapa contoh serta memberikan beberapa panduan tentang kapan harus menggunakan EXISTS daripada IN.

Aksi EXISTS

Meskipun operator EXISTS dapat digunakan dalam pernyataan SELECT, UPDATE, INSERT, atau DELETE, kita akan tetap menggunakan kueri SELECT agar semuanya tetap sederhana. Dengan demikian, sintaksis yang akan kita gunakan akan sangat mirip dengan ini:

SELECT column_name(s) 
FROM table_name
WHERE EXISTS ( SELECT column_name(s) 
               FROM table_name
               WHERE condition );

Kita akan menjalankan query terhadap beberapa tabel PostgreSQL - pelanggan dan akun - seperti yang mungkin kita temukan dalam basis data perbankan. Berikut ini adalah query tersebut dalam Tampilan Grid Navicat for PostgreSQL:

customer_table (29K)

account_table (28K)

Sekarang kita dapat melihat semua customer yang memiliki akun terasosasi dengan customer_id mereka menggunakan query berikut:

SELECT *
FROM customer C
WHERE EXISTS ( SELECT *
               FROM account A
               WHERE C.customer_id = A.customer_id );

Berikut adalah query di atas dengan hasil di Editor Query Navicat Premium:

customers_with_accounts (49K)

Menggunakan NOT dengan EXISTS

Sebaliknya, mengawali operator EXISTS dengan kata kunci NOT menyebabkan query hanya memilih rekaman yang tidak memiliki baris yang cocok dalam subquery. Kita dapat menggunakan NOT EXISTS untuk mengambil semua akun yatim piatu, yaitu akun tanpa pelanggan terkait:

SELECT *
FROM account A
WHERE NOT EXISTS ( SELECT *
                   FROM customer C
                   WHERE A.customer_id = C.customer_id );

Itu mengembalikan akun untuk pelanggan #4 karena tidak ada pelanggan dengan ID itu dalam tabel pelanggan.

accounts_without_customers (47K)

Mengganti EXISTS dengan Joins

Query yang menggunakan operator EXISTS dapat sedikit lambat untuk dijalankan karena subquery perlu dijalankan untuk setiap baris Query luar. Oleh karena itu, Anda harus mempertimbangkan untuk menggunakan gabungan bila memungkinkan. Bahkan, kita dapat menulis ulang query EXISTS di atas menggunakan LEFT JOIN:

SELECT C.*
FROM customer C
  LEFT JOIN account A ON C.customer_id = A.customer_id;
left_join (36K)

Operator IN vs EXISTS

Meskipun operator IN biasanya digunakan untuk memfilter kolom untuk daftar nilai tertentu, operator ini juga dapat diterapkan pada hasil subquery. Berikut ini padanannya dengan query pertama kita, kali ini menggunakan IN dan bukan EXISTS:

SELECT * 
FROM customer 
WHERE customer_id IN (SELECT customer_id FROM account);

Perhatikan bahwa kita hanya dapat memilih kolom yang ingin kita bandingkan, bukan SELECT *. Meskipun demikian, query IN menghasilkan hasil yang sama:

in_query (43K)

Karena kedua operator tersebut sangat mirip, pengembang database sering kali tidak yakin operator mana yang harus digunakan. Sebagai aturan umum, Anda harus menggunakan operator IN saat ingin memfilter baris berdasarkan daftar value tertentu. Gunakan EXISTS saat ingin memeriksa keberadaan baris yang memenuhi kondisi tertentu dalam subquery.

Kesimpulan

Dalam blog hari ini, kita mempelajari cara menggunakan operator EXISTS serta cara memutuskan apakah akan menggunakan EXISTS atau IN.

Tertarik mencoba Navicat Premium 17? Anda dapat mengunduhnya untuk 14-day fully functional FREE trial. Tersedia untuk sistem operasi Windows, macOS, dan Linux.

Navicat Blog
Feed Entri
Arsip Blog
Bagikan