LEFT JOIN และการคงแถวที่ไม่ตรงกัน
LEFT JOIN คงแถวใดไว้ และ NULL ปรากฏอย่างไรในแถวที่ไม่ตรงกัน
LEFT JOIN และการคงแถวที่ไม่ตรงกัน เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
การตั้งโจทย์สัมภาษณ์
ผู้สัมภาษณ์กล่าวว่า: "แสดงลูกค้าทุกคนและคำสั่งซื้อของพวกเขา รวมถึงลูกค้าที่ไม่เคยสั่งซื้อเลย" INNER JOIN จะตัดลูกค้าที่ไม่มีคำสั่งซื้อออก จึงไม่เป็นไปตามข้อกำหนดนี้ งานนี้จึงต้องใช้ LEFT JOIN
LEFT JOIN จะคง ทุก แถวจากตารางด้านซ้าย (ตารางที่ระบุชื่อก่อน) ไว้ และเพิ่มแถวที่ตรงกันจากตารางด้านขวาเมื่อมีข้อมูล บทเรียนนี้จะสร้างแบบจำลองทางความคิดที่แม่นยำตามที่ผู้สัมภาษณ์คาดหวัง
สิ่งที่ LEFT JOIN รับประกัน
หลักประกันสำคัญคือ ทุกแถวจากตารางด้านซ้ายจะปรากฏในผลลัพธ์อย่างน้อยหนึ่งครั้ง ไม่ว่าจะตรงกับข้อมูลหรือไม่ก็ตาม
- หากแถวด้านซ้ายพบข้อมูลที่ตรงกันทางด้านขวา คุณจะได้แถวผลลัพธ์หนึ่งแถวต่อข้อมูลที่ตรงกันหนึ่งรายการ
- หากแถวด้านซ้าย ไม่พบข้อมูลที่ตรงกัน คุณยังจะได้แถวผลลัพธ์หนึ่งแถว โดยคอลัมน์ทั้งหมดจากตารางด้านขวาจะถูกกำหนดเป็น
NULL
นี่คือเหตุผลที่ผู้สัมภาษณ์เรียกสิ่งนี้ว่าการเชื่อมต่อแบบ OUTER เพราะแถวที่อยู่นอกชุดข้อมูลที่ตรงกันจะถูกคงไว้แทนที่จะถูกทิ้ง
สองตาราง
ตลอดบทเรียนนี้ เราจะใช้ตารางอย่างง่ายสองตาราง customers มีข้อมูลลูกค้าทุกคน ส่วน orders บันทึกการซื้อและอ้างอิงลูกค้าผ่าน customer_id
สังเกตว่าลูกค้าหมายเลข 3 (แครอล) ไม่มีแถวอยู่ใน orders ลูกค้าที่ไม่ตรงกันรายนี้คือสิ่งที่ 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การเขียน LEFT JOIN
ไวยากรณ์คล้ายกับการเชื่อมแบบ inner โดยเปลี่ยน INNER เป็น LEFT (คำว่า OUTER เป็นคำที่ไม่จำเป็นต้องใส่: LEFT JOIN และ LEFT OUTER JOIN มีความหมายเหมือนกันทุกประการ)
ตารางที่เขียนไว้ ก่อน คีย์เวิร์ด JOIN คือฝั่งซ้ายที่ต้องคงไว้ ลำดับมีความสำคัญ: customers LEFT JOIN orders จะคงลูกค้าทุกคนไว้ ไม่ใช่คำสั่งซื้อทุกรายการ
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id;การอ่านผลลัพธ์
นี่คือผลลัพธ์จากคำสั่งสืบค้นนั้น แถวของอลิซตรงกันสองรายการ เธอจึงปรากฏสองครั้ง แถวของบ็อบตรงกันหนึ่งรายการ ส่วน แถวของแครอลไม่ตรงกับข้อมูลใดเลย เธอจึงยังปรากฏอยู่ โดยมีค่า NULL ในคอลัมน์ amount
แถวเดียวของแครอลที่มีค่า NULL คือสัญลักษณ์บ่งชี้ของ LEFT JOIN ผู้สัมภาษณ์ที่กำลังฟังคุณอธิบายเหตุผลต้องการได้ยินว่า: "แถวด้านซ้ายที่ไม่ตรงกันจะยังคงอยู่ โดยมีค่า NULL ทางด้านขวา"
-- name | amount
-- Alice | 50
-- Alice | 75
-- Bob | 20
-- Carol | NULL <-- preserved, no matchNULL มาจากไหน
ค่า NULL ไม่ได้ถูกเก็บไว้ที่ใด ฐานข้อมูล สร้างค่านี้ขึ้น เนื่องจากไม่มีแถวจากตารางด้านขวาที่จะนำค่า amount มาให้
ทุกคอลัมน์ที่ดึงมาจากตารางด้านขวาจะกลายเป็น NULL สำหรับแถวด้านซ้ายที่ไม่ตรงกัน ได้แก่ o.id, o.customer_id และ o.amount ล้วนเป็น NULL ในแถวของแครอล เรื่องนี้สำคัญเพราะการที่ o.customer_id เป็น NULL ไม่ได้หมายความว่าลูกค้าไม่มีรหัส แต่หมายความว่าไม่มีคำสั่งซื้อที่ตรงกันเลย
การนับคำสั่งซื้อต่อลูกค้า
คำถามต่อยอดที่พบบ่อยคือ "ลูกค้าแต่ละคนมีคำสั่งซื้อกี่รายการ โดยรวมคนที่มีศูนย์รายการด้วยได้อย่างไร" การใช้ LEFT JOIN ร่วมกับ COUNT ทำได้ตรงตามต้องการ แต่คุณต้องนับคอลัมน์ของ ตารางด้านขวา ไม่ใช่ *
COUNT(o.id) จะไม่นับค่า NULL ดังนั้นแครอลจึงได้ค่า 0 ส่วน COUNT(*) จะคืนค่า 1 ให้แครอลอย่างไม่ถูกต้อง เพราะแถว NULL ที่สร้างขึ้นยังคงถูกนับเป็นแถวหนึ่งแถว
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กับดักระหว่าง COUNT(*) กับ COUNT(คอลัมน์)
นี่เป็นจุดหลอกถามคลาสสิกในการสัมภาษณ์ หลังจากใช้ LEFT JOIN แถวด้านซ้ายที่ไม่ตรงกันจะมีอยู่จริงในผลลัพธ์ โดยมีคอลัมน์ด้านขวาเป็น NULL
COUNT(*)จะนับแถวนั้น ทำให้ลูกค้าที่ไม่มีคำสั่งซื้อได้ค่า 1COUNT(o.id)จะข้ามค่า NULL และคืนค่า 0 ได้อย่างถูกต้อง
เมื่อต้องการค่าศูนย์ที่แท้จริง ให้เลือกนับคอลัมน์ที่เป็น NULL ในฝั่งที่ไม่มีข้อมูลตรงกันเสมอ
-- 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;การหาผลรวมด้วย LEFT JOIN
การรวมค่าประเภทอื่นนอกเหนือจาก COUNT จะจัดการกับค่า NULL ที่สร้างขึ้นได้อย่างเหมาะสม SUM จะไม่สนใจค่า NULL ดังนั้นลูกค้าที่ไม่ตรงกันจะได้ค่า NULL (ไม่ใช่ข้อผิดพลาด)
ผู้สัมภาษณ์มักต้องการให้รายงานแสดงศูนย์แทน NULL ให้ครอบการรวมค่าด้วย COALESCE เพื่อแทนที่ด้วยค่าเริ่มต้น
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ตารางซ้ายและขวา อธิบายให้ชัดเจน
เมื่อผู้สัมภาษณ์ถามว่า "ตารางใดถูกคงไว้" ให้ตอบอย่างมั่นใจว่า ตารางที่อยู่ทางซ้ายของคีย์เวิร์ด JOIN ให้อ่านจากซ้ายไปขวา
A LEFT JOIN B = คงทุกแถวของ A ไว้ หากต้องการคงทุกแถวของ B แทน ให้สลับเป็น B LEFT JOIN A หรือใช้ RIGHT JOIN ทีมส่วนใหญ่นิยมใช้ LEFT JOIN เท่านั้นเพื่อให้อ่านง่าย โดยเพียงสลับลำดับตาราง
รายการตรวจสอบในใจ
เมื่อเห็น LEFT JOIN ในการสัมภาษณ์ ให้อธิบายรายการตรวจสอบต่อไปนี้ออกเสียง:
- ฝั่งที่คงไว้? ตารางด้านซ้าย โดยคงไว้ทุกแถว
- แถวที่ไม่ตรงกัน? ปรากฏหนึ่งครั้ง พร้อมค่า NULL จากด้านขวา
- กำลังนับอยู่หรือไม่? ใช้
COUNT(right_col)เพื่อให้ได้ค่าศูนย์ที่แท้จริง - กำลังหาผลรวมอยู่หรือไม่? ครอบด้วย
COALESCEหากต้องการ 0 ไม่ใช่ NULL
การอธิบายรายการตรวจสอบนี้ออกมาแสดงถึงความเคร่งครัดในระดับผู้มีประสบการณ์
ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจเรื่อง LEFT JOIN ของคุณในการนับ
สรุป
LEFT JOIN จะคงทุกแถวของตารางด้านซ้ายไว้ แถวด้านซ้ายที่ตรงกันจะจับคู่กับข้อมูลด้านขวาที่ตรงกัน ส่วนแถวด้านซ้ายที่ไม่ตรงกันจะยังคงอยู่หนึ่งครั้ง โดยมีค่า NULL ในคอลัมน์ทั้งหมดจากตารางด้านขวา
- ตารางด้านซ้ายคือตารางที่อยู่ก่อนคีย์เวิร์ด
JOIN - ค่า NULL ที่สร้างขึ้นเป็นสัญญาณบอกแถวที่ไม่มีข้อมูลตรงกัน
COUNT(right_col)ให้ค่าศูนย์ที่แท้จริง ส่วนCOUNT(*)ไม่ให้ผลเช่นนั้นCOALESCE(SUM(...), 0)เปลี่ยนผลรวมที่เป็น NULL ให้เป็นศูนย์
นี่คือพื้นฐานสำหรับการค้นหาข้อมูลที่หายไปและการเชื่อมแบบตัดออกในบทเรียนถัดไป
คำถามที่พบบ่อย
บทเรียน “LEFT JOIN และการคงแถวที่ไม่ตรงกัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “LEFT JOIN และการคงแถวที่ไม่ตรงกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “LEFT JOIN และการคงแถวที่ไม่ตรงกัน”
LEFT JOIN คงแถวใดไว้ และ NULL ปรากฏอย่างไรในแถวที่ไม่ตรงกัน คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “LEFT JOIN และการคงแถวที่ไม่ตรงกัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- LEFT JOIN และการคงแถวที่ไม่ตรงกัน
- ความหมายของ RIGHT และ FULL OUTER JOIN
- ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)
- กับดักการใช้ WHERE กับการเชื่อมตารางภายนอก