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.
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 JoinCantuman 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?
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
- Cantuman Silang dan Hasil Darab Cartesian
- Cantuman Lateral (LATERAL JOIN)
- Cantuman Anti dan Cantuman Separa (NOT EXISTS)
- Penalaan Prestasi Cantuman Berbilang Jadual