Persediaan Temu Duga Pengaturcaraan · Pelajaran

Meniru Operasi Set Dengan Cantuman

Tulis semula EXCEPT dan INTERSECT dalam dialek yang tidak menyokongnya

Pelajaran 4 daripada 413 langkah

Meniru Operasi Set Dengan Cantuman 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.

Mengapa Meniru Operasi Set

Tidak semua pangkalan data menyokong INTERSECT dan EXCEPT. Versi MySQL yang lebih lama, misalnya, langsung tidak menyokongnya. Penemuduga menguji sama ada anda boleh menghasilkan semula logik set menggunakan cantuman dan subkueri apabila pengendali itu tidak tersedia.

Mengetahui kedua-dua pengendali set dan padanan cantumannya membuktikan bahawa anda memahami perkara yang sebenarnya dikira oleh pengendali tersebut.

INTERSECT sebagai INNER JOIN

INTERSECT mencari baris yang sepunya dalam kedua-dua set. Padanan cantumannya ialah INNER JOIN pada semua lajur yang dibandingkan, ditambah dengan DISTINCT untuk meniru tingkah laku nyahpenduaannya.

Setiap lajur dalam perbandingan menjadi sebahagian daripada predikat cantuman.

-- A INTERSECT B emulated:
SELECT DISTINCT a.customer_id
FROM orders_2023 a
JOIN orders_2024 b
  ON a.customer_id = b.customer_id;

Mengapa DISTINCT Diperlukan untuk INTERSECT

INNER JOIN biasa boleh menyebabkan pengembangan baris: jika sesuatu nilai muncul berulang kali pada mana-mana sisi, cantuman akan menggandakan baris. INTERSECT standard mengembalikan setiap baris sepunya sekali sahaja, jadi anda menambah DISTINCT untuk menggabungkan pendua yang diperkenalkan oleh cantuman.

Melupakan DISTINCT di sini ialah kesilapan lazim dalam temu duga.

-- without DISTINCT, a customer with 3 orders in each year
-- would appear 9 times from the join

EXCEPT sebagai LEFT JOIN / IS NULL

EXCEPT (A tetapi bukan B) ialah cantuman anti. Bentuk yang serasi merentas sistem ialah LEFT JOIN daripada A kepada B pada semua lajur, dengan hanya mengekalkan baris yang bahagian B-nya ialah NULL (tiada padanan), kemudian DISTINCT.

Corak LEFT JOIN / IS NULL ini ialah antara helah yang paling kerap digunakan semula dalam temu duga SQL.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
LEFT JOIN orders_2024 b
  ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL;

EXCEPT dengan NOT EXISTS

Satu lagi bentuk EXCEPT yang serasi merentas sistem menggunakan NOT EXISTS. Maksudnya ialah "kekalkan setiap baris A yang tiada baris B sepadan" dan ia mengendalikan NULL dengan kukuh.

Ramai jurutera lebih mengutamakan NOT EXISTS kerana tujuannya jelas dan ia mengelakkan perangkap NOT IN + NULL.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE NOT EXISTS (
  SELECT 1 FROM orders_2024 b
  WHERE b.customer_id = a.customer_id
);

INTERSECT dengan EXISTS

Secara simetri, INTERSECT boleh ditulis menggunakan EXISTS: kekalkan setiap baris A unik yang mempunyai baris B sepadan.

EXISTS berhenti selepas padanan pertama, jadi ia boleh menjadi cekap dan mengelakkan penggandaan hasil cantuman, malah kadangkala menghapuskan keperluan untuk DISTINCT pada bahagian cantuman.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE EXISTS (
  SELECT 1 FROM orders_2024 b
  WHERE b.customer_id = a.customer_id
);

Perangkap NULL bagi NOT IN

Peniruan EXCEPT yang kelihatan menarik ialah NOT IN, tetapi ia berbahaya: jika subpertanyaan mengembalikan walau satu NULL, NOT IN tidak mengembalikan sebarang baris kerana perbandingan itu menjadi UNKNOWN.

