Coding Interview Prep · บทเรียน

ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)

รูปแบบ LEFT JOIN / IS NULL สำหรับค้นหาระเบียนกำพร้าและข้อมูลที่ขาดหาย

บทเรียน 3 จาก 413 ขั้นตอน

ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก) เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คำถามเรื่องการ JOIN แบบค้นหาแถวที่ไม่มีคู่ตรงกัน

หนึ่งในคำถามเกี่ยวกับการ JOIN แบบด้านนอกที่ถูกถามบ่อยที่สุดคือ “ค้นหาลูกค้าที่ไม่เคยสั่งซื้อเลย” หรือ “แสดงรายการสินค้าที่ไม่เคยขาย” หรือ “คำสั่งซื้อที่ไม่มีลูกค้าตรงกัน”

คำถามเหล่านี้มีรูปแบบเดียวกัน นั่นคือ แถวในตารางหนึ่งที่ไม่มีแถวตรงกันในอีกตารางหนึ่ง รูปแบบมาตรฐานที่ชัดเจนคือ การ JOIN เพื่อค้นหาแถวที่ไม่มีคู่ตรงกัน ซึ่งสร้างจาก LEFT JOIN และตัวกรอง IS NULL

แนวคิดหลัก

เริ่มจาก LEFT JOIN ซึ่งจะเก็บแถวทางซ้ายไว้ทั้งหมด และเติมค่า NULL ให้คอลัมน์ของตารางขวาสำหรับแถวทางซ้ายที่ไม่ตรงกัน

ดังนั้นแถวที่ไม่ตรงกันจึงเป็น แถวที่คอลัมน์ของตารางขวามีค่า NULL พอดี เมื่อตรวจกรองตามเงื่อนไขนี้ ก็จะแยกแถวที่ไม่มีคู่ตรงกันออกมาได้ นี่คือกลวิธีทั้งหมด

การสร้างรูปแบบคำสั่ง

นี่คือรูปแบบมาตรฐานของการ JOIN เพื่อค้นหาลูกค้าที่ไม่มีคำสั่งซื้อ โปรดอ่านเป็นสองจังหวะ: LEFT JOIN จะเก็บลูกค้าทั้งหมดไว้ จากนั้น WHERE o.customer_id IS NULL จะเก็บเฉพาะแถวที่ไม่ตรงกัน

SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id
WHERE o.customer_id IS NULL;
-- only customers with zero orders

เหตุผลที่ทำงานได้ทีละขั้นตอน

ลองไล่ดูจากข้อมูลของเรา โดยที่ Carol ไม่มีคำสั่งซื้อ

  • LEFT JOIN สร้าง Alice (x2), Bob (x1) และ Carol ซึ่งมีค่า NULL ในคอลัมน์ของตารางขวา
  • WHERE o.customer_id IS NULL ตัด Alice และ Bob ออก (คอลัมน์ของตารางขวามีค่าจริง)
  • เหลือเพียงแถวของ Carol ซึ่งเป็นแถวที่สร้างขึ้นโดยเติมค่า NULL

ตัวกรองทำงาน หลังจากการ JOIN จึงมองเห็นค่า NULL เหล่านั้นและเลือกแถวกำพร้าได้อย่างแม่นยำ

เลือกคอลัมน์ที่เหมาะสมสำหรับตรวจสอบ

ตรวจสอบคอลัมน์ของตารางขวาที่ ไม่มีทางเป็น NULL ได้อย่างถูกต้องตามปกติ เมื่อเกิดการตรงกันจริง โดยควรเลือกคีย์ที่ใช้ JOIN หรือคีย์หลัก

หากตรวจสอบคอลัมน์ของตารางขวาที่อนุญาตให้เป็น NULL ได้ เช่น o.shipped_at คุณจะจับคำสั่งซื้อที่มีอยู่จริงแต่ยังไม่ได้จัดส่งเข้ามาด้วย ซึ่งเป็นคำตอบที่ผิด การตรวจสอบ o.customer_id (คีย์ที่ใช้ JOIN) หรือ o.id (คีย์หลักของคอลัมน์นั้น) รับประกันได้ว่าค่า NULL หมายถึง “ไม่มีแถวใดตรงกัน”

-- SAFE: join key / primary key
WHERE o.id IS NULL

-- RISKY: a nullable data column
WHERE o.shipped_at IS NULL  -- catches unshipped too!

การ JOIN แบบค้นหาแถวที่ไม่มีคู่ตรงกันเทียบกับ NOT IN

ผู้สัมภาษณ์มักเปรียบเทียบการ JOIN แบบค้นหาแถวที่ไม่มีคู่ตรงกันกับ NOT IN ทั้งสองดูเหมือนเทียบเท่ากัน แต่มีความแตกต่างเมื่อพบค่า NULL

หากแบบสอบถามย่อยคืนค่า NULL มาแม้เพียงค่าเดียว NOT IN จะไม่คืนแถวใดเลย ซึ่งเป็นข้อผิดพลาดเงียบที่มีชื่อเสียง การ JOIN แบบค้นหาแถวที่ไม่มีคู่ตรงกันด้วย LEFT JOIN / IS NULL จะไม่เกิดปัญหานี้

-- DANGEROUS if any customer_id is NULL
SELECT id, name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);

-- SAFE anti-join, same intent
SELECT c.id, c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

