Skip to content

SQL-4.1 INNER JOIN

INNER JOIN คือ “จุดตัด” ของสองตาราง — ถ้าแถวไหนไม่มีคู่ match ก็จะไม่ปรากฏในผลลัพธ์เลย

INNER JOIN ดึงเฉพาะแถวที่มีค่าตรงกันในทั้งสองตาราง เหมือนการหา intersection ของ 2 เซ็ต

students enrollments
┌─────────┐ ┌─────────────┐
│ STD001 │──────▶│ STD001 │ ✅ match → ปรากฏในผลลัพธ์
│ STD002 │──────▶│ STD002 │ ✅ match → ปรากฏในผลลัพธ์
│ STD003 │ ✗ │ │ ❌ ไม่มี match → หายไป
│ │ │ STD999 │ ❌ ไม่มี match → หายไป
└─────────┘ └─────────────┘
-- สร้างตาราง
CREATE TABLE students (
student_id VARCHAR(6) PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE enrollments (
enrollment_id SERIAL PRIMARY KEY,
student_id VARCHAR(6),
course_id VARCHAR(6),
enrolled_on DATE
);
INSERT INTO students VALUES ('STD001', 'สมชาย', 'somchai@mail.com');
INSERT INTO students VALUES ('STD002', 'สมหญิง', 'somying@mail.com');
INSERT INTO students VALUES ('STD003', 'วิชัย', 'wichai@mail.com');
INSERT INTO enrollments VALUES (1, 'STD001', 'CS101', '2025-08-15');
INSERT INTO enrollments VALUES (2, 'STD001', 'CS102', '2025-08-16');
INSERT INTO enrollments VALUES (3, 'STD002', 'CS101', '2025-08-15');
-- INNER JOIN: เฉพาะนักเรียนที่มีการลงทะเบียน
SELECT
s.student_id,
s.name,
e.course_id,
e.enrolled_on
FROM students s
INNER JOIN enrollments e
ON s.student_id = e.student_id;

ผลลัพธ์: 3 แถว — STD001 (2 วิชา) + STD002 (1 วิชา)

สังเกต: STD003 (วิชัย) หายไป เพราะไม่มี enrollment

เทียบกับ WHERE เก่า (Implicit Join):

-- แบบเก่า (ยังใช้ได้ แต่ไม่แนะนำ)
SELECT s.name, e.course_id
FROM students s, enrollments e
WHERE s.student_id = e.student_id;
-- แบบใหม่ (ชัดเจนกว่า)
SELECT s.name, e.course_id
FROM students s
INNER JOIN enrollments e ON s.student_id = e.student_id;
สิ่งที่ต้องจำรายละเอียด
INNER JOINดึงเฉพาะแถวที่ match ทั้งสองฝั่ง
ON clauseกำหนดเงื่อนไขการเชื่อม (มักเป็น primary key = foreign key)
ไม่มี matchแถวนั้นหายไปจากผลลัพธ์
Alias (s, e)ใช้ตัวย่อเพื่อให้อ่านง่าย