Persediaan Temu Duga Pengaturcaraan · Pelajaran

Prestasi EXISTS berbanding IN

Bila EXISTS berhenti lebih awal dan mengatasi IN, iaitu soalan lazim untuk saringan peringkat kanan

Pelajaran 4 daripada 413 langkah

Prestasi EXISTS berbanding IN ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Perkara yang Sebenarnya Diuji oleh EXISTS

EXISTS menerima subkueri dan mengembalikan benar sebaik sahaja subkueri itu menghasilkan sekurang-kurangnya satu baris. Ia tidak mengambil kira nilai yang dikembalikan — hanya sama ada wujud mana-mana baris.

  • Ia ialah ujian nilai benar atau palsu yang digunakan dalam WHERE.
  • Ia hampir selalu berkorelasi: kueri dalam merujuk baris luar.

Soalan saringan ringkas ini muncul dalam hampir setiap temu duga SQL peringkat pertengahan hingga kanan.

Kueri EXISTS Asas

Cari pelanggan yang telah membuat sekurang-kurangnya satu pesanan. Kueri dalam berkorelasi melalui o.customer_id = c.id; EXISTS mengembalikan benar sebaik sahaja satu pesanan yang sepadan ditemui.

Perhatikan SELECT 1 — nilai yang diunjurkan tidak penting, jadi kebanyakan jurutera menulis 1 atau *. Penemuduga menerima kedua-duanya; pengoptimum mengabaikan senarai pemilihan di dalam EXISTS.

SELECT c.name
FROM customers c
WHERE EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.id
);

Tingkah Laku Pintasan Awal

Kata kunci yang dikehendaki penemuduga ialah pintasan awal. EXISTS berhenti mengimbas kueri dalam sebaik sahaja menemui satu baris yang sepadan. Ia tidak perlu membina atau membuang pendua daripada keseluruhan senarai padanan.

Sebaliknya, IN secara konsepnya membentuk set nilai daripada subkueri dan kemudian menyemak keahlian. Bagi set dalam yang besar atau mempunyai banyak pendua, perbezaan itu penting.

Kueri yang Sama Dengan IN

Inilah padanan IN bagi kueri pelanggan yang mempunyai pesanan. Hasilnya sama dari segi logik tetapi mekanismenya berbeza: subkueri tidak berkorelasi dan menghasilkan senarai ID pelanggan yang disemak oleh kueri luar.

Pada pengoptimum moden, kedua-duanya sering menghasilkan pelan yang sama — tetapi bagi orders yang besar dan mempunyai banyak pendua, EXISTS boleh menjadi lebih pantas kerana ia berhenti pada padanan pertama.

SELECT c.name
FROM customers c
WHERE c.id IN (
  SELECT o.customer_id FROM orders o
);

NOT EXISTS Mengatasi NOT IN

Inilah kesimpulan utama keseluruhan pelajaran. NOT EXISTS ialah cara yang selamat untuk menyatakan cantuman anti. Berbeza daripada NOT IN, ia tidak terjejas oleh NULL dalam kueri dalam.

Ia mencari setiap pelanggan tanpa pesanan dengan pasti, walaupun orders.customer_id mengandungi NULL.

SELECT c.name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.id
);

Mengapa NOT EXISTS Selamat terhadap NULL

NOT EXISTS hanya bertanya adakah subkueri berkorelasi menemui mana-mana baris yang sepadan? — jawapan ya atau tidak yang jelas. customer_id yang bernilai NULL semata-mata tidak pernah memenuhi o.customer_id = c.id, jadi ia tidak sepadan dan tidak merosakkan logik.

Bandingkan dengan NOT IN, yang memaksa UNKNOWN apabila terdapat NULL dalam senarai lalu menggugurkan semua baris. Inilah sebabnya penemuduga berpengalaman lebih menyukai NOT EXISTS untuk cantuman anti.

Apabila IN Sebenarnya Lebih Baik

Bersikap seimbang — IN tidak semestinya lebih buruk. Apabila subkueri mengembalikan senarai yang kecil, tetap dan tanpa pendua, IN jelas serta pantas:

  • Segelintir nilai literal atau jadual carian yang sangat kecil.
  • Kueri yang tidak berkorelasi dan boleh dijalankan sekali oleh pengoptimum, dengan hasilnya disimpan untuk digunakan semula.

