Persediaan Temu Duga Pengaturcaraan · Pelajaran

Perangkap WHERE pada Cantuman Luaran

Mengapa menapis lajur yang dicantumkan secara luaran dalam WHERE secara senyap menukarnya menjadi cantuman dalaman

Pelajaran 4 daripada 413 langkah

Perangkap WHERE pada Cantuman Luaran 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.

Perangkap yang Memerangkap Semua Orang

Ini ialah pepijat cantuman luar yang paling lazim sengaja disediakan oleh penemuduga: "Tunjukkan setiap pelanggan dan pesanan mereka dari tahun 2024, termasuk pelanggan tanpa pesanan 2024."

Calon menulis LEFT JOIN, kemudian menambah penapis tarikh dalam WHERE, lalu pelanggan tanpa pesanan 2024 hilang secara senyap. LEFT JOIN merosot secara senyap menjadi INNER JOIN. Memahami sebabnya menunjukkan pengalaman yang tinggi.

Pertanyaan yang Mengandungi Ralat

Berikut ialah kesilapannya. Ia kelihatan munasabah: kekalkan semua pelanggan, cantumkan pesanan mereka, kemudian tapis kepada tahun 2024.

Namun, pelanggan tanpa pesanan, atau tanpa pesanan pada tahun 2024, hilang daripada hasil. Keperluan untuk menyertakan mereka tidak dipenuhi.

-- BUG: drops customers with no 2024 order
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_date >= '2024-01-01';

Mengapa Ia Gagal

Ingat kembali urutan operasi: JOIN berlaku dahulu, lalu menghasilkan baris yang setiap lajur pesanannya bernilai NULL bagi pelanggan yang tidak sepadan. Kemudian WHERE berjalan.

Bagi pelanggan yang tidak sepadan, o.order_date bernilai NULL, jadi o.order_date >= '2024-01-01' dinilai sebagai UNKNOWN, bukan benar. WHERE hanya mengekalkan baris yang bernilai benar, jadi baris NULL ditapis keluar, iaitu tepat baris yang cuba dikekalkan oleh LEFT JOIN.

NULL Menewaskan Penapis

Sebarang perbandingan dengan NULL menghasilkan UNKNOWN: NULL >= '2024-01-01' ialah UNKNOWN, NULL = 5 ialah UNKNOWN, malah NULL <> 5 juga ialah UNKNOWN.

Oleh sebab WHERE hanya meluluskan baris yang dinilai sebagai TRUE, setiap baris tanpa padanan yang dikekalkan akan dibuang. Tujuan keseluruhan cantuman luar dibatalkan oleh satu predikat WHERE pada lajur jadual kanan.

Pembetulan: Tapis dalam ON

Pindahkan penapis ke klausa ON. Di situ, penapis menjadi sebahagian daripada syarat padanan, yang digunakan sebelum baris dikekalkan, jadi pelanggan yang tidak sepadan masih kekal dengan NULL.

-- CORRECT: filter lives in ON
SELECT c.name, o.id, o.order_date
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.order_date >= '2024-01-01';
-- customers with no 2024 order: kept, NULL order

ON berbanding WHERE dalam Satu Ayat

Peraturan yang boleh anda nyatakan dalam temu duga:

Bagi jadual yang dikekalkan (jadual luar), syarat pada jadual lain hendaklah diletakkan dalam ON; syarat pada jadual yang dikekalkan itu sendiri hendaklah diletakkan dalam WHERE.

  • ON menentukan perkara yang dianggap sebagai padanan (berjalan semasa cantuman).
  • WHERE menapis baris akhir (berjalan selepas cantuman dan membuang baris yang mengandungi NULL).

Hasil Bersebelahan

Data yang sama, dua peletakan, jawapan yang berbeza. Katakan Carol tidak mempunyai pesanan pada tahun 2024.

  • Penapis dalam WHERE: Carol hilang. Secara berkesan, INNER JOIN.
  • Penapis dalam ON: Carol muncul sekali dengan lajur pesanan bernilai NULL; keperluan dipenuhi.

