EXISTS dalam SQL
Operator EXISTS
dalam SQL adalah jenis fungsi yang digunakan untuk memeriksa keberadaan hasil dari subquery. Ini dapat membantu menentukan apakah ada baris yang dikembalikan dari subquery, mengembalikan TRUE jika setidaknya satu baris dikembalikan dan FALSE jika tidak ada baris yang dikembalikan.
Kondisi EXISTS
dapat digunakan dalam pernyataan SQL seperti SELECT
, INSERT
, UPDATE
, DELETE
, dan sebagainya.
Sintaks dan Penggunaan EXISTS
Sintaks dasar untuk menggunakan EXISTS
adalah sebagai berikut:
SELECT column_name(s)
FROM table_name
WHERE EXISTS (subquery);
Subquery adalah pernyataan SELECT
yang mengembalikan sekumpulan data. Kondisi EXISTS
dianggap "benar" jika subquery mengembalikan setidaknya satu data.
Untuk mengilustrasikan kondisi EXISTS
, mari gunakan dua contoh tabel, Customers
dan Orders
.
Tabel Customers:
CustomerID | CustomerName | ContactName | Country |
---|---|---|---|
1 | Alfreds | Maria | Germany |
2 | Ana Trujillo | Ana | Mexico |
3 | Antonio | Antonio | Mexico |
Tabel Orders:
OrderID | CustomerID | OrderDate |
---|---|---|
1 | 3 | 2023-06-25 |
2 | 1 | 2023-07-05 |
3 | 2 | 2023-07-08 |
4 | 1 | 2023-07-08 |
Sekarang, misalkan kita ingin mencari semua pelanggan yang telah melakukan pemesanan. Kita dapat melakukannya menggunakan EXISTS
sebagai berikut:
SELECT CustomerName
FROM Customers
WHERE EXISTS (SELECT 1 FROM Orders WHERE Customers.CustomerID = Orders.CustomerID);
Query ini akan mengembalikan semua nama pelanggan yang memiliki setidaknya satu entri yang sesuai di tabel Orders
.
CustomerName |
---|
Alfreds |
Ana Trujillo |
Antonio |
Perbedaan Antara EXISTS dan IN
Operator IN
digunakan untuk membandingkan nilai dengan daftar nilai literal yang telah ditentukan. Di sini, subquery dieksekusi terlebih dahulu, dan menghasilkan kumpulan data. Kemudian, query utama dieksekusi dan nilai yang diberikan dibandingkan dengan hasil subquery.
Pertimbangkan tabel Customers
dan Orders
yang sama dari contoh sebelumnya. Jika kita ingin mencari semua pelanggan yang telah melakukan pemesanan, menggunakan IN
, query akan menjadi:
SELECT CustomerName
FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Orders);
Subquery (SELECT CustomerID FROM Orders
) akan mengembalikan daftar CustomerID. Kemudian, query utama akan mencocokkan CustomerID dari tabel Customers
dengan daftar ini.
Kondisi EXISTS
dalam SQL digunakan untuk memeriksa apakah subquery mengembalikan baris. Jika subquery mengembalikan setidaknya satu baris, hasil dari EXISTS
adalah "benar". Dalam kebanyakan kasus, EXISTS
digunakan dalam korelasi dengan subquery, di mana subquery merujuk pada nilai dari query luar.
Untuk kebutuhan yang sama dalam mencari semua pelanggan yang telah melakukan pemesanan, menggunakan EXISTS
, query akan menjadi:
SELECT CustomerName
FROM Customers
WHERE EXISTS (SELECT 1 FROM Orders WHERE Customers.CustomerID = Orders.CustomerID);
Dalam hal ini, query luar dijalankan terlebih dahulu, dan untuk setiap baris, subquery dieksekusi dan memeriksa keberadaan baris yang sesuai di tabel Orders.
Perbedaan Utama
-
Kinerja
Saat bekerja dengan dataset yang besar,EXISTS
dapat memiliki kinerja yang lebih baik daripadaIN
karena berhenti memproses begitu menemukan hasil yang cocok pertama, sedangkanIN
memeriksa semua hasil meskipun telah menemukan kecocokan. -
Penanganan Null
IN danEXISTS
menangani nilai Null dengan cara yang berbeda. Jika subquery mengembalikan nilaiNULL
,IN
tidak akan mencocokkannya, sedangkanEXISTS
masih bisa mengembalikanTRUE
jika ada kecocokan non-null lainnya. -
Penggunaan
IN
umumnya digunakan ketika Anda mengetahui nilai-nilai yang tepat atau saat membandingkan kolom dengan kumpulan nilai tertentu.EXISTS
lebih efisien ketika memeriksa keberadaan baris berdasarkan beberapa kondisi, dan sangat bermanfaat ketika subquery terkorelasi.
Subquery Terkorelasi dan Tak Terkorelasi
Subquery dalam SQL dapat secara umum dibagi menjadi dua tipe: subquery terkorelasi dan tak terkorelasi.
Subquery Tak Terkorelasi
Subquery tak terkorelasi, juga dikenal sebagai subquery sederhana atau mandiri, adalah subquery di mana subquery dapat berjalan secara independen dari query luar. Mereka tidak bergantung pada data dari query luar.
Sebagai contoh, pertimbangkan tabel Customers
dan Orders
yang disebutkan sebelumnya. Jika Anda ingin mencari pelanggan dari negara tertentu yang telah melakukan pemesanan, Anda dapat menggunakan subquery tak terkorelasi seperti berikut:
SELECT CustomerName
FROM Customers
WHERE Country = 'Mexico' AND CustomerID IN (SELECT CustomerID FROM Orders);
Di sini, subquery (SELECT CustomerID FROM Orders
) tidak bergantung pada informasi apa pun dari query luar. Subquery tersebut hanya mengembalikan daftar CustomerID yang telah melakukan pemesanan. Daftar ini kemudian digunakan oleh klausa IN
dalam query luar.
Subquery Terkorelasi
Subquery terkorelasi, di sisi lain, bergantung pada data dari query luar. Mereka merujuk pada kolom atau kolom-kolom dalam query luar, dan untuk setiap baris yang diproses oleh query luar, subquery dieksekusi satu kali.
Kembali pada tujuan mencari semua pelanggan yang telah melakukan pemesanan, sebuah subquery terkorelasi menggunakan EXISTS
akan seperti berikut:
SELECT CustomerName
FROM Customers
WHERE EXISTS (SELECT 1 FROM Orders WHERE Customers.CustomerID = Orders.CustomerID);
Dalam kasus ini, subquery (SELECT 1 FROM Orders WHERE Customers.CustomerID = Orders.CustomerID
) merujuk pada CustomerID dari query luar. Untuk setiap baris dalam tabel Customers
, subquery dieksekusi dan memeriksa keberadaan baris yang sesuai di tabel Orders
.
Perbedaan Utama dan Penggunaan
Subquery tak terkorelasi lebih mudah dipahami karena dapat dijalankan secara terpisah dari query luar. Mereka berguna dalam situasi di mana Anda perlu membandingkan data dengan daftar statis atau hasil dari pernyataan SELECT
terpisah.
Subquery terkorelasi lebih dinamis karena mereka menjalankan kembali subquery untuk setiap baris query luar. Ini dapat sangat bermanfaat, tetapi dapat mengakibatkan masalah kinerja dengan dataset yang besar. Subquery terkorelasi digunakan ketika hasil tergantung pada data dalam query luar. Ini memungkinkan analisis data yang lebih canggih dan tugas perbandingan yang lebih kompleks.