0Pricing
SQL Academy · Pelajaran

Anti-Join dan Semi-Join (NOT EXISTS)

Temukan “baris di A yang tidak memiliki pasangan di B” (anti-join) dan “baris di A yang memiliki setidaknya satu pasangan di B” (semi-join) menggunakan EXISTS/NOT EXISTS.

Anti-Join dan Semi-Join (NOT EXISTS) adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 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 Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Semi-Join: "Memiliki Setidaknya Satu Kecocokan"

Kembalikan baris dari A yang memiliki setidaknya satu baris yang cocok di B — tetapi hanya kolom milik A. SQL mengimplementasikan semi-join melalui EXISTS atau IN.

Semi-Join EXISTS

Pengguna yang telah membuat setidaknya satu pesanan:

SELECT u.* FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);

Semi-Join IN

Hasilnya sama, gayanya berbeda:

SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders);

Mengapa EXISTS Sering Lebih Unggul

EXISTS berhenti lebih awal: berhenti pada kecocokan pertama untuk setiap baris luar. IN mungkin mewujudkan seluruh himpunan bagian dalam. Perencana modern sering mengoptimalkannya menjadi rencana yang sama, tetapi EXISTS adalah pilihan yang lebih aman untuk himpunan bagian dalam yang sangat besar.

Anti-Join: "Tidak Memiliki Kecocokan"

Pengguna yang belum pernah membuat pesanan — tiga bentuk idiomatis:

-- NOT EXISTS (preferred):
SELECT u.* FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);

-- LEFT JOIN ... IS NULL:
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;

-- NOT IN (risky with NULLs):
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM orders);

Mengapa NOT IN Berisiko

Jika subkueri bagian dalam berisi NULL, NOT IN mengembalikan NULL — dan WHERE menghapus baris yang predikatnya NULL. Hasilnya: nol baris. NOT EXISTS tidak memiliki masalah ini.

Optimasi Perencana

PostgreSQL modern mengenali EXISTS dan NOT EXISTS sebagai pola semi-join/anti-join dan mungkin mengeksekusinya dengan hash join:

EXPLAIN ANALYZE
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
-- → Hash Anti Join

Anti-Join Multi-Kolom

Gunakan kunci komposit:

SELECT * FROM order_items oi
WHERE NOT EXISTS (
  SELECT 1 FROM shipments s
  WHERE s.order_id = oi.order_id
    AND s.line_no  = oi.line_no
);

Semi-Join dengan EXISTS + Predikat Tambahan

Tambahkan penyaring ke subkueri bagian dalam:

SELECT u.* FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o
  WHERE o.user_id = u.id
    AND o.status = 'paid'
    AND o.created_at >= NOW() - INTERVAL '30 days'
);

Indeks pada Kolom Korelasi

Untuk EXISTS dan NOT EXISTS, subkueri bagian dalam menyaring berdasarkan kunci baris luar. Tanpa indeks pada kunci tersebut, Anda mendapatkan pemindaian untuk setiap baris luar:

CREATE INDEX orders_user_id_idx ON orders(user_id);

Kapan Menggunakan LEFT JOIN ... IS NULL

Untuk dasbor yang juga memerlukan kolom dari sisi yang tidak cocok, gaya LEFT JOIN cocok digunakan. Untuk semantik anti-join murni, NOT EXISTS lebih jelas.

Di Luar SQL: Filter Bloom

Untuk anti-join yang sangat besar, penyaringan awal dengan filter bloom dapat membantu. PostgreSQL mendukung indeks bloom melalui ekstensi bloom.

Ringkasan

Semi-join = "memiliki kecocokan"; anti-join = "tidak memiliki kecocokan".

  • EXISTS untuk semi-join
  • NOT EXISTS untuk anti-join (aman terhadap NULL)
  • Buat indeks pada kolom korelasi
  • Hindari NOT IN kecuali bagian dalam tidak dapat berisi NULL

Pemeriksaan Singkat

Anda menginginkan pengguna yang belum pernah membuat pesanan. SQL mana yang paling aman dan paling idiomatis?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Anti-Join dan Semi-Join (NOT EXISTS)” gratis?

Ya — teks lengkap “Anti-Join dan Semi-Join (NOT EXISTS)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Anti-Join dan Semi-Join (NOT EXISTS)”?

Temukan “baris di A yang tidak memiliki pasangan di B” (anti-join) dan “baris di A yang memiliki setidaknya satu pasangan di B” (semi-join) menggunakan EXISTS/NOT EXISTS. Kamu berlatih SQL Academy 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 Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy 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 3 dari 4.

Berapa lama pelajaran “Anti-Join dan Semi-Join (NOT EXISTS)” 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 Academy ini?

Ya. Setiap pelajaran SQL Academy 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. CROSS JOIN dan Hasil Kali Kartesius
  2. Lateral Join (LATERAL JOIN)
  3. Anti-Join dan Semi-Join (NOT EXISTS)
  4. Penyetelan Kinerja Join Multi-Tabel
← Kembali ke SQL Academy