Skip to content

Lab: Multi-Table Join

คุณต้องสร้าง report ที่แสดงข้อมูลนักเรียน วิชาที่ลง และหน่วยกิต — โดยเชื่อม 3 ตารางเข้าด้วยกัน

เวลาที่ใช้: ~25 นาที

ตาราง students:

student_idnameemail
STD001สมชายsomchai@mail.com
STD002สมหญิงsomying@mail.com
STD003วิชัยwichai@mail.com
STD004มาลีmalee@mail.com

ตาราง enrollments:

enrollment_idstudent_idcourse_idenrolled_on
1STD001CS1012025-08-15
2STD001CS1022025-08-16
3STD002CS1012025-08-15
4STD002CS1032025-08-17

ตาราง courses:

course_idcourse_namecredits
CS101Database Fundamentals3
CS102Web Development3
CS103Data Analytics4
CS104Machine Learning4
  1. สร้างตารางและใส่ข้อมูล ใน DB Fiddle (PostgreSQL)

  2. Query 1: INNER JOIN 3 ตาราง — แสดง name, course_name, credits เฉพาะนักเรียนที่ลงทะเบียน

  3. Query 2: LEFT JOIN — แสดงนักเรียนทุกคน รวมคนที่ยังไม่ลงทะเบียน

  4. Query 3: หานักเรียนที่ยังไม่ลงทะเบียน — ใช้ LEFT JOIN + WHERE IS NULL

  5. Query 4: หาวิชาที่ยังไม่มีใครลง — ใช้ LEFT JOIN จากฝั่ง courses

  6. Query 5: รวมหน่วยกิตต่อนักเรียน — ใช้ JOIN + GROUP BY + SUM

-- สร้างตาราง
CREATE TABLE students (
student_id VARCHAR(6) PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE courses (
course_id VARCHAR(6) PRIMARY KEY,
course_name VARCHAR(100),
credits INTEGER
);
CREATE TABLE enrollments (
enrollment_id SERIAL PRIMARY KEY,
student_id VARCHAR(6) REFERENCES students(student_id),
course_id VARCHAR(6) REFERENCES courses(course_id),
enrolled_on DATE
);
-- ใส่ข้อมูล (copy จากตารางด้านบน)
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 students VALUES ('STD004','มาลี','malee@mail.com');
INSERT INTO courses VALUES ('CS101','Database Fundamentals',3);
INSERT INTO courses VALUES ('CS102','Web Development',3);
INSERT INTO courses VALUES ('CS103','Data Analytics',4);
INSERT INTO courses VALUES ('CS104','Machine Learning',4);
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');
INSERT INTO enrollments VALUES (4,'STD002','CS103','2025-08-17');
-- เขียน query ของคุณด้านล่างนี้
ดูเฉลย

Query 1: INNER JOIN 3 ตาราง

SELECT s.name, c.course_name, c.credits
FROM students s
INNER JOIN enrollments e ON s.student_id = e.student_id
INNER JOIN courses c ON e.course_id = c.course_id;

ผลลัพธ์: 4 แถว — สมชาย (2 วิชา) + สมหญิง (2 วิชา)

Query 2: LEFT JOIN ดูทุกคน

SELECT s.name, c.course_name, c.credits
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id
LEFT JOIN courses c ON e.course_id = c.course_id;

ผลลัพธ์: 6 แถว — วิชัยและมาลีมี NULL ในคอลัมน์ course_name, credits

Query 3: นักเรียนที่ยังไม่ลง

SELECT s.name
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id
WHERE e.enrollment_id IS NULL;

ผลลัพธ์: วิชัย, มาลี

Query 4: วิชาที่ยังไม่มีใครลง

SELECT c.course_name
FROM courses c
LEFT JOIN enrollments e ON c.course_id = e.course_id
WHERE e.enrollment_id IS NULL;

ผลลัพธ์: Machine Learning

Query 5: รวมหน่วยกิตต่อคน

SELECT s.name, COALESCE(SUM(c.credits), 0) AS total_credits
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id
LEFT JOIN courses c ON e.course_id = c.course_id
GROUP BY s.student_id, s.name
ORDER BY total_credits DESC;

ผลลัพธ์: สมหญิง (7), สมชาย (6), วิชัย (0), มาลี (0)