0Pricing
SQL Interview Prep · Pelajaran

Meniru Operasi Himpunan dengan JOIN

Tulis ulang EXCEPT dan INTERSECT dalam dialek yang tidak mendukungnya.

Meniru Operasi Himpunan dengan JOIN adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Mengapa Meniru Operasi Himpunan

Tidak semua basis data mendukung INTERSECT dan EXCEPT. Versi MySQL yang lebih lama, misalnya, sama sekali tidak memilikinya. Pewawancara menguji apakah Anda dapat mereproduksi logika himpunan dengan JOIN dan subkueri ketika operator tersebut tidak tersedia.

Mengetahui operator himpunan beserta padanan JOIN-nya membuktikan bahwa Anda memahami perhitungan yang sebenarnya dilakukan operator tersebut.

INTERSECT sebagai INNER JOIN

INTERSECT menemukan baris yang sama-sama ada di kedua himpunan. Padanan JOIN-nya adalah INNER JOIN pada semua kolom yang dibandingkan, ditambah DISTINCT agar sesuai dengan perilaku deduplikasi.

Setiap kolom dalam perbandingan menjadi bagian dari predikat JOIN.

-- 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 dapat menghasilkan terlalu banyak pasangan: jika suatu nilai muncul beberapa kali di salah satu sisi, JOIN akan melipatgandakan baris. INTERSECT standar mengembalikan setiap baris yang sama satu kali, jadi Anda perlu menambahkan DISTINCT untuk menghapus duplikat yang diperkenalkan oleh JOIN.

Lupa menambahkan DISTINCT di sini adalah kesalahan umum dalam wawancara.

-- 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) adalah anti-penggabungan. Bentuk portabelnya adalah LEFT JOIN dari A ke B pada semua kolom, dengan hanya mempertahankan baris ketika sisi B bernilai NULL (tidak ada kecocokan), lalu menerapkan DISTINCT.

Pola LEFT JOIN / IS NULL ini merupakan salah satu trik yang paling sering digunakan kembali dalam wawancara 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

EXCEPT yang sama-sama portabel dapat ditulis menggunakan NOT EXISTS. Cara membacanya adalah "pertahankan setiap baris A yang tidak memiliki baris B yang cocok" dan cara ini menangani NULL dengan andal.

Banyak insinyur lebih memilih NOT EXISTS karena maksudnya jelas dan menghindari jebakan 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 simetris, INTERSECT dapat ditulis menggunakan EXISTS: pertahankan setiap baris A unik yang memiliki baris B yang cocok.

EXISTS berhenti setelah menemukan kecocokan pertama, sehingga dapat efisien dan menghindari perluasan hasil penggabungan; kadang ini menghilangkan kebutuhan akan DISTINCT pada sisi penggabungan.

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

Jebakan NULL pada NOT IN

Peniruan EXCEPT yang menggoda adalah NOT IN, tetapi ini berbahaya: jika subkueri mengembalikan NULL apa pun, NOT IN tidak menghasilkan baris sama sekali karena perbandingannya menjadi UNKNOWN.

Ini adalah jebakan yang sangat sering diujikan. Utamakan NOT EXISTS atau LEFT JOIN / IS NULL, yang aman 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
);

Mencocokkan Beberapa Kolom

Ketika perbandingan himpunan mencakup beberapa kolom, setiap kolom harus digunakan dalam predikat penggabungan. Untuk anti-penggabungan, Anda juga harus menangani kemungkinan adanya NULL pada kolom-kolom tersebut; di sinilah NOT EXISTS sangat unggul.

Tuliskan setiap kolom dalam klausa ON; melewatkan satu kolom diam-diam mengubah makna "baris yang sama".

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 berurutan, yang didukung langsung oleh setiap dialek. Untuk meniru UNION unik bila diperlukan, lakukan penggabungan dengan UNION ALL di dalam subkueri lalu bungkus dengan SELECT DISTINCT atau GROUP BY untuk semua kolom.

Ini menunjukkan bahwa UNION hanyalah UNION ALL ditambah langkah deduplikasi.

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

Memilih Peniruan yang Tepat

Panduan keputusan:

  • INTERSECT → EXISTS atau INNER JOIN + DISTINCT.
  • EXCEPT → NOT EXISTS atau LEFT JOIN / IS NULL.
  • Hindari NOT IN jika NULL mungkin ada.
  • UNION → UNION ALL yang dibungkus dalam DISTINCT.

EXISTS / NOT EXISTS adalah yang paling portabel dan aman terhadap NULL, sehingga menjadi jawaban wawancara yang paling aman.

Merangkainya

Kemampuan menerjemahkan operator himpunan menjadi penggabungan menunjukkan bahwa Anda memahaminya sebagai logika himpunan, bukan sekadar sintaks. Anti-penggabungan (LEFT JOIN / IS NULL atau NOT EXISTS) adalah pola yang paling bernilai: pola ini muncul dalam peniruan EXCEPT, pencarian data tanpa pasangan, dan berbagai pertanyaan tentang catatan yang hilang.

Dahulukan NOT EXISTS demi ketepatan, lalu sebutkan bentuk penggabungan saat membahas kinerja.

Pemeriksaan Singkat

Basis data Anda tidak mendukung EXCEPT. Anda memerlukan ID pelanggan pada pesanan tahun 2023 yang tidak terdapat pada pesanan tahun 2024, dan kolom tersebut dapat berisi NULL.

Ringkasan

Pokok penting:

  • INTERSECT → INNER JOIN + DISTINCT, atau EXISTS.
  • EXCEPT → LEFT JOIN / IS NULL, atau NOT EXISTS (anti-penggabungan).
  • Tambahkan DISTINCT untuk menyamai perilaku deduplikasi operator himpunan dan mengendalikan perluasan hasil penggabungan.
  • Hindari NOT IN jika NULL mungkin ada; utamakan NOT EXISTS.
  • UNION = UNION ALL yang dibungkus dalam DISTINCT.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Meniru Operasi Himpunan dengan JOIN” gratis?

Ya — teks lengkap “Meniru Operasi Himpunan dengan JOIN” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Meniru Operasi Himpunan dengan JOIN”?

Tulis ulang EXCEPT dan INTERSECT dalam dialek yang tidak mendukungnya. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?

Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Meniru Operasi Himpunan dengan JOIN” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?

Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. UNION vs UNION ALL
  2. Jumlah dan Kompatibilitas Tipe Kolom
  3. INTERSECT dan EXCEPT untuk Perbandingan
  4. Meniru Operasi Himpunan dengan JOIN
← Kembali ke SQL Interview Prep