เชื่อมตารางสามตารางขึ้นไป
ต่อการเชื่อมตารางหลายรายการและวิเคราะห์ชุดผลลัพธ์ระหว่างทาง
เชื่อมตารางสามตารางขึ้นไป เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
การเชื่อมเป็นสาย ไม่ใช่การแตกแขนง
โจทย์สัมภาษณ์จริงมักไม่หยุดอยู่ที่สองตาราง คุณอาจถูกขอให้เชื่อมสาม สี่ หรือมากกว่านั้น แนวคิดสำคัญที่ช่วยลดความสับสนคือ การเชื่อมหลายตารางเป็นเพียงลำดับของการเชื่อมสองตาราง
ฐานข้อมูลจะเชื่อมสองตารางแรกเข้าด้วยกันเป็นผลลัพธ์ระหว่างกลาง จากนั้นจึงเชื่อมผลลัพธ์นั้นกับตารางที่สาม และทำต่อไปเรื่อย ๆ หากคุณวิเคราะห์การเชื่อมหนึ่งครั้งได้ ก็ย่อมวิเคราะห์การเชื่อมที่ต่อกันเป็นสายได้เช่นกัน
สคีมาสามตาราง
เราขยายตัวอย่างด้วยตารางที่สาม ตอนนี้เรามีลูกค้า คำสั่งซื้อของลูกค้า และผลิตภัณฑ์ที่คำสั่งซื้อแต่ละรายการอ้างอิง
customers(id, name)orders(id, customer_id, product_id, amount)products(id, title)
มีความสัมพันธ์สองรายการที่เชื่อมโยงตารางเหล่านี้เข้าด้วยกัน ได้แก่ orders.customer_id = customers.id และ orders.product_id = products.id
customers(id, name)
orders(id, customer_id, product_id, amount)
products(id, title)คำสั่งสืบค้นพื้นฐานด้วยสามตาราง
วางการเชื่อมตารางต่อกันทีละรายการ โดยแต่ละ JOIN ... ON จะเพิ่มตารางหนึ่งตารางและระบุว่าตารางนั้นเชื่อมโยงกับส่วนที่มีอยู่ก่อนอย่างไร
อ่านจากบนลงล่าง เริ่มจาก orders แล้วเชื่อมลูกค้าที่ตรงกัน จากนั้นเชื่อมผลิตภัณฑ์ที่ตรงกัน แถวคำสั่งซื้อทุกรายการจะมีชื่อและชื่อผลิตภัณฑ์เพิ่มเข้ามา
SELECT c.name, p.title, o.amount
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_id;คิดเป็นชุดผลลัพธ์ระหว่างทาง
แบบจำลองทางความคิดที่ทำให้การเชื่อมหลายตารางเป็นเรื่องง่ายคือ หลังจากแต่ละ JOIN ให้จินตนาการถึง ผลลัพธ์ระหว่างทาง ที่ได้จนถึงตอนนั้น
- หลังการเชื่อมครั้งที่ 1: คอลัมน์ของ orders + คอลัมน์ของลูกค้า
- หลังการเชื่อมครั้งที่ 2: ผลลัพธ์นั้น + คอลัมน์ของผลิตภัณฑ์
ส่วนคำสั่ง ON ถัดไปสามารถอ้างอิงคอลัมน์ใดก็ได้ที่มีอยู่แล้วในชุดข้อมูลระหว่างทาง จึงเป็นเหตุผลว่าลำดับการเชื่อมตารางส่งผลต่อสิ่งที่คุณเขียนในแต่ละ ON
แต่ละ ON มองเห็นตารางก่อนหน้า
ผลสำคัญประการหนึ่งคือ ส่วนคำสั่ง ON ของการเชื่อมตารางภายหลังสามารถอ้างอิง ตารางใดก็ได้ที่เชื่อมไว้ก่อนหน้านั้น ไม่ใช่เฉพาะตารางที่กำลังเพิ่มเข้ามา
ในที่นี้ การเชื่อมตารางครั้งที่สามเชื่อมกับ o (orders) ซึ่งอยู่ในขอบเขตแล้ว คุณยังสามารถเชื่อมตารางที่สี่กับ c หรือ p ได้ด้วย เพราะทั้งสองตารางเป็นส่วนหนึ่งของผลลัพธ์ที่กำลังสร้างอยู่แล้ว
SELECT c.name, p.title, w.region
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_id
JOIN warehouses w ON w.id = o.warehouse_id; -- refers to oเริ่มจากตารางศูนย์กลาง
เคล็ดลับที่ใช้ได้จริงในการสัมภาษณ์แบบสดคือ เริ่ม FROM ด้วย ตารางข้อเท็จจริง / ตารางศูนย์กลาง (โดยปกติคือตารางที่อยู่ตรงกลางของความสัมพันธ์) แล้วค่อยเชื่อมออกไปยังตารางค้นหา
Orders อยู่ตรงกลาง โดยเก็บคีย์นอกที่อ้างอิงทั้ง customers และ products ดังนั้นการเริ่มจากตารางนี้จึงทำให้ส่วนคำสั่ง ON ทุกส่วนเรียบง่ายและอ้างอิงไปข้างหน้า
-- orders is central: it links to both sides
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_idการแตกแขนงทวีคูณตามสายการเชื่อมตาราง
ทุกสิ่งที่คุณเรียนรู้เกี่ยวกับการแตกแขนงยังคงใช้ได้ และผลดังกล่าวจะ ทบกัน หากคำสั่งซื้อแต่ละรายการมีสินค้าหลายรายการ และสินค้าแต่ละรายการมีแถวภาษีหลายแถว จำนวนแถวจะคูณเพิ่มขึ้นในทุกขั้นตอน
เมื่อค่ารวมในคำสั่งสืบค้นที่เชื่อมหลายตารางดูมากเกินไป ให้สงสัยว่าการเชื่อมตารางช่วงกลางรายการใดรายการหนึ่งทำให้เกิดการแตกแขนง และตรวจสอบระดับรายละเอียดของการเชื่อมตารางแต่ละครั้งแยกกัน
-- rows = orders * items_per_order * tax_rows_per_item
SELECT o.id
FROM orders o
JOIN order_items i ON i.order_id = o.id
JOIN item_taxes t ON t.item_id = i.id;การผสมชนิดการเชื่อมตารางในสาย
คุณสามารถผสมการเชื่อมแบบ INNER และ LEFT ไว้ในคำสั่งสืบค้นเดียวกันได้ แต่ ลำดับมีความสำคัญ เมื่อ LEFT JOIN นำค่า NULL เข้ามา การเชื่อมแบบ INNER ในภายหลังที่อ้างอิงคอลัมน์เหล่านั้นซึ่งเป็น NULL อาจลบแถวที่ควรคงไว้ทิ้งได้
ในที่นี้ หากลูกค้าไม่มีคำสั่งซื้อ LEFT JOIN จะคงลูกค้ารายนั้นไว้พร้อม product_id ที่เป็น NULL แล้ว INNER JOIN ถัดไปกับ products จะลบลูกค้ารายนั้นออกอีกครั้ง ซึ่งเป็นข้อผิดพลาดที่เกิดขึ้นได้ง่ายเมื่ออยู่ภายใต้ความกดดัน
SELECT c.name, p.title
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
JOIN products p ON p.id = o.product_id;
-- the INNER products join can cancel the LEFT JOINคงการเชื่อมต่อแบบ OUTER ไว้
หากต้องการคงลูกค้าที่ไม่มีคำสั่งซื้อไว้จนจบ ให้การเชื่อมตารางถัดลงไปเป็น LEFT ด้วย ค่า NULL จึงจะไหลต่อไปจนถึงผลลัพธ์สุดท้ายได้อย่างปลอดภัย
หลักทั่วไปคือ เมื่อเริ่มใช้การเชื่อมแบบ OUTER แล้ว ให้ใช้การเชื่อมแบบ OUTER ต่อไปกับทุกตารางที่ต่อออกจากสาขาซึ่งอาจไม่มีข้อมูล
SELECT c.name, p.title
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
LEFT JOIN products p ON p.id = o.product_id;
-- customers with no orders are now kept (NULL title)ชื่อแทนมีความสำคัญเมื่อขยายขนาด
เมื่อมีตารางสี่หรือห้าตาราง หลายตารางอาจใช้ชื่อคอลัมน์ร่วมกัน เช่น id, name หรือ created_at การใช้ ชื่อแทน ที่สั้นและสม่ำเสมอช่วยขจัดความกำกวมและทำให้คำสั่งสืบค้นอ่านง่าย
เลือกชื่อแทนที่บอกใบ้ถึงตารางนั้น (c, o, p) และระบุแหล่งที่มาของทุกคอลัมน์ให้ชัดเจน ผู้สัมภาษณ์จะมองการตั้งชื่อแทนของคุณเป็นสัญญาณว่าคุณเขียน SQL สำหรับระบบใช้งานจริงอย่างไร
SELECT c.id AS customer_id,
o.id AS order_id,
p.id AS product_id,
p.title
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_id;ตารางเชื่อมสำหรับความสัมพันธ์หลายต่อหลาย
เมื่อเอนทิตีสองรายการมีความสัมพันธ์แบบหลายต่อหลาย จะมี ตารางเชื่อม (ตารางสะพาน) อยู่ระหว่างกลาง และคุณต้องเชื่อมตารางผ่านตารางนั้น นักเรียนและหลักสูตรเชื่อมโยงกันผ่านการลงทะเบียนเรียน
การมองออกว่าต้องเชื่อมผ่านตารางสะพานเป็นสิ่งที่ผู้สัมภาษณ์มักใช้เป็นสัญญาณในการประเมินเช่นกัน
SELECT s.name, c.title
FROM students s
JOIN enrollments e ON e.student_id = s.id
JOIN courses c ON c.id = e.course_id;ตรวจสอบอย่างรวดเร็ว
วิเคราะห์สายการเชื่อมตารางแบบผสม
สรุป: การเชื่อมสามตารางขึ้นไป
นำหลักเหล่านี้ไปใช้ในการสัมภาษณ์:
- การเชื่อมหลายตารางคือ สายของการเชื่อมระหว่างสองตาราง หลายครั้ง ให้พิจารณาผลลัพธ์ระหว่างทางหลังแต่ละขั้นตอน
- ส่วนคำสั่ง ON ในภายหลังสามารถอ้างอิง ตารางใดก็ได้ที่อยู่ก่อนหน้า ในสายการเชื่อม
- เริ่มจากตาราง ศูนย์กลาง แล้วเชื่อมออกไปยังตารางค้นหา
- การแตกแขนงทบกัน ตลอดสายการเชื่อม ให้ตรวจสอบระดับรายละเอียดในแต่ละขั้นตอน
- INNER JOIN ที่อยู่หลัง LEFT JOIN อาจ ยกเลิกผลของ LEFT JOIN ได้ ให้ใช้การเชื่อมแบบ OUTER ต่อไปเพื่อคงแถวที่อาจไม่มีข้อมูล
- ความสัมพันธ์แบบหลายต่อหลายต้องเชื่อมผ่าน ตารางสะพาน
คำถามที่พบบ่อย
บทเรียน “เชื่อมตารางสามตารางขึ้นไป” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เชื่อมตารางสามตารางขึ้นไป” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- วิธีที่ INNER JOIN จับคู่แถว
- ON เทียบกับ WHERE ในการเชื่อมตาราง
- การแตกแขนงของการเชื่อมตารางและการเพิ่มจำนวนแถว
- เชื่อมตารางสามตารางขึ้นไป