Persediaan Temu Duga Pengaturcaraan · Pelajaran

LEFT JOIN dan Mengekalkan Baris Tanpa Padanan

Perkara yang dikekalkan oleh LEFT JOIN dan cara NULL muncul untuk baris tanpa padanan

Pelajaran 1 daripada 413 langkah

LEFT JOIN dan Mengekalkan Baris Tanpa Padanan ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 1 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.

Persediaan Temu Duga

Seorang penemu duga berkata: "Senaraikan setiap pelanggan dan pesanannya, termasuk pelanggan yang tidak pernah membuat pesanan." INNER JOIN menggugurkan pelanggan yang tiada pesanan, jadi ia tidak memenuhi keperluan ini. Tugas itu diselesaikan dengan LEFT JOIN.

LEFT JOIN mengekalkan setiap baris daripada jadual kiri (yang dinamakan dahulu), dan melampirkan baris yang sepadan daripada jadual kanan apabila ada. Pelajaran ini membina model mental tepat yang dijangkakan oleh penemu duga.

Jaminan LEFT JOIN

Janji utamanya: setiap baris daripada jadual kiri muncul dalam hasil sekurang-kurangnya sekali, sama ada sepadan atau tidak.

  • Jika baris kiri menemui padanan di sebelah kanan, anda mendapat satu baris hasil bagi setiap padanan.
  • Jika baris kiri tidak menemui padanan, anda masih mendapat satu baris hasil, dengan semua lajur jadual kanan ditetapkan kepada NULL.

Inilah sebabnya penemu duga memanggilnya cantuman luaran: baris yang berada di luar set padanan dikekalkan dan bukannya dibuang.

Dua Jadual

Sepanjang pelajaran ini, kita menggunakan dua jadual ringkas. customers mempunyai setiap pelanggan; orders merekodkan pembelian dan merujuk kepada pelanggan melalui customer_id.

Perhatikan bahawa pelanggan 3 (Carol) tidak mempunyai baris dalam orders. Pelanggan yang tiada padanan itulah yang mesti dikekalkan oleh LEFT JOIN.

-- customers
-- id | name
--  1 | Alice
--  2 | Bob
--  3 | Carol

-- orders
-- id | customer_id | amount
-- 10 |     1       |  50
-- 11 |     1       |  75
-- 12 |     2       |  20

Menulis LEFT JOIN

Sintaksnya menyerupai cantuman dalaman, dengan menukar INNER kepada LEFT (perkataan OUTER adalah pilihan: LEFT JOIN dan LEFT OUTER JOIN adalah serupa).

Jadual yang ditulis sebelum kata kunci itu ialah sisi kiri yang dikekalkan. Susunan penting: customers LEFT JOIN orders mengekalkan semua pelanggan, bukan semua pesanan.

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

Membaca Hasil

Berikut ialah hasil pertanyaan tersebut. Alice mempunyai dua padanan, jadi dia muncul dua kali. Bob mempunyai satu padanan. Carol tidak mempunyai sebarang padanan, jadi dia masih muncul dengan NULL dalam lajur amount.

Baris Carol tunggal dengan NULL itu ialah ciri khas LEFT JOIN. Penemu duga yang memerhatikan penaakulan anda secara lisan mahu mendengar: "baris kiri tanpa padanan kekal dengan NULL di sebelah kanan."

-- name  | amount
-- Alice |  50
-- Alice |  75
-- Bob   |  20
-- Carol | NULL   <-- preserved, no match

Dari Mana Datangnya NULL

NULL tidak disimpan di mana-mana. Pangkalan data menjanakannya kerana tiada baris daripada jadual kanan untuk membekalkan amount.

Setiap lajur yang diambil daripada jadual kanan menjadi NULL bagi baris kiri tanpa padanan: o.id, o.customer_id dan o.amount semuanya NULL dalam baris Carol. Hal ini penting kerana o.customer_id yang bernilai NULL bukan bermaksud pelanggan itu tiada pengecam; maksudnya tiada pesanan yang sepadan langsung.

Mengira Pesanan bagi Setiap Pelanggan

