การเชื่อมตารางกับตัวเองคืออะไร
เชื่อมตารางเข้ากับตัวเองด้วยชื่อแทน
การเชื่อมตารางกับตัวเองคืออะไร เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเชื่อมตารางกับตัวเอง
การเชื่อมตารางกับตัวเอง คือการเชื่อมตารางเข้ากับตารางเดียวกัน แนวคิดนี้อาจฟังดูแปลกในตอนแรก แต่เป็นเทคนิคที่มีประสิทธิภาพเมื่อแถวในตารางเดียวมีความสัมพันธ์กับแถวอื่นในตารางเดียวกัน
ตัวอย่างที่พบบ่อยที่สุดคือตาราง พนักงาน ซึ่งแถวของพนักงานแต่ละคนเก็บ ID ของผู้จัดการไว้ด้วย และผู้จัดการคนนั้นก็เป็นพนักงานที่อยู่ในตารางเดียวกัน
ตารางพนักงาน
พิจารณาตาราง employees ซึ่งแต่ละแถวมี id, name และ manager_id ที่ชี้ไปยังอีกแถวหนึ่งในตารางเดียวกัน
โครงสร้างนี้เรียกว่าความสัมพันธ์แบบ อ้างอิงตัวเอง หรือแบบ เรียกซ้ำ ให้เรียกใช้แบบสอบถามด้านล่างเพื่อสร้างและเติมข้อมูลลงในตาราง
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);
INSERT INTO employees VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Carol', 1),
(4, 'Dave', 2),
(5, 'Eve', 2),
(6, 'Frank', 3);เหตุใดการเชื่อมตารางทั่วไปจึงใช้ไม่ได้ในกรณีนี้
หากต้องการแสดงพนักงานแต่ละคนพร้อมชื่อผู้จัดการ ข้อมูลทั้งสองส่วนอยู่ในตารางเดียวกัน การเชื่อมตารางทั่วไปจะเชื่อมตารางที่แตกต่างกันสองตาราง (หรืออย่างน้อยก็แหล่งข้อมูลสองแหล่ง)
หากต้องการอ่านข้อมูลจากตารางเดียวกันสองครั้ง ครั้งหนึ่งในบทบาทพนักงานและอีกครั้งในบทบาทผู้จัดการ จำเป็นต้องใช้การเชื่อมตารางกับตัวเองร่วมกับนามแฝงของตาราง
การใช้นามแฝง
ในการเชื่อมตารางกับตัวเอง ให้เขียนชื่อตารางเดียวกันสองครั้งในส่วนคำสั่ง FROM / JOIN และกำหนดนามแฝงที่แตกต่างกันให้แต่ละครั้ง นามแฝงช่วยให้ SQL มองทั้งสองส่วนเสมือนเป็นตารางเชิงตรรกะที่แยกจากกัน
โดยทั่วไปจะใช้นามแฝงสั้น ๆ ที่สื่อความหมาย เช่น e แทนพนักงาน และ m แทนผู้จัดการ
-- Conceptual structure (not yet a full query)
-- FROM employees AS e
-- JOIN employees AS m ON e.manager_id = m.idการเชื่อมตารางกับตัวเองครั้งแรก
ต่อไปนี้คือการเชื่อมตารางกับตัวเองแบบสมบูรณ์ ซึ่งแสดงพนักงานทุกคนพร้อมชื่อผู้จัดการ เงื่อนไข ON เชื่อม manager_id ของพนักงานเข้ากับ id ของผู้จัดการ
Alice ไม่มีผู้จัดการ จึงถูกตัดออกโดย INNER JOIN เนื่องจากไม่มีแถวที่ตรงกันในฝั่งผู้จัดการ
SELECT
e.name AS employee,
m.name AS manager
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id;การรวมแถวที่ไม่มีผู้จัดการ
เมื่อใช้ INNER JOIN แถวที่ไม่มีข้อมูลตรงกันจะถูกตัดออก Alice มีค่า manager_id = NULL จึงไม่ปรากฏในผลลัพธ์
ให้เปลี่ยนไปใช้ LEFT JOIN เพื่อเก็บพนักงานทุกคนไว้ และแสดง NULL (หรือป้ายกำกับ) เมื่อไม่มีผู้จัดการ
SELECT
e.name AS employee,
COALESCE(m.name, 'No Manager') AS manager
FROM employees AS e
LEFT JOIN employees AS m
ON e.manager_id = m.id;การกรองผลลัพธ์จากการเชื่อมตารางกับตัวเอง
สามารถเพิ่มส่วนคำสั่ง WHERE ในการเชื่อมตารางกับตัวเองได้เช่นเดียวกับแบบสอบถามอื่น ตัวอย่างด้านล่างดึงเฉพาะพนักงานที่มี Alice เป็นผู้จัดการโดยตรง (โดยมี ID เท่ากับ 1)
SELECT
e.name AS employee,
m.name AS manager
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id
WHERE m.name = 'Alice';การนับผู้ใต้บังคับบัญชาโดยตรง
การเชื่อมตารางกับตัวเองทำงานร่วมกับฟังก์ชันรวมได้อย่างเป็นธรรมชาติ แบบสอบถามด้านล่างนับจำนวนผู้ใต้บังคับบัญชาโดยตรงของผู้จัดการแต่ละคนด้วยการจัดกลุ่มตามนามแฝงของผู้จัดการ
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;การเชื่อมตารางกับตัวเองสำหรับข้อมูลที่ไม่ใช่ลำดับชั้น
การเชื่อมตารางกับตัวเองไม่ได้จำกัดอยู่เฉพาะข้อมูลแบบลำดับชั้น ทุกครั้งที่แถวในตารางมีความสัมพันธ์กับแถวอื่นในตารางเดียวกัน การเชื่อมตารางกับตัวเองก็ช่วยได้
ตัวอย่างเช่น การค้นหาคู่พนักงานทั้งหมดที่มีผู้จัดการคนเดียวกัน โดยเชื่อมตารางเข้ากับตัวเองจากค่า manager_id ที่ตรงกัน พร้อมตรวจสอบไม่ให้จับคู่พนักงานคนหนึ่งกับตัวเอง
SELECT
a.name AS employee_1,
b.name AS employee_2,
a.manager_id
FROM employees AS a
INNER JOIN employees AS b
ON a.manager_id = b.manager_id
AND a.id < b.id;บทบาทของนามแฝง
นามแฝงเป็นสิ่งจำเป็นในการเชื่อมตารางกับตัวเอง หากไม่มีนามแฝง ฐานข้อมูลจะไม่ทราบว่าคอลัมน์แต่ละคอลัมน์อ้างถึงสำเนาใดของตาราง และจะเกิดข้อผิดพลาดเรื่องความกำกวม
สามารถใช้นามแฝงชื่อใดก็ได้ กฎสำคัญคือการอ้างอิงคอลัมน์ทุกครั้งต้องมีนามแฝงที่ถูกต้องนำหน้า เพื่อให้ SQL ทราบว่าควรดูข้อมูลจากส่วนใดของตาราง
-- This will fail: column 'name' is ambiguous
-- SELECT name FROM employees JOIN employees ON manager_id = id;
-- This works: aliases remove the ambiguity
SELECT e.name, m.name
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;กรณีการใช้งานในโลกจริง
การเชื่อมตารางกับตัวเองพบได้บ่อยในฐานข้อมูลจริง กรณีการใช้งานทั่วไป ได้แก่:
- แผนผังองค์กร — พนักงานและผู้จัดการของพวกเขา
- แผนผังหมวดหมู่ — หมวดหมู่แม่และหมวดหมู่ลูก
- รายการชิ้นส่วน — ส่วนประกอบที่ประกอบขึ้นจากส่วนประกอบอื่น
- เครือข่ายสังคม — การค้นหาเพื่อนของเพื่อนในตารางการเชื่อมต่อเดียว
การสังเกตพบคีย์นอกที่อ้างอิงตัวเองในสคีมาถือเป็นเบาะแสแรกว่าควรใช้การเชื่อมตารางกับตัวเอง
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการเชื่อมตารางกับตัวเองก่อนดำเนินการต่อ
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่าการเชื่อมตารางกับตัวเองคืออะไรและควรใช้เมื่อใด:
- การเชื่อมตารางกับตัวเองเชื่อมตารางเข้ากับตัวมันเองโดยอ้างถึงตารางนั้นสองครั้งด้วยนามแฝงที่แตกต่างกัน
- ใช้
INNER JOINเพื่อตัดแถวที่ไม่มีข้อมูลตรงกัน (เช่น ผู้จัดการระดับบนสุด) หรือใช้LEFT JOINเพื่อเก็บแถวเหล่านั้นไว้ - เพิ่ม
WHERE,GROUP BYและฟังก์ชันรวมได้เช่นเดียวกับการเชื่อมตารางรูปแบบอื่น - ใช้
a.id < b.idในส่วนคำสั่งONเพื่อหลีกเลี่ยงคู่ซ้ำเมื่อเปรียบเทียบแถวภายในตารางเดียวกัน - การเชื่อมตารางกับตัวเองเป็นเครื่องมือหลักสำหรับข้อมูลแบบลำดับชั้น แผนผังหมวดหมู่ และความสัมพันธ์ที่อ้างอิงตัวเองทุกประเภท
หัวข้อถัดไป: การสำรวจลำดับชั้นหลายระดับด้วย CTE แบบเรียกซ้ำ
คำถามที่พบบ่อย
บทเรียน “การเชื่อมตารางกับตัวเองคืออะไร” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเชื่อมตารางกับตัวเองคืออะไร” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมตารางกับตัวเองคืออะไร”
เชื่อมตารางเข้ากับตัวเองด้วยชื่อแทน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การเชื่อมตารางกับตัวเองคืออะไร” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเชื่อมตารางกับตัวเองคืออะไร
- พนักงานและผู้จัดการ
- การเปรียบเทียบแถวในตารางเดียวกัน
- ข้อจำกัดของการเชื่อมตารางกับตัวเอง