Perbezaan hasil inilah keseluruhan tujuan perangkap tersebut.

-- ON version output
-- Alice | 50 | 2024-03-01
-- Bob   | 20 | 2024-05-02
-- Carol | NULL | NULL   <-- preserved

Apabila WHERE Sebenarnya Betul

Tidak semua penggunaan WHERE pada cantuman luar ialah pepijat. Menapis jadual yang dikekalkan adalah betul kerana ia tidak melibatkan NULL daripada cantuman.

Dan cantuman anti daripada pelajaran sebelumnya sengaja menggunakan WHERE o.id IS NULL untuk memanfaatkan tingkah laku ini. Kemahirannya ialah mengetahui kes yang sedang anda hadapi.

-- Fine: filtering the preserved (left) table
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE c.country = 'US';

Petunjuk untuk Mengesan

Semasa menyemak cantuman luar, imbas klausa WHERE untuk mencari predikat pada jadual yang tidak dikekalkan (selain ujian cantuman anti IS NULL).

Jika anda melihat o.someColumn = ... atau ujian julat/kesamaan pada sisi luar dalam WHERE, syak bahawa perangkap ini berlaku. Tanya: "Adakah ini menukar LEFT JOIN saya menjadi INNER JOIN?" Biasanya, ya.

Syarat Berbilang

Anda boleh menggabungkan kedua-dua peletakan. Syarat padanan pada jadual kanan diletakkan dalam ON; penapis selepas cantuman yang sebenar pada jadual kiri diletakkan dalam WHERE. Kedua-duanya boleh wujud bersama dengan kemas.

SELECT c.name, o.id, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
  AND o.amount > 100          -- match condition
WHERE c.signup_year = 2023;    -- preserved-table filter

Menerangkannya dengan Kata-kata

Dalam temu duga, huraikan mekanismenya, bukan hanya pembetulannya:

"Cantuman berjalan dahulu dan mengisi lajur kanan yang tidak sepadan dengan NULL. Predikat WHERE pada lajur tersebut dinilai sebagai UNKNOWN bagi baris NULL, dan WHERE membuang baris yang tidak bernilai benar, jadi cantuman luar runtuh menjadi INNER JOIN. Meletakkan predikat dalam ON mengekalkannya sebagai syarat padanan dan mengekalkan baris yang tidak sepadan." Penjelasan itu sentiasa berkesan.

Semakan Pantas

Anda mesti menyenaraikan semua pelanggan dan hanya pesanan 2024 mereka, sambil mengekalkan pelanggan yang tiada pesanan.

Rumusan

Menapis lajur jadual yang tidak dikekalkan dalam WHERE secara senyap-senyap menukar cantuman luar menjadi cantuman dalam, kerana NULL daripada baris yang tidak sepadan gagal memenuhi predikat (UNKNOWN) dan WHERE membuangnya.

  • Syarat padanan pada jadual luar diletakkan dalam ON.
  • Penapis pada jadual yang dikekalkan diletakkan dalam WHERE.
  • IS NULL dalam WHERE ialah cantuman anti yang disengajakan, bukan perangkap.
  • Terangkan urutan operasi untuk membuktikan bahawa anda memahaminya.
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 “Perangkap WHERE pada Cantuman Luaran” percuma?

Ya — teks penuh “Perangkap WHERE pada Cantuman Luaran” 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 “Perangkap WHERE pada Cantuman Luaran”?

Mengapa menapis lajur yang dicantumkan secara luaran dalam WHERE secara senyap menukarnya menjadi cantuman dalaman 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 “Perangkap WHERE pada Cantuman Luaran” 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. LEFT JOIN dan Mengekalkan Baris Tanpa Padanan
  2. Semantik RIGHT dan FULL OUTER JOIN
  3. Mencari Baris Tanpa Padanan (Cantuman Anti)
  4. Perangkap WHERE pada Cantuman Luaran
← Kembali ke Persediaan Temu Duga Pengaturcaraan