Perbedaan antara EXISTS dan IN dalam SQL

Pertimbangkan tujuan SQL Anda saat memilih EXISTS atau IN.

Operator IN

Operator IN mengembalikan baris jika nilai tabel. DI MANA kolom yang sesuai dengan daftar nilai-nilai IN. IN biasanya digunakan sebagai bagian dari kueri utama atau bersama dengan subkueri. Contoh 1: WHERE Table.Field di ('a', 'b', 'c') Contoh 2: WHERE Table.Field di (set nilai yang dikembalikan oleh subquery)

Operator ADA

Operator EXISTS mengembalikan semua baris permintaan utama jika subquery berisi baris apa pun. EXISTS hanya digunakan bersama dengan subkueri. Baris yang dikembalikan ditentukan dengan memfilter pada tingkat kueri utama. Contoh: WHERE EXISTS (set nilai pengembalian subquery)

Perbedaan

IN tidak dapat mengevaluasi NULL, sehingga baris selalu salah, dan mereka tidak dikembalikan. EXISTS dapat mengevaluasi NULL, sehingga baris dapat dikembalikan.

Persamaan

EXISTS dan IN keduanya mendukung subqueries yang berkorelasi dan tidak berkorelasi, dan keduanya dapat menghasilkan hasil utama yang serupa. Ketika dikorelasikan, EXISTS dan IN cocok dengan field query utama dengan field subquery (mis: main.id = subquery.id). Subkueri dievaluasi baris demi baris, untuk setiap pertandingan yang ditemukan. Dalam hal ini, IN dan EXISTS akan mengembalikan baris yang sama berdasarkan identifikasi yang serupa. Ketika mereka tidak berkorelasi, EXISTS dan IN memproses subqueries mereka terlebih dahulu dan kemudian mencocokkan hasil dengan kueri utama.

Kinerja EXISTS dan IN

Kinerja ditentukan oleh pengoptimal database dan rencana eksekusi yang digunakan untuk kode yang dijalankan. Untuk EXISTS dan IN, pengoptimal dapat memilih jalur yang berbeda. Di Oracle, NO EXISTS menghindari anti-join, dan biasanya terbukti lebih cepat daripada NO IN. Singkatnya, diperlukan sedikit trial and error untuk menentukan jalur tercepat tergantung pada database dan versinya digunakan. Pastikan Anda menggunakan operator yang menjamin hasil yang benar, jika semuanya sama, cobalah mengganti EXISTS dan IN untuk melihat yang mana yang lebih cepat.