Skip to content

SQL-4.2 LEFT / RIGHT / FULL JOIN

INNER JOIN ทิ้งแถวที่ไม่มี match — แต่บางทีคุณ ต้องการ เห็นแถวนั้น เช่น “นักเรียนที่ยังไม่ลงทะเบียน” นั่นคือที่มาของ LEFT JOIN

INNER JOIN: เฉพาะ match [ A ∩ B ]
LEFT JOIN: ทุกแถวจาก A [ A ∪ (A∩B) ]
RIGHT JOIN: ทุกแถวจาก B [ (A∩B) ∪ B ]
FULL OUTER JOIN: ทุกแถวจากทั้งคู่ [ A ∪ B ]

LEFT JOIN — เก็บทุกแถวจากตารางซ้าย

Section titled “LEFT JOIN — เก็บทุกแถวจากตารางซ้าย”
-- LEFT JOIN: เก็บนักเรียนทุกคน แม้ไม่มี enrollment
SELECT
s.student_id,
s.name,
e.course_id,
e.enrolled_on
FROM students s
LEFT JOIN enrollments e
ON s.student_id = e.student_id;

ผลลัพธ์:

student_idnamecourse_idenrolled_on
STD001สมชายCS1012025-08-15
STD001สมชายCS1022025-08-16
STD002สมหญิงCS1012025-08-15
STD003วิชัยNULLNULL

ใช้ LEFT JOIN หา “ใครยังไม่ลงทะเบียน”:

SELECT s.name
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id
WHERE e.enrollment_id IS NULL;
-- ได้: วิชัย
-- RIGHT JOIN: เก็บทุกแถวจากตารางขวา (enrollments)
SELECT s.name, e.course_id
FROM students s
RIGHT JOIN enrollments e ON s.student_id = e.student_id;
-- FULL OUTER JOIN: เก็บทุกแถวจากทั้งสองตาราง
SELECT s.name, e.course_id
FROM students s
FULL OUTER JOIN enrollments e ON s.student_id = e.student_id;

เมื่อไหร่ใช้อะไร

Section titled “เมื่อไหร่ใช้อะไร”
สถานการณ์ใช้ JOIN แบบ
ดูเฉพาะนักเรียนที่ลงทะเบียนแล้วINNER JOIN
ดูนักเรียนทุกคน + วิชาที่ลง (ถ้ามี)LEFT JOIN
หานักเรียนที่ยังไม่ลงทะเบียนLEFT JOIN + WHERE ... IS NULL
ดูข้อมูลจากทั้งสองฝั่งไม่ให้ตกหล่นFULL OUTER JOIN