0Pricing
SQL Interview Prep · บทเรียน

LEFT JOIN และการคงแถวที่ไม่ตรงกัน

LEFT JOIN คงแถวใดไว้ และ NULL ปรากฏอย่างไรในแถวที่ไม่ตรงกัน

LEFT JOIN และการคงแถวที่ไม่ตรงกัน เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL 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 match

NULL มาจากไหน

ค่า 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(*) จะนับแถวนั้น ทำให้ลูกค้าที่ไม่มีคำสั่งซื้อได้ค่า 1
  • COUNT(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) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “LEFT JOIN และการคงแถวที่ไม่ตรงกัน”

LEFT JOIN คงแถวใดไว้ และ NULL ปรากฏอย่างไรในแถวที่ไม่ตรงกัน คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “LEFT JOIN และการคงแถวที่ไม่ตรงกัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม

ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. LEFT JOIN และการคงแถวที่ไม่ตรงกัน
  2. ความหมายของ RIGHT และ FULL OUTER JOIN
  3. ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)
  4. กับดักการใช้ WHERE กับการเชื่อมตารางภายนอก
← กลับไปที่ SQL Interview Prep