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

พนักงานและผู้จัดการ

ตัวอย่างลำดับชั้นแบบคลาสสิก

พนักงานและผู้จัดการ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

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

การเชื่อมตารางกับตัวเอง คือการเชื่อมตารางเข้ากับตัวมันเอง แนวคิดนี้อาจฟังดูแปลก แต่มีประโยชน์อย่างมากเมื่อแถวในตารางมีความสัมพันธ์กับแถวอื่นในตารางเดียวกัน

ตัวอย่างคลาสสิกคือตาราง พนักงาน ซึ่งพนักงานแต่ละคนอาจมีผู้จัดการ และผู้จัดการคนนั้นก็เป็นพนักงานที่เก็บอยู่ในตารางเดียวกัน

ตารางพนักงาน

มาสร้างตาราง employees แบบง่าย ๆ กัน แต่ละแถวมี id, name และ manager_id ที่ชี้กลับไปยังอีกแถวหนึ่งในตารางเดียวกัน

เมื่อ manager_id เป็น NULL พนักงานคนนั้นจะไม่มีผู้จัดการ และอยู่บนสุดของลำดับชั้น (เช่น CEO)

CREATE TABLE employees (
  id         INT PRIMARY KEY,
  name       VARCHAR(100) NOT NULL,
  manager_id INT REFERENCES employees(id)
);

การเพิ่มข้อมูลตัวอย่าง

มาเติมข้อมูลลำดับชั้นของบริษัทขนาดเล็กลงในตารางกัน Alice เป็น CEO (ไม่มีผู้จัดการ) ส่วน Bob และ Carol ขึ้นตรงต่อ Alice ทั้งคู่ ขณะที่ Dave และ Eve ขึ้นตรงต่อ Bob

INSERT INTO employees (id, name, manager_id) VALUES
  (1, 'Alice',   NULL),
  (2, 'Bob',     1),
  (3, 'Carol',   1),
  (4, 'Dave',    2),
  (5, 'Eve',     2),
  (6, 'Frank',   3);

การเรียกดูข้อมูลโดยไม่ใช้การเชื่อมตาราง

หากเพียงเลือกแถวทั้งหมด เราจะเห็นตัวเลข manager_id ดิบ ๆ ไม่ใช่ชื่อผู้จัดการ ซึ่งอ่านได้ยากและไม่มีประโยชน์สำหรับผู้ใช้ปลายทาง

SELECT id, name, manager_id
FROM employees;

การเขียนการเชื่อมตารางกับตัวเอง

หากต้องการแสดงชื่อผู้จัดการถัดจากพนักงานแต่ละคน ให้เชื่อมตาราง employees เข้ากับตัวมันเอง และกำหนดนามแฝงที่ต่างกันให้แต่ละสำเนา: e แทนพนักงาน และ m แทนผู้จัดการ

เงื่อนไขการเชื่อมตารางจะเชื่อม manager_id ของพนักงานเข้ากับ id ของผู้จัดการ

SELECT
  e.name   AS employee,
  m.name   AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

การรวมพนักงานที่ไม่มีผู้จัดการ

INNER JOIN ด้านบนซ่อน Alice ไว้ เนื่องจาก manager_id ของเธอเป็น NULL และไม่มีแถวที่ตรงกันทางด้านขวา หากต้องการรวมทุกคนไว้ (แม้แต่พนักงานระดับบนสุด) ให้ใช้ LEFT JOIN

Alice จะปรากฏขึ้นพร้อมค่า NULL ในคอลัมน์ผู้จัดการ

SELECT
  e.name              AS employee,
  m.name              AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

การใช้ COALESCE เพื่อให้อ่านง่ายขึ้น

ค่า NULL ในคอลัมน์ผู้จัดการอาจทำให้สับสน สามารถใช้ COALESCE แทนค่า NULL ด้วยป้ายกำกับที่อ่านเข้าใจง่าย เช่น 'ไม่มีผู้จัดการ' เพื่อให้ผลลัพธ์สำหรับรายงานดูสะอาดตาขึ้น

SELECT
  e.name                              AS employee,
  COALESCE(m.name, 'No Manager')      AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY manager, employee;