การ JOIN แบบค้นหาแถวที่ไม่มีคู่ตรงกันเทียบกับ NOT EXISTS

อีกทางเลือกที่เทียบเท่ากันคือ NOT EXISTS ร่วมกับแบบสอบถามย่อยแบบสัมพันธ์ วิธีนี้จัดการค่า NULL ได้อย่างถูกต้องเช่นกัน และมักมีความเร็วเทียบเท่า

ทั้งสามรูปแบบ (LEFT JOIN/IS NULL, NOT EXISTS, NOT IN) สามารถใช้แสดงการ JOIN เพื่อค้นหาแถวที่ไม่มีคู่ตรงกันได้ แต่ในการสัมภาษณ์ควรเลือกใช้ LEFT JOIN/IS NULL หรือ NOT EXISTS เพราะปลอดภัยจากปัญหา NULL การกล่าวถึงกับดักของ NOT IN จะช่วยแสดงความเข้าใจได้เป็นอย่างดี

SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.id
);

ข้อผิดพลาดที่พบบ่อย

ข้อผิดพลาดที่เกิดขึ้นบ่อยคือการใส่เงื่อนไขแถวที่ไม่ตรงกันไว้ในส่วนคำสั่ง ON แทนที่จะเป็น WHERE

การเขียน ... ON o.customer_id = c.id AND o.id IS NULL ไม่ได้กรองผลลัพธ์ แต่เพียงเปลี่ยนสิ่งที่ถือว่าเป็นแถวที่ตรงกัน และลูกค้าทุกคนยังคงอยู่หลังการทำ LEFT JOIN การตรวจสอบ IS NULL ต้องอยู่ใน WHERE และทำงานหลังการ JOIN เราจะอธิบายกับดักนี้อย่างครบถ้วนในบทเรียนถัดไป

การค้นหาแถวลูกค้าที่หายไป

รูปแบบนี้ใช้ในทิศทางตรงกันข้ามได้เช่นกัน หากต้องการค้นหา คำสั่งซื้อที่อ้างอิงลูกค้าที่ไม่มีอยู่ (แถวกำพร้า ซึ่งใช้ตรวจสอบความถูกต้องของข้อมูล) ให้เก็บ orders ไว้และตรวจสอบฝั่งลูกค้าว่ามีค่า NULL

SELECT o.id AS order_id, o.customer_id
FROM orders o
LEFT JOIN customers c
  ON c.id = o.customer_id
WHERE c.id IS NULL;
-- orders pointing to a non-existent customer

การนับแถวกำพร้า

หลายครั้งโจทย์ต้องการเพียงจำนวน เช่น “มีลูกค้ากี่รายที่ไม่เคยสั่งซื้อ” คุณสามารถครอบการ JOIN แบบค้นหาแถวที่ไม่มีคู่ตรงกันไว้ หรือจะนับโดยตรงก็ได้

เนื่องจากการ JOIN แบบนี้คืนหนึ่งแถวต่อหนึ่งแถวกำพร้าอยู่แล้ว การใช้ COUNT(*) โดยตรงจึงถูกต้องในกรณีนี้ เพราะมีหนึ่งแถวพอดีต่อลูกค้าแต่ละรายที่ไม่ตรงกัน

SELECT COUNT(*) AS never_ordered
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

แม่แบบที่นำกลับมาใช้ได้

จดจำโครงร่างสามบรรทัดนี้ไว้ เพราะใช้แก้คำถามสัมภาษณ์ได้เป็นจำนวนมาก

  • FROM keep_table k
  • LEFT JOIN other o ON o.fk = k.id
  • WHERE o.id IS NULL

สลับตารางและคีย์เพื่อค้นหาสินค้าที่ไม่เคยขาย ตั๋วงานที่ยังไม่ได้มอบหมาย ผู้ใช้ที่ไม่เคยเข้าสู่ระบบ หรืออะไรก็ตามที่อธิบายว่า “X ที่ไม่มี Y ตรงกัน”

ตรวจสอบความเข้าใจ

คุณต้องการค้นหาสินค้าที่ไม่เคยปรากฏใน order_items

สรุป

การ JOIN แบบค้นหาแถวที่ไม่มีคู่ตรงกันใช้ค้นหาแถวที่ไม่มีคู่ตรงกัน โดยทำ LEFT JOIN แล้วตามด้วย WHERE right_key IS NULL

  • ตรวจสอบคีย์ที่ใช้ JOIN หรือคีย์หลัก ไม่ใช่คอลัมน์ข้อมูลที่อนุญาตให้เป็น NULL
  • การตรวจสอบ IS NULL ต้องอยู่ใน WHERE ไม่ใช่ ON
  • เทียบเท่ากับ NOT EXISTS และควรเลือกใช้แทน NOT IN ซึ่งทำงานผิดพลาดเมื่อมีค่า NULL
  • สลับตารางเพื่อค้นหาแถวลูกค้าที่หายไป

แม่แบบเดียวใช้ตอบคำถามได้มากมาย: “X ที่ไม่มี Y ตรงกัน”

เริ่มต้นได้ฟรี

เรียนรู้ Coding Interview Prep ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
90
บทเรียน
360

คำถามที่พบบ่อย

บทเรียน “ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)”

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

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

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

บทเรียน “ค้นหาแถวที่ไม่มีรายการตรงกัน (การเชื่อมตารางแบบตัดออก)” ใช้เวลานานแค่ไหน

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

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

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

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

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