Persediaan Temu Duga SQL · Pelajaran

ON berbanding WHERE dalam Cantuman

Bila predikat patut diletakkan dalam ON berbanding WHERE dan sebabnya penting untuk keputusan

Pelajaran 2 daripada 413 langkah

ON berbanding WHERE dalam Cantuman ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 2 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 SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Predikat Boleh Berada di Dua Tempat

Selepas anda boleh menulis INNER JOIN, soalan temu duga seterusnya lebih mencabar: adakah syarat ini patut berada dalam ON atau WHERE?

Untuk INNER JOIN, jawapannya selalunya "hasilnya tidak berubah." Namun, sebaik sahaja anda beralih kepada cantuman luaran, pilihan itu mengubah hasil sepenuhnya. Penemuduga bertanya perkara ini kerana calon yang kurang berpengalaman cenderung meletakkan semuanya dalam WHERE mengikut kebiasaan.

Pelajaran ini menjelaskan peraturannya dengan jelas.

Peranan ON

Klausa ON mentakrifkan cara baris dipadankan. Ia dilaksanakan ketika cantuman dibina, lalu menentukan baris daripada jadual kiri dipadankan dengan baris yang mana daripada jadual kanan.

Anggap ON sebagai jawapan kepada soalan: "adakah kedua-dua baris ini sepatutnya dipasangkan?"

SELECT c.name, o.amount
FROM customers c
JOIN orders o
  ON o.customer_id = c.id;   -- pairing rule

Peranan WHERE

Klausa WHERE dilaksanakan selepas cantuman menghasilkan baris gabungan. Ia menapis set hasil itu dan membuang baris yang gagal dalam ujian.

Anggap WHERE sebagai jawapan kepada soalan: "sekarang setelah saya mencantumkan baris, baris yang mana hendak saya kekalkan?"

SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;   -- filter after pairing

Dalam INNER JOIN, Kedua-duanya Selalunya Sama

Untuk INNER JOIN, penapis tambahan memberikan hasil yang sama sama ada diletakkan dalam ON atau WHERE. Kedua-dua pertanyaan di bawah hanya mengembalikan pesanan Ada bernilai $50 dan pesanan Bob bernilai $99.

Oleh sebab baris yang tidak sepadan telah dibuang oleh cantuman dalaman, mengalihkan predikat tidak mengubah baris yang kekal.

-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;

-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;

Mengapa Gaya Masih Mengutamakan ON untuk Kunci Cantuman

Walaupun hasilnya sama, amalan biasa menetapkan: letakkan syarat hubungan cantuman dalam ON dan penapis perniagaan dalam WHERE.

  • ON: o.customer_id = c.id (cara jadual berkaitan)
  • WHERE: o.amount > 30 (hasil yang anda kehendaki)

Pemisahan ini menjadikan maksudnya jelas kepada pembaca seterusnya dan penemuduga yang menilai gaya anda.

Perkara Ini Benar-benar Penting: Cantuman Luaran

Perbezaan ini menjadi penentu dengan LEFT JOIN, yang mengekalkan setiap baris kiri walaupun tiada baris kanan yang sepadan. Berikut gambaran ringkas menggunakan pelanggan dan pesanan, dengan Cleo yang tidak mempunyai pesanan.

LEFT JOIN mengekalkan Cleo dengan lajur pesanan bernilai NULL. Sekarang lihat kesan ON berbanding WHERE terhadapnya.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)

Penapis dalam ON: Baris Dikekalkan

Letakkan syarat amount > 30 dalam ON bagi LEFT JOIN dan syarat itu hanya mempengaruhi baris kanan yang dilampirkan. Baris kiri yang tidak sepadan tetap dikekalkan, hanya dengan NULL.

Cleo kekal. Mana-mana pesanan yang gagal dalam ujian itu tidak dilampirkan, lalu meninggalkan NULL.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL  (3 rows, Cleo kept)

Penapis dalam WHERE: Cantuman Luaran Runtuh

Alihkan syarat yang sama ke WHERE dan anda menapis hasil cantuman. Baris Cleo mempunyai amount = NULL, dan NULL > 30 bukan benar, jadi barisnya dibuang.

LEFT JOIN secara senyap bertindak seperti INNER JOIN. Ini ialah perangkap cantuman paling terkenal dalam temu duga.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99  (Cleo GONE -> back to inner-join behavior)

Peraturan untuk Diingati

Nyatakan perkara ini dengan jelas dalam temu duga:

  • Syarat dalam ON menentukan sama ada baris kanan dilampirkan; baris kiri dikekalkan.
  • Syarat dalam WHERE menapis baris akhir dan boleh menghapuskan baris kiri yang dikekalkan apabila syarat itu menyentuh lajur yang mungkin bernilai NULL.

Jadi bagi cantuman luaran: letakkan predikat pada jadual pilihan dalam ON melainkan anda memang mahu membuang baris yang tidak sepadan.

Penggunaan WHERE dengan NULL yang Sah

Terdapat satu keadaan apabila menapis lajur daripada cantuman luaran dalam WHERE memang tepat: cantuman anti. Ujian IS NULL mencari baris kiri yang tiada padanan.

Di sini WHERE sengaja hanya mengekalkan baris yang tidak sepadan, lalu mengembalikan pelanggan yang mempunyai sifar pesanan. Mekanisme sama, tujuan berlawanan.

SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;   -- customers with no orders -> Cleo

Ujian Mental Ringkas

Sebelum kuiz, gunakan senarai semak ini apabila anda melihat syarat cantuman:

  • Adakah ia kunci cantuman yang menghubungkan jadual? -> ON.
  • Adakah ia penapis pada jadual wajib? -> WHERE atau ON, kedua-duanya boleh.
  • Adakah ia penapis pada jadual pilihan (luaran) dan anda mahu baris yang tidak sepadan dikekalkan? -> ON.
  • Adakah anda mahu mencari ketidakpadanan? -> WHERE ... IS NULL.

Semakan Ringkas

Gunakan peraturan ON berbanding WHERE pada cantuman luaran.

Ulang Kaji: ON berbanding WHERE

Perkara utama untuk dibawa ke temu duga:

  • ON mengawal pemadanan dan, bagi cantuman luaran, menentukan sama ada baris pilihan dilampirkan sambil mengekalkan sisi yang dikekalkan.
  • WHERE menapis hasil yang telah dicantumkan dan boleh membuang baris yang dikekalkan.
  • Dalam INNER JOIN, kedua-duanya sering boleh saling menggantikan; dalam cantuman luaran, kedua-duanya tidak setara.
  • Penapis pada jadual luaran diletakkan dalam ON melainkan anda memang mahukan cantuman anti dengan IS NULL dalam WHERE.
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
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “ON berbanding WHERE dalam Cantuman” percuma?

Ya — teks penuh “ON berbanding WHERE dalam Cantuman” 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 SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “ON berbanding WHERE dalam Cantuman”?

Bila predikat patut diletakkan dalam ON berbanding WHERE dan sebabnya penting untuk keputusan Anda berlatih Persediaan Temu Duga SQL 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 SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL 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 2 daripada 4.

Berapa lamakah pelajaran “ON berbanding WHERE dalam Cantuman” 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 SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL 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. Cara INNER JOIN Memadankan Baris
  2. ON berbanding WHERE dalam Cantuman
  3. Pengembangan Cantuman dan Penggandaan Baris
  4. Mencantumkan Tiga Jadual atau Lebih
← Kembali ke Persediaan Temu Duga SQL