เลือกประเภทการเชื่อมตารางที่เหมาะสม
กรอบการตัดสินใจสำหรับเลือกการเชื่อมตารางที่ถูกต้องจากโจทย์ที่อธิบายเป็นข้อความ
เลือกประเภทการเชื่อมตารางที่เหมาะสม เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
การเลือกชนิดการเชื่อมตารางจากโจทย์ปัญหา
ทักษะการเลือกการเชื่อมตารางที่มีค่าที่สุดในการสัมภาษณ์ไม่ใช่ไวยากรณ์ แต่คือการแปลงข้อกำหนดที่เขียนด้วยภาษาธรรมดาให้เป็นชนิดการเชื่อมตารางที่ถูกต้อง ผู้สมัครส่วนใหญ่รู้ว่าการเชื่อมตารางแต่ละชนิดทำงานอย่างไร แต่กลับนึกไม่ออกเมื่อต้องเลือกชนิดใดชนิดหนึ่งภายใต้ความกดดัน
บทเรียนนี้มอบกรอบการตัดสินใจที่ใช้ซ้ำได้ เพื่อให้คุณระบุชนิดการเชื่อมตารางที่ถูกต้องได้ภายในไม่กี่วินาที
คำถามหลัก: ต้องเก็บแถวใดไว้
การเลือกชนิดการเชื่อมตารางทุกครั้งสรุปได้ด้วยคำถามเดียว: คุณต้องเก็บแถวที่ไม่มีคู่ตรงกันของฝั่งใดไว้
- เก็บเฉพาะแถวที่ตรงกันทั้งสองฝั่ง:
INNER JOIN - เก็บแถวฝั่งซ้ายทั้งหมด ไม่ว่าจะตรงกันหรือไม่:
LEFT JOIN - เก็บแถวทั้งหมดจากทั้งสองฝั่ง:
FULL OUTER JOIN - เก็บทุกชุดการจับคู่:
CROSS JOIN
ตัดสินใจก่อนว่าข้อมูลใดต้องคงอยู่ แล้วชนิดการเชื่อมตารางจะตามมาโดยอัตโนมัติ
คำบ่งชี้สำหรับ INNER JOIN
วลีอย่าง ‘ลูกค้าที่สั่งซื้อ’ ‘ผลิตภัณฑ์ที่มีบทวิจารณ์’ หรือ ‘คำสั่งซื้อพร้อมกับลูกค้า’ ล้วนหมายความว่าต้องมีรายการที่ตรงกันทั้งสองฝั่ง นั่นคือ INNER JOIN
หากยอมรับหรือต้องการตัดแถวที่ไม่มีคู่ตรงกันออก การเชื่อมแบบ inner จะเป็นค่าเริ่มต้นและเป็นตัวเลือกที่มีประสิทธิภาพสูงสุด
SELECT c.name, o.order_id
FROM customers c
JOIN orders o ON o.customer_id = c.id;คำบ่งชี้สำหรับ LEFT JOIN
วลีอย่าง ‘ลูกค้าทั้งหมด รวมถึงลูกค้าที่ไม่มีคำสั่งซื้อ’ หรือ ‘แสดงผลิตภัณฑ์ทุกชิ้นและจำนวนบทวิจารณ์ของแต่ละชิ้น โดยเป็นศูนย์หากไม่มี’ หมายความว่าคุณต้องเก็บข้อมูลในตารางซ้ายไว้ไม่ว่าจะมีรายการที่ตรงกันหรือไม่ นั่นคือ LEFT JOIN
คำที่บ่งชี้ได้ชัดเจนคือ ‘ทั้งหมด’ ‘รวมถึงรายการที่ไม่มี’ และ ‘แม้จะไม่มีเลย’
SELECT c.name, COUNT(o.order_id) AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.name;คำบ่งชี้สำหรับการเชื่อมแบบไม่พบคู่
วลีอย่าง ‘ลูกค้าที่ไม่เคยสั่งซื้อ’ ‘ผลิตภัณฑ์ที่ไม่มียอดขาย’ หรือ ‘พนักงานที่ไม่มีผู้จัดการ’ ต้องการแถวที่ไม่มีคู่ตรงกัน นี่คือการเชื่อมแบบไม่พบคู่: LEFT JOIN ร่วมกับ WHERE right_key IS NULL (หรือ NOT EXISTS)
คำสำคัญคือ ‘ไม่เคย’ ‘ไม่มี’ หรือ ‘โดยไม่มี’
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.order_id IS NULL;คำบ่งชี้สำหรับ FULL OUTER JOIN
วลีอย่าง ‘กระทบยอดรายการสองชุดและแสดงรายการที่ขาดหายจากฝั่งใดฝั่งหนึ่ง’ หรือ ‘เปรียบเทียบบัญชีของเดือนที่แล้วกับเดือนนี้ พร้อมระบุทั้งรายการใหม่และรายการที่หายไป’ ต้องเก็บแถวที่ไม่มีคู่ตรงกันจากทั้งสองตาราง นั่นคือ FULL OUTER JOIN
ปัญหาการกระทบยอดและการค้นหาความแตกต่างเป็นกรณีที่มักต้องใช้วิธีนี้
SELECT a.id, b.id
FROM last_month a
FULL OUTER JOIN this_month b ON a.id = b.id
WHERE a.id IS NULL OR b.id IS NULL;คำบ่งชี้สำหรับ CROSS JOIN
วลีอย่าง ‘ทุกขนาดในทุกสี’ ‘หนึ่งแถวต่อร้านค้าต่อวัน แม้จะไม่มียอดขาย’ หรือ ‘ชุดการจับคู่ที่เป็นไปได้ทั้งหมด’ บ่งชี้ให้ใช้ CROSS JOIN
จุดสังเกตคือ ‘ทุก...ในทุก...’ หรือ ‘ชุดการจับคู่ทั้งหมด’ ซึ่งไม่มีเงื่อนไขการจับคู่ระหว่างข้อมูลสองชุด
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;คำบ่งชี้สำหรับ SELF JOIN
วลีที่เชื่อมโยงแถวหนึ่งกับแถวอื่นในตารางเดียวกัน เช่น ‘พนักงานแต่ละคนและผู้จัดการของพวกเขา’ ‘คู่ผู้ใช้ในเมืองเดียวกัน’ หรือ ‘ค้นหาอีเมลที่ซ้ำกัน’ บ่งชี้ให้ใช้ SELF JOIN
จุดสังเกตคือเอนทิตีหนึ่งอ้างอิงถึงหรือเปรียบเทียบกับเอนทิตีอีกหนึ่งรายการที่เป็นชนิดเดียวกัน
SELECT e.name, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;ตัวอย่างการแปลงโจทย์
โจทย์: ‘แสดงผลิตภัณฑ์ทุกชิ้นและจำนวนครั้งที่มีการสั่งซื้อในเดือนที่แล้ว รวมถึงผลิตภัณฑ์ที่ไม่เคยถูกสั่งซื้อ’
ถอดความ: ‘ผลิตภัณฑ์ทุกชิ้น’ รวมกับ ‘รวมถึงผลิตภัณฑ์ที่ไม่เคยถูกสั่งซื้อ’ หมายความว่าต้องเก็บแถวผลิตภัณฑ์ทั้งหมดไว้ ดังนั้นให้ใช้ LEFT JOIN เชื่อมผลิตภัณฑ์กับคำสั่งซื้อ แล้วใช้ COUNT นับฝั่งคำสั่งซื้อ (ซึ่งมีค่าเป็น 0 สำหรับผลิตภัณฑ์ที่ไม่มีคู่ตรงกัน เพราะ COUNT จะไม่นับค่า NULL)
SELECT p.name, COUNT(o.order_id) AS times_ordered
FROM products p
LEFT JOIN orders o
ON o.product_id = p.id
AND o.order_date >= DATE '2024-05-01'
GROUP BY p.id, p.name;กับดักที่พบบ่อย: การกรองใน ON เทียบกับ WHERE
ในคิวรีก่อนหน้า ตัวกรองวันที่อยู่ในส่วนคำสั่ง ON ไม่ใช่ WHERE ซึ่งทำให้ยังคงแสดงผลิตภัณฑ์ที่ไม่มีคำสั่งซื้อซึ่งตรงตามเงื่อนไข
หากย้าย order_date >= ... ไปไว้ใน WHERE ระบบจะตัดแถวที่มีค่า NULL จากผลิตภัณฑ์ที่ไม่มีคู่ตรงกันออก และเปลี่ยน LEFT JOIN ให้กลายเป็น INNER JOIN อย่างเงียบ ๆ ทำให้ผลิตภัณฑ์ที่โจทย์ต้องการให้เก็บไว้หายไป
-- WRONG: WHERE on the outer table removes unmatched products
-- ...
-- LEFT JOIN orders o ON o.product_id = p.id
-- WHERE o.order_date >= '2024-05-01' <-- becomes an inner joinกรอบการตัดสินใจ
ใช้รายการตรวจสอบนี้กับโจทย์ปัญหาเกี่ยวกับการเชื่อมตารางทุกข้อ:
- ตารางเดียวกันมีความสัมพันธ์กับตัวเองหรือไม่ -> SELF JOIN (และพิจารณาใช้ CTE แบบเรียกซ้ำหากความลึกไม่จำกัด)
- ต้องการทุกชุดการจับคู่โดยไม่มีเงื่อนไขหรือไม่ -> CROSS JOIN
- ต้องการเฉพาะแถวที่ตรงกันหรือไม่ -> INNER JOIN
- ต้องเก็บข้อมูลทั้งหมดจากฝั่งใดฝั่งหนึ่งหรือไม่ -> LEFT JOIN
- ต้องเก็บแถวที่ไม่มีคู่ตรงกันจากทั้งสองฝั่งหรือไม่ -> FULL OUTER JOIN
- ต้องการแถวที่ไม่มีคู่ตรงกันหรือไม่ -> การเชื่อมแบบไม่พบคู่ (LEFT JOIN + IS NULL)
ตรวจสอบอย่างรวดเร็ว
นำกรอบการตัดสินใจไปใช้กับโจทย์ปัญหาที่เขียนเป็นข้อความ
ทบทวน: การเลือกชนิดการเชื่อมตารางที่ถูกต้อง
ประเด็นสำคัญ:
- เริ่มการตัดสินใจเรื่องการเชื่อมตารางทุกครั้งด้วยการถามว่า แถวที่ไม่มีคู่ตรงกันใดต้องคงอยู่
- จับคู่คำบ่งชี้: ‘ทั้งหมด/รวมถึง’ -> LEFT, ‘ไม่เคย/ไม่มี’ -> การเชื่อมแบบไม่พบคู่, ‘ทุก...ในทุก...’ -> CROSS, ‘X แต่ละรายการและ X ของรายการนั้น’ -> SELF, การกระทบยอด -> FULL OUTER
- เก็บตัวกรองของการเชื่อมภายนอกไว้ในส่วนคำสั่ง
ONตัวกรองในWHEREอาจลดระดับLEFT JOINให้กลายเป็นINNER JOINโดยไม่แจ้งให้ทราบ - อธิบายกรอบการคิดออกมาเป็นคำพูดในการสัมภาษณ์ เพราะแสดงให้เห็นกระบวนการให้เหตุผล ไม่ใช่การท่องจำ
คำถามที่พบบ่อย
บทเรียน “เลือกประเภทการเชื่อมตารางที่เหมาะสม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เลือกประเภทการเชื่อมตารางที่เหมาะสม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เลือกประเภทการเชื่อมตารางที่เหมาะสม”
กรอบการตัดสินใจสำหรับเลือกการเชื่อมตารางที่ถูกต้องจากโจทย์ที่อธิบายเป็นข้อความ คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “เลือกประเภทการเชื่อมตารางที่เหมาะสม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- CROSS JOIN และผลคูณคาร์ทีเซียน
- SELF JOIN สำหรับโครงสร้างลำดับชั้น
- เปรียบเทียบแถวภายในตารางเดียวกัน
- เลือกประเภทการเชื่อมตารางที่เหมาะสม