SQL การใช้งาน FULL OUTER JOIN

การใช้คำสั่ง FULL OUTER JOIN ใน SQL เป็นการรวมข้อมูลจากสองตารางโดยดึงข้อมูลที่ตรงกันจากทั้งสองตารางพร้อมกับข้อมูลที่ไม่มีคู่ตรงกันจากทั้งสองตารางด้วย ในกรณีที่ไม่มีคู่ข้อมูลในอีกตารางหนึ่ง ค่าจะแสดงเป็น NULL

รูปแบบคำสั่ง

SELECT columns
FROM table1
FULL OUTER JOIN table2
ON table1.column = table2.column;

สร้างตารางตัวอย่าง

สมมติว่าเรามีตาราง 2 ตารางดังนี้

ตาราง Employees

SQL
CREATE TABLE Employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(100)
);
SQL
INSERT INTO Employees (emp_id, emp_name)
VALUES 
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');

ตาราง Projects

SQL
CREATE TABLE Projects (
    proj_id INT PRIMARY KEY,
    emp_id INT,
    proj_name VARCHAR(100),
    FOREIGN KEY (emp_id) REFERENCES Employees(emp_id)
);
SQL
INSERT INTO Projects (proj_id, emp_id, proj_name)
VALUES 
(101, 1, 'Project A'),
(102, 2, 'Project B'),
(103, 3, 'Project C');

จากตารางนี้ เรามีข้อมูลของพนักงาน (Employees) และโครงการ (Projects) ที่พนักงานทำงานอยู่ สังเกตว่า emp_id ของพนักงาน 3 (Charlie) ไม่มีในตาราง Projects และ emp_id ของพนักงาน 4 (จาก Projects) ไม่มีในตาราง Employees

การใช้ FULL OUTER JOIN

SQL
SELECT e.emp_id, e.emp_name, p.proj_id, p.proj_name
FROM Employees e
FULL OUTER JOIN Projects p
ON e.emp_id = p.emp_id;

ผลลัพธ์

  • แถวที่ 1: พนักงาน Alice (emp_id 1) ทำงานใน Project A (proj_id 101)
  • แถวที่ 2: พนักงาน Bob (emp_id 2) ทำงานใน Project B (proj_id 102)
  • แถวที่ 3: Charlie (emp_id 3) ไม่มีโปรเจคใด ๆ ดังนั้นค่า proj_id และ proj_name เป็น NULL
  • แถวที่ 4: Project C (proj_id 103) ไม่มีพนักงานที่ทำงานในโปรเจคนี้ (emp_id ของพนักงานใน Project C ไม่มีอยู่ในตาราง Employees)

การประยุกต์ใช้งาน FULL OUTER JOIN รูปแบบต่าง ๆ

การนับจำนวนข้อมูลที่มีคู่ตรงกันและไม่มีคู่ตรงกัน FULL OUTER JOIN ช่วยให้เราสามารถดูความสัมพันธ์ระหว่างสองตารางได้ เช่น

SQL
SELECT 
  COUNT(CASE WHEN e.emp_id IS NOT NULL AND p.proj_id IS NOT NULL THEN 1 END) AS matched,
  COUNT(CASE WHEN e.emp_id IS NOT NULL AND p.proj_id IS NULL THEN 1 END) AS unmatched_employees,
  COUNT(CASE WHEN e.emp_id IS NULL AND p.proj_id IS NOT NULL THEN 1 END) AS unmatched_projects
FROM Employees e
FULL OUTER JOIN Projects p
ON e.emp_id = p.emp_id;

ผลลัพธ์

  • matched: จำนวนข้อมูลที่มีคู่ตรงกันในทั้งสองตาราง (Alice, Bob)
  • unmatched_employees: จำนวนพนักงานที่ไม่มีโปรเจค (Charlie)
  • unmatched_projects: จำนวนโปรเจคที่ไม่มีพนักงาน (Project C)

การจัดการข้อมูล NULL ในกรณีที่ต้องการแทนที่ค่า NULL ด้วยค่าอื่น ๆ เพื่อให้ง่ายต่อการอ่าน เช่นการใช้ COALESCE

SQL
SELECT 
  COALESCE(e.emp_id, 'No Employee') AS emp_id,
  COALESCE(e.emp_name, 'No Name') AS emp_name,
  COALESCE(p.proj_id, 'No Project') AS proj_id,
  COALESCE(p.proj_name, 'No Project Name') AS proj_name
FROM Employees e
FULL OUTER JOIN Projects p
ON e.emp_id = p.emp_id;

ผลลัพธ์

สรุป

  • FULL OUTER JOIN ช่วยให้สามารถรวมข้อมูลจากสองตารางและแสดงข้อมูลที่มีในทั้งสองตารางรวมถึงข้อมูลที่ไม่มีคู่ตรงกันจากตารางใดตารางหนึ่ง
  • การใช้งาน FULL OUTER JOIN เหมาะสำหรับการวิเคราะห์ข้อมูลในระบบที่ต้องการดูข้อมูลทั้งหมดไม่ว่าจะมีความสัมพันธ์ระหว่างตารางหรือไม่
แชร์เรื่องนี้