SQL Academy · Pelajaran

Cantuman Anti dan Cantuman Separa (NOT EXISTS)

Cari 'baris dalam A yang tiada padanan dalam B' (cantuman anti) dan 'baris dalam A yang mempunyai sekurang-kurangnya satu padanan dalam B' (cantuman separa) menggunakan EXISTS/NOT EXISTS.

Pelajaran 3 daripada 414 langkah

Cantuman Anti dan Cantuman Separa (NOT EXISTS) ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 3 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 SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Cantuman Separa: “Mempunyai Sekurang-kurangnya Satu Padanan”

Kembalikan baris daripada A yang mempunyai sekurang-kurangnya satu baris sepadan dalam B — tetapi hanya lajur A. SQL melaksanakan cantuman separa melalui EXISTS atau IN.

Cantuman Separa EXISTS

Pengguna yang telah membuat sekurang-kurangnya satu pesanan:

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

Cantuman Separa IN

Hasil yang sama, gaya yang berbeza:

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

Mengapa EXISTS Selalunya Lebih Baik

EXISTS berhenti lebih awal: ia berhenti pada padanan pertama bagi setiap baris luaran. IN mungkin mewujudkan keseluruhan set dalaman. Perancang moden sering mengoptimumkan kedua-duanya kepada pelan yang sama, tetapi EXISTS ialah pilihan yang lebih selamat untuk set dalaman yang sangat besar.

Cantuman Anti: “Tiada Padanan”

Pengguna yang TIDAK PERNAH membuat pesanan — tiga bentuk idiomatik:

-- 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 subpertanyaan dalaman mengandungi NULL, NOT IN mengembalikan NULL — dan WHERE membuang baris apabila predikatnya NULL. Hasilnya: sifar baris. NOT EXISTS tidak menghadapi masalah ini.

Pengoptimuman Perancang

PostgreSQL moden mengenali EXISTS dan NOT EXISTS sebagai corak cantuman separa/anti dan mungkin melaksanakannya dengan cantuman cincang:

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

Cantuman Anti Berbilang Lajur

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
);

Cantuman Separa dengan EXISTS + Predikat Tambahan

Tambahkan penapis pada subpertanyaan dalaman:

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'
);

Indekskan Lajur Korelasi

Untuk EXISTS dan NOT EXISTS, subpertanyaan dalaman menapis berdasarkan kunci baris luaran. Tanpa indeks pada kunci itu, anda mendapat imbasan bagi setiap baris luaran:

CREATE INDEX orders_user_id_idx ON orders(user_id);

Bila Menggunakan LEFT JOIN ... IS NULL

Untuk papan pemuka yang turut memerlukan lajur daripada bahagian yang tiada padanan, gaya LEFT JOIN sememangnya sesuai. Untuk semantik cantuman anti semata-mata, NOT EXISTS lebih jelas.

Di Luar SQL: Penapis Bloom

Untuk cantuman anti yang sangat besar, prapengisihan dengan penapis Bloom boleh membantu. PostgreSQL menyokong indeks bloom melalui sambungan bloom.

Ringkasan

Cantuman separa = “mempunyai padanan”; cantuman anti = “tiada padanan”.

  • EXISTS untuk cantuman separa
  • NOT EXISTS untuk cantuman anti (selamat terhadap NULL)
  • Indekskan lajur korelasi
  • Elakkan NOT IN melainkan bahagian dalaman tidak boleh mengandungi NULL

Semakan Pantas

Anda mahukan pengguna yang TIDAK PERNAH membuat pesanan. Apakah SQL yang paling selamat dan paling idiomatik?

Percuma untuk bermula

Pelajari SQL 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
46
Pelajaran
183

Soalan Lazim

Adakah pelajaran “Cantuman Anti dan Cantuman Separa (NOT EXISTS)” percuma?

Ya — teks penuh “Cantuman Anti dan Cantuman Separa (NOT EXISTS)” 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 SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Cantuman Anti dan Cantuman Separa (NOT EXISTS)”?

Cari 'baris dalam A yang tiada padanan dalam B' (cantuman anti) dan 'baris dalam A yang mempunyai sekurang-kurangnya satu padanan dalam B' (cantuman separa) menggunakan EXISTS/NOT EXISTS. Anda berlatih SQL Academy 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 SQL Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy 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 3 daripada 4.

Berapa lamakah pelajaran “Cantuman Anti dan Cantuman Separa (NOT EXISTS)” 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 SQL Academy ini?

Ya. Setiap pelajaran SQL Academy 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. Cantuman Silang dan Hasil Darab Cartesian
  2. Cantuman Lateral (LATERAL JOIN)
  3. Cantuman Anti dan Cantuman Separa (NOT EXISTS)
  4. Penalaan Prestasi Cantuman Berbilang Jadual
← Kembali ke SQL Academy