Soalan susulan yang biasa: "Berapa banyak pesanan yang dimiliki oleh setiap pelanggan, termasuk sifar?" LEFT JOIN bersama COUNT memberikan jawapan tepat, tetapi anda mesti mengira lajur jadual kanan, bukannya *.

COUNT(o.id) mengabaikan NULL, jadi Carol mendapat 0. COUNT(*) akan tersilap mengembalikan 1 untuk Carol kerana baris NULL yang dijana itu masih dikira sebagai satu baris.

SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob   | 1
-- Carol | 0

Perangkap COUNT(*) berbanding COUNT(lajur)

Ini ialah perangkap temu duga klasik. Selepas LEFT JOIN, baris kiri tanpa padanan wujud secara fizikal dalam hasil dengan lajur kanan bernilai NULL.

  • COUNT(*) mengira baris itu, lalu mengembalikan 1 untuk pelanggan yang tiada pesanan.
  • COUNT(o.id) melangkau NULL, lalu mengembalikan 0 dengan betul.

Sentiasa kira lajur yang bernilai NULL pada sisi tanpa padanan apabila anda memerlukan sifar sebenar.

-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Menjumlahkan dengan LEFT JOIN

Agregat selain COUNT bertindak dengan baik terhadap NULL yang dijana. SUM mengabaikan NULL, jadi pelanggan tanpa padanan menghasilkan NULL (bukan ralat).

Penemu duga sering mahukan sifar dan bukannya NULL untuk pelaporan. Balut agregat itu dalam COALESCE untuk menggantikan nilainya dengan nilai lalai.

SELECT c.name,
       COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob   |  20
-- Carol |   0

Jadual Kiri berbanding Jadual Kanan, Dijelaskan dengan Jelas

Apabila penemu duga bertanya "jadual manakah yang dikekalkan?", jawab dengan yakin: jadual di sebelah kiri kata kunci JOIN. Bacanya dari kiri ke kanan.

A LEFT JOIN B = kekalkan semua A. Untuk mengekalkan semua B pula, sama ada tukar kepada B LEFT JOIN A atau gunakan RIGHT JOIN. Kebanyakan pasukan memilih LEFT JOIN sahaja demi kebolehbacaan, dengan hanya menyusun semula jadual.

Senarai Semak Mental

Apabila anda melihat LEFT JOIN dalam temu duga, sebutkan senarai semak ini dengan lantang:

  • Sisi yang dikekalkan? Jadual kiri, semua baris dikekalkan.
  • Baris tanpa padanan? Muncul sekali dengan NULL daripada sebelah kanan.
  • Mengira? Gunakan COUNT(right_col) untuk mendapatkan sifar sebenar.
  • Menjumlahkan? Balut dalam COALESCE jika anda memerlukan 0, bukan NULL.

Menyebut senarai semak ini menunjukkan ketelitian pada tahap kanan.

Semakan Pantas

Uji intuisi LEFT JOIN anda tentang pengiraan.

Imbas Kembali

LEFT JOIN mengekalkan setiap baris jadual kiri. Baris kiri yang sepadan dipasangkan dengan padanan kanannya; baris kiri tanpa padanan kekal sekali dengan NULL dalam semua lajur jadual kanan.

  • Jadual kiri ialah jadual sebelum kata kunci JOIN.
  • NULL yang dijana menandakan baris tanpa padanan.
  • COUNT(right_col) memberikan sifar sebenar; COUNT(*) tidak.
  • COALESCE(SUM(...), 0) menukar jumlah NULL kepada sifar.

Inilah asas untuk mencari data yang hilang dan cantuman anti dalam pelajaran yang akan datang.

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 “LEFT JOIN dan Mengekalkan Baris Tanpa Padanan” percuma?

Ya — teks penuh “LEFT JOIN dan Mengekalkan Baris Tanpa Padanan” 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 “LEFT JOIN dan Mengekalkan Baris Tanpa Padanan”?

Perkara yang dikekalkan oleh LEFT JOIN dan cara NULL muncul untuk baris tanpa padanan 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 1 daripada 4.

Berapa lamakah pelajaran “LEFT JOIN dan Mengekalkan Baris Tanpa Padanan” 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