Traffine I/O

Bahasa Indonesia

2023-03-07

EXISTS dalam SQL

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:

sql
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:

sql
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:

sql
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 daripada IN karena berhenti memproses begitu menemukan hasil yang cocok pertama, sedangkan IN memeriksa semua hasil meskipun telah menemukan kecocokan.

  • Penanganan Null
    IN dan EXISTS menangani nilai Null dengan cara yang berbeda. Jika subquery mengembalikan nilai NULL, IN tidak akan mencocokkannya, sedangkan EXISTS masih bisa mengembalikan TRUE 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:

sql
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:

sql
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.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!