Ini ialah perangkap yang kerap diuji. Utamakan NOT EXISTS atau LEFT JOIN / IS NULL, yang selamat terhadap NULL.

-- RISKY if orders_2024.customer_id can be NULL:
SELECT DISTINCT customer_id FROM orders_2023
WHERE customer_id NOT IN (
  SELECT customer_id FROM orders_2024
);

Pemadanan pada Berbilang Lajur

Apabila perbandingan set meliputi beberapa lajur, setiap lajur digunakan dalam predikat cantuman. Untuk cantuman anti, anda juga mesti mengendalikan kemungkinan NULL dalam lajur tersebut, dan di sinilah NOT EXISTS terserlah.

Nyatakan setiap lajur secara jelas dalam klausa ON; jika satu tertinggal, maksud "baris sama" berubah tanpa disedari.

SELECT DISTINCT a.id, a.city
FROM a
LEFT JOIN b
  ON a.id = b.id AND a.city = b.city
WHERE b.id IS NULL;

Meniru UNION Tanpa Operator

UNION ALL hanyalah penggabungan, yang disokong secara terus oleh setiap dialek. Untuk meniru UNION berbeza apabila diperlukan, gabungkan menggunakan UNION ALL dalam subkueri dan bungkus dengan SELECT DISTINCT atau GROUP BY untuk semua lajur.

Ini menunjukkan UNION hanyalah UNION ALL ditambah langkah membuang pendua.

SELECT DISTINCT * FROM (
  SELECT city FROM a
  UNION ALL
  SELECT city FROM b
) combined;

Memilih Peniruan yang Tepat

Panduan membuat keputusan:

  • INTERSECT → EXISTS atau INNER JOIN + DISTINCT.
  • EXCEPT → NOT EXISTS atau LEFT JOIN / IS NULL.
  • Elakkan NOT IN apabila NULL berkemungkinan wujud.
  • UNION → UNION ALL yang dibungkus dalam DISTINCT.

EXISTS / NOT EXISTS ialah yang paling serasi merentas sistem dan selamat terhadap NULL, menjadikannya jawapan temu duga yang paling selamat.

Merangkum Kesemuanya

Keupayaan menterjemahkan operator set kepada cantuman menunjukkan bahawa anda memahaminya sebagai logik set, bukan sekadar sintaks. Cantuman anti (LEFT JOIN / IS NULL atau NOT EXISTS) ialah corak yang paling bernilai: ia muncul dalam peniruan EXCEPT, pencarian rekod tanpa pasangan dan soalan tentang rekod yang tiada.

Utamakan NOT EXISTS demi ketepatan, kemudian sebutkan bentuk cantuman untuk perbincangan prestasi.

Semakan Pantas

Pangkalan data anda tidak menyokong EXCEPT. Anda memerlukan customer_ids dalam orders_2023 yang tiada dalam orders_2024, dan lajur itu boleh mengandungi NULL.

Imbas Kembali

Pengajaran utama:

  • INTERSECT → INNER JOIN + DISTINCT, atau EXISTS.
  • EXCEPT → LEFT JOIN / IS NULL, atau NOT EXISTS (cantuman anti).
  • Tambahkan DISTINCT untuk menyamai tingkah laku penyahgandaan operator set dan mengawal penggandaan hasil cantuman.
  • Elakkan NOT IN apabila NULL mungkin wujud; utamakan NOT EXISTS.
  • UNION = UNION ALL yang dibungkus dalam DISTINCT.
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 “Meniru Operasi Set Dengan Cantuman” percuma?

Ya — teks penuh “Meniru Operasi Set Dengan Cantuman” 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 “Meniru Operasi Set Dengan Cantuman”?

Tulis semula EXCEPT dan INTERSECT dalam dialek yang tidak menyokongnya 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 “Meniru Operasi Set Dengan Cantuman” 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. UNION berbanding UNION ALL
  2. Keserasian Bilangan dan Jenis Lajur
  3. INTERSECT dan EXCEPT untuk Perbandingan
  4. Meniru Operasi Set Dengan Cantuman
← Kembali ke Persediaan Temu Duga Pengaturcaraan