Kueri di bawah sangat lazim; memilih EXISTS dalam keadaan ini merupakan reka bentuk yang berlebihan.

SELECT name
FROM products
WHERE category_id IN (
  SELECT id FROM categories WHERE active = true
);

Jawapan Moden yang Tepat

Pengoptimum matang (Postgres, SQL Server terkini dan MySQL) kerap menulis semula IN dan EXISTS menjadi pelan cantuman separa yang sama. Jadi bagi keahlian positif biasa, prestasinya selalunya sama.

Perbezaan yang masih penting:

  • NOT IN berbanding NOT EXISTS — ketepatan dengan NULL (perbezaan sebenar, bukan sekadar kelajuan).
  • Jadual dalam yang sangat besar atau tidak diindeks — EXISTS menggunakan pintasan awal.

EXISTS berbanding JOIN untuk Kewujudan

Satu lagi cara penemuduga mengemukakan soalan ini: mengapa tidak gunakan JOIN sahaja? Cantuman yang hanya menyemak kewujudan boleh menggandakan baris jika sebelah kanan mempunyai pendua, lalu memerlukan DISTINCT. EXISTS tidak pernah menggandakan baris luar.

Jadi untuk semakan kewujudan semata-mata, EXISTS lebih kemas daripada JOIN ... DISTINCT. Gunakan cantuman apabila anda benar-benar memerlukan lajur daripada jadual yang satu lagi.

SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.id;

Pengindeksan Menentukan Kejayaan

Jawapan tentang prestasi tidak lengkap tanpa indeks. EXISTS berkorelasi menjalankan carian dalam bagi setiap baris luar, jadi indeks pada lajur berkorelasi — dalam kes ini orders(customer_id) — yang menjadikannya pantas.

Menyebut "Saya akan mengindeks lajur cantuman yang digunakan oleh subkueri untuk berkorelasi" menukarkan jawapan daripada buku teks kepada jawapan praktikal yang dihormati oleh penemuduga.

CREATE INDEX idx_orders_customer_id
  ON orders (customer_id);

Petikan Temu Duga

Katakan: "EXISTS ialah ujian nilai benar atau palsu berkorelasi yang menggunakan pintasan awal pada baris pertama yang sepadan, manakala IN menyemak keahlian dalam senarai nilai. Bagi semakan positif, pengoptimum moden sering menghasilkan pelan cantuman separa yang sama. Perbezaan sebenar ialah NOT EXISTS berbanding NOT IN: NOT EXISTS selamat terhadap NULL, jadi saya lebih menyukainya untuk cantuman anti — dan saya memastikan lajur berkorelasi mempunyai indeks."

Semakan Pantas

Inti perbincangan EXISTS berbanding IN.

Imbas Kembali

EXISTS berbanding IN, kini jelas:

  • EXISTS ialah nilai benar atau palsu berkorelasi yang menggunakan pintasan awal pada baris pertama yang sepadan; senarai pemilihan di dalamnya tidak penting.
  • IN menyemak keahlian dalam set nilai dan sangat sesuai untuk senarai kecil, tanpa pendua serta tidak berkorelasi.
  • Bagi semakan positif, pengoptimum moden sering memilih pelan cantuman separa yang sama.
  • Utamakan NOT EXISTS berbanding NOT IN untuk cantuman anti — ia selamat terhadap NULL. Indekskan lajur berkorelasi.

Itulah penutup kursus Pendalaman Subkueri.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “Prestasi EXISTS berbanding IN” percuma?

Ya — teks penuh “Prestasi EXISTS berbanding IN” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Prestasi EXISTS berbanding IN”?

Bila EXISTS berhenti lebih awal dan mengatasi IN, iaitu soalan lazim untuk saringan peringkat kanan Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Prestasi EXISTS berbanding IN” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Subpertanyaan Skalar dalam SELECT dan WHERE
  2. Subpertanyaan dalam Klausa FROM (Jadual Terbitan)
  3. Subpertanyaan IN, ANY dan ALL
  4. Prestasi EXISTS berbanding IN
← Kembali ke Persediaan Temu Duga Pengaturcaraan