Apa perbedaan antara EXISTS
dan IN
klausa dalam SQL?
Kapan kita harus menggunakan EXISTS
, dan kapan kita harus menggunakan IN
?
Kata exists
kunci dapat digunakan dengan cara itu, tetapi sebenarnya itu dimaksudkan sebagai cara untuk menghindari penghitungan:
--this statement needs to check the entire table
select count(*) from [table] where ...
--this statement is true as soon as one match is found
exists ( select * from [table] where ... )
Ini sangat berguna di mana Anda memiliki if
pernyataan bersyarat, karena exists
bisa jauh lebih cepat daripada count
.
Yang in
terbaik digunakan di mana Anda memiliki daftar statis untuk dilewati:
select * from [table]
where [field] in (1, 2, 3)
Ketika Anda memiliki tabel dalam in
pernyataan, lebih masuk akal untuk menggunakan join
, tetapi sebagian besar itu tidak masalah. Pengoptimal kueri harus mengembalikan paket yang sama. Dalam beberapa implementasi (kebanyakan lebih tua, seperti Microsoft SQL Server 2000) in
kueri akan selalu mendapatkan paket bergabung bersarang , sementara join
kueri akan menggunakan bersarang, menggabungkan atau hash yang sesuai. Implementasi yang lebih modern lebih cerdas dan dapat menyesuaikan rencana bahkan ketika in
digunakan.
JOIN
sebagai penggantiIN
.select * from [table] where [field] in (select [field] from [table2])
mengembalikan hasil yang sama (dan rencana kueri) sebagaiselect * from [table] join [table2] on [table2].[field] = [table].[field]
.table
, sedangkan yang kedua mengembalikan semuanya daritable
dantable2
. Dalam beberapa (sebagian besar yang lebih tua) database SQLin
kueri akan diimplementasikan sebagai bergabung bersarang, sementarajoin
kueri dapat bersarang, digabung, hash, dll - apa pun yang tercepat.exists
dapat digunakan dalam pernyataan kasus, sehingga mereka dapat berguna juga yaituselect case when exists (select 1 from emp where salary > 1000) then 1 else 0 end as sal_over_1000
EXISTS
akan memberi tahu Anda apakah kueri mengembalikan hasil apa pun. misalnya:IN
digunakan untuk membandingkan satu nilai dengan beberapa, dan dapat menggunakan nilai literal, seperti ini:Anda juga dapat menggunakan hasil kueri dengan
IN
klausa, seperti ini:sumber
Berdasarkan pengoptimal aturan :
EXISTS
jauh lebih cepat daripadaIN
, ketika hasil sub-permintaan sangat besar.IN
lebih cepat daripadaEXISTS
, ketika hasil sub-permintaan sangat kecil.Berdasarkan pengoptimal biaya :
sumber
Saya berasumsi Anda tahu apa yang mereka lakukan, dan dengan demikian digunakan secara berbeda, jadi saya akan memahami pertanyaan Anda sebagai: Kapan ide yang baik untuk menulis ulang SQL untuk menggunakan IN daripada EXISTS, atau sebaliknya.
Apakah itu asumsi yang adil?
Sunting : Alasan saya bertanya adalah bahwa dalam banyak kasus Anda dapat menulis ulang SQL berdasarkan IN untuk menggunakan EXIS, dan sebaliknya, dan untuk beberapa mesin basis data, pengoptimal kueri akan memperlakukan keduanya secara berbeda.
Contohnya:
dapat ditulis ulang menjadi:
atau dengan bergabung:
Jadi pertanyaan saya masih berdiri, apakah poster asli bertanya-tanya tentang apa IN dan EXISTS, dan dengan demikian bagaimana menggunakannya, atau apakah dia bertanya apakah menulis ulang SQL menggunakan IN untuk menggunakan EXISTS sebagai gantinya, atau sebaliknya, akan menjadi ide yang baik?
sumber
JOIN
, Anda membutuhkanDISTINCT
EXISTS
jauh lebih cepat daripadaIN
ketika hasil subquery sangat besar.IN
lebih cepat daripadaEXISTS
ketika hasil subquery sangat kecil.Pertanyaan 1
Pertanyaan 2
Jika dalam
t1
id Anda memiliki nilai nol maka Kueri 1 akan menemukannya, tetapi Kueri 2 tidak dapat menemukan parameter nol.Maksud saya
IN
tidak dapat membandingkan apa pun dengan nol, jadi tidak ada hasil untuk nol, tetapiEXISTS
dapat membandingkan semuanya dengan nol.sumber
Jika Anda menggunakan
IN
operator, mesin SQL akan memindai semua catatan yang diambil dari permintaan dalam. Di sisi lain jika kita menggunakanEXISTS
, mesin SQL akan menghentikan proses pemindaian segera setelah menemukan kecocokan.sumber
IN hanya mendukung hubungan kesetaraan (atau ketidaksetaraan ketika didahului oleh TIDAK ).
Ini adalah sinonim dari = any / = some , eg
EXISTS mendukung berbagai jenis hubungan, yang tidak dapat diekspresikan menggunakan IN , misalnya -
Dan pada nada yang berbeda -
Perbedaan kinerja dan teknis yang diduga antara EXISTS dan IN dapat terjadi akibat implementasi / batasan / bug vendor spesifik, tetapi sering kali mereka tidak lain hanyalah mitos yang diciptakan karena kurangnya pemahaman internal database.
Definisi tabel, akurasi statistik, konfigurasi basis data, dan versi pengoptimal memiliki semua dampak pada rencana eksekusi dan oleh karena itu pada metrik kinerja.
sumber
Kata
Exists
kunci mengevaluasi benar atau salah, tetapiIN
kata kunci membandingkan semua nilai dalam kolom permintaan sub yang sesuai. Satu lagiSelect 1
dapat digunakan denganExists
perintah. Contoh:Tetapi
IN
kurang efisien jadiExists
lebih cepat.sumber
Kupikir,
EXISTS
adalah saat Anda harus mencocokkan hasil kueri dengan subquery lain. Hasil Query # 1 harus diambil di tempat yang cocok dengan hasil SubQuery. Jenis Bergabung. Misalnya memilih tabel pelanggan # 1 yang telah menempatkan tabel pesanan # 2 jugaIN adalah untuk mengambil jika nilai kolom tertentu terletak
IN
dalam daftar (1,2,3,4,5). Mis. Pilih pelanggan yang berada dalam kode pos berikut ini, yaitu nilai-nilai zip_code terletak pada daftar (....).Kapan harus menggunakan satu di atas yang lain ... ketika Anda merasa itu membaca dengan tepat (Berkomunikasi niat lebih baik).
sumber
Perbedaannya terletak di sini:
Kueri di atas akan mengembalikan semua catatan sementara di bawah yang satu akan kembali kosong.
Cobalah dan amati hasilnya.
sumber
Sesuai pengetahuan saya ketika subquery mengembalikan
NULL
nilai maka seluruh pernyataan menjadiNULL
. Dalam hal ini kami menggunakanEXITS
kata kunci. Jika kami ingin membandingkan nilai tertentu dalam subqueries maka kami menggunakanIN
kata kunci.sumber
Yang mana yang lebih cepat tergantung pada jumlah kueri yang diambil oleh kueri batin:
ADA mengevaluasi benar atau salah tetapi DI membandingkan nilai ganda. Ketika Anda tidak tahu catatan itu ada atau tidak, Anda harus memilih ADA
sumber
Alasannya adalah bahwa operator EXISTS bekerja berdasarkan prinsip "setidaknya ditemukan". Ini mengembalikan true dan berhenti memindai tabel sekali setidaknya satu baris yang cocok ditemukan.
Di sisi lain, ketika operator IN digabungkan dengan subquery, MySQL harus memproses subquery terlebih dahulu, dan kemudian menggunakan hasil dari subquery untuk memproses seluruh permintaan.
sumber
Pemahaman saya adalah keduanya harus sama selama kita tidak berurusan dengan nilai NULL.
Alasan yang sama mengapa kueri tidak mengembalikan nilai untuk = NULL vs adalah NULL. http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/
Adapun argumen boolean vs komparator berjalan, untuk menghasilkan boolean kedua nilai perlu dibandingkan dan itulah bagaimana jika kondisi bekerja. Jadi saya gagal untuk memahami bagaimana IN dan EXISTS berperilaku berbeda.
sumber
In certain circumstances, it is better to use IN rather than EXISTS. In general, if the selective predicate is in the subquery, then use IN. If the selective predicate is in the parent query, then use EXISTS.
https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm#i28403
sumber
Jika subquery mengembalikan lebih dari satu nilai, Anda mungkin perlu menjalankan query luar- jika nilai dalam kolom yang ditentukan dalam kondisi cocok dengan nilai apa pun di set hasil subquery. Untuk melakukan tugas ini, Anda perlu menggunakan
in
kata kunci.Anda dapat menggunakan subquery untuk memeriksa apakah ada catatan. Untuk ini, Anda perlu menggunakan
exists
klausa dengan subquery. Kataexists
kunci selalu mengembalikan nilai benar atau salah.sumber
Saya percaya ini memiliki jawaban langsung. Mengapa Anda tidak memeriksanya dari orang yang mengembangkan fungsi itu di sistem mereka?
Jika Anda seorang pengembang MS SQL, berikut ini jawabannya langsung dari Microsoft.
IN
:EXISTS
:sumber
Saya menemukan bahwa menggunakan kata kunci yang ada sering kali sangat lambat (itu sangat benar di Microsoft Access). Saya malah menggunakan operator bergabung dengan cara ini: harus-saya-gunakan-kata kunci-ada-di-sql
sumber
EXISTS Lebih Cepat dalam Kinerja daripada IN. Jika sebagian besar kriteria filter dalam subquery maka lebih baik untuk menggunakan IN dan Jika sebagian besar kriteria filter dalam permintaan utama maka lebih baik menggunakan EXISTS.
sumber
Jika Anda menggunakan operator IN, mesin SQL akan memindai semua catatan yang diambil dari permintaan dalam. Di sisi lain jika kita menggunakan EXIS, mesin SQL akan menghentikan proses pemindaian segera setelah menemukan kecocokan.
sumber
IN
danEXISTS
dapat setara dan ditransformasikan menjadi satu sama lain.