0Pricing
SQL Academy · บทเรียน

การเชื่อมตารางกับตัวเองคืออะไร

เชื่อมตารางเข้ากับตัวเองด้วยชื่อแทน

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

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

  1. การเชื่อมตารางกับตัวเองคืออะไร
  2. พนักงานและผู้จัดการ
  3. การเปรียบเทียบแถวในตารางเดียวกัน
  4. ข้อจำกัดของการเชื่อมตารางกับตัวเอง
← กลับไปที่ SQL Academy