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

เชื่อมตารางสามตารางขึ้นไป

ต่อการเชื่อมตารางหลายรายการและวิเคราะห์ชุดผลลัพธ์ระหว่างทาง

เชื่อมตารางสามตารางขึ้นไป เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. วิธีที่ INNER JOIN จับคู่แถว
  2. ON เทียบกับ WHERE ในการเชื่อมตาราง
  3. การแตกแขนงของการเชื่อมตารางและการเพิ่มจำนวนแถว
  4. เชื่อมตารางสามตารางขึ้นไป
← กลับไปที่ SQL Interview Prep