การค้นหาผู้ใต้บังคับบัญชาโดยตรง

สามารถสลับแนวทางของแบบสอบถามเพื่อถามว่า ใครขึ้นตรงต่อผู้จัดการคนใดคนหนึ่ง สิ่งนี้เรียกว่าการค้นหาผู้ใต้บังคับบัญชาโดยตรง ในที่นี้เราจะค้นหาพนักงานทั้งหมดที่ขึ้นตรงต่อ Alice (โดยมี ID เท่ากับ 1)

SELECT e.name AS direct_report
FROM employees e
WHERE e.manager_id = 1;

การนับผู้ใต้บังคับบัญชาต่อผู้จัดการแต่ละคน

การรวมการเชื่อมตารางกับตัวเองเข้ากับ GROUP BY และ COUNT ช่วยให้เห็นว่าผู้จัดการแต่ละคนมีผู้ใต้บังคับบัญชาโดยตรงกี่คน ซึ่งมีประโยชน์สำหรับการวิเคราะห์ภาระงาน

SELECT
  m.name          AS manager,
  COUNT(e.id)     AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;

ลำดับชั้นสองระดับ

หากต้องการเห็นลำดับชั้นสองระดับพร้อมกัน ได้แก่ พนักงาน ผู้จัดการของพนักงาน และผู้จัดการของผู้จัดการ สามารถเชื่อมตารางเป็นครั้งที่สามได้ การเชื่อมแต่ละครั้งจะเพิ่มลำดับชั้นขึ้นอีกหนึ่งระดับ

SELECT
  e.name   AS employee,
  m.name   AS manager,
  gm.name  AS grand_manager
FROM employees e
LEFT JOIN employees m  ON e.manager_id  = m.id
LEFT JOIN employees gm ON m.manager_id  = gm.id;

ข้อจำกัดของการเชื่อมตารางกับตัวเอง

การเชื่อมตารางกับตัวเองทำงานได้ดีสำหรับลำดับชั้นตื้นที่มีจำนวนระดับคงที่ (1–3 ระดับ) หากไม่ทราบความลึกหรือลำดับชั้นมีความลึกไม่จำกัด เช่น แผนผังองค์กรที่อาจลึกถึง 10 ระดับ จำเป็นต้องใช้ CTE แบบเรียกซ้ำแทน

สำหรับแบบสอบถามพนักงานและผู้จัดการที่ใช้งานจริงส่วนใหญ่ แนวทางการเชื่อมตารางกับตัวเองที่ครอบคลุมในบทเรียนนี้เป็นเครื่องมือที่เหมาะสม

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการเชื่อมตารางกับตัวเองและลำดับชั้นพนักงานกับผู้จัดการ

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้วิธีใช้การเชื่อมตารางกับตัวเองเพื่อจำลองและเรียกดูข้อมูลลำดับชั้นพนักงานกับผู้จัดการแบบคลาสสิกที่เก็บอยู่ในตารางเดียว

ประเด็นสำคัญ:

  • การเชื่อมตารางกับตัวเองเชื่อมตารางเข้ากับตัวมันเองโดยใช้นามแฝงที่แตกต่างกันสองชื่อ
  • เงื่อนไขการเชื่อมตารางจะเชื่อม manager_id เข้ากับ id ในตารางเดียวกัน
  • ใช้ INNER JOIN เพื่อดูเฉพาะพนักงานที่มีผู้จัดการ และใช้ LEFT JOIN เพื่อรวมทุกคนไว้
  • COALESCE สามารถแทนค่าผู้จัดการที่เป็น NULL ด้วยป้ายกำกับที่อ่านเข้าใจง่าย
  • สำหรับลำดับชั้นที่มีความลึกไม่จำกัด ให้พิจารณาใช้ CTE แบบเรียกซ้ำ

คำถามที่พบบ่อย

บทเรียน “พนักงานและผู้จัดการ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พนักงานและผู้จัดการ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พนักงานและผู้จัดการ”

ตัวอย่างลำดับชั้นแบบคลาสสิก คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “พนักงานและผู้จัดการ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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