Lab: Multi-Table Join
คุณต้องสร้าง report ที่แสดงข้อมูลนักเรียน วิชาที่ลง และหน่วยกิต — โดยเชื่อม 3 ตารางเข้าด้วยกัน
เวลาที่ใช้: ~25 นาที
ข้อมูล
Section titled “ข้อมูล”ตาราง students:
| student_id | name | |
|---|---|---|
| STD001 | สมชาย | somchai@mail.com |
| STD002 | สมหญิง | somying@mail.com |
| STD003 | วิชัย | wichai@mail.com |
| STD004 | มาลี | malee@mail.com |
ตาราง enrollments:
| enrollment_id | student_id | course_id | enrolled_on |
|---|---|---|---|
| 1 | STD001 | CS101 | 2025-08-15 |
| 2 | STD001 | CS102 | 2025-08-16 |
| 3 | STD002 | CS101 | 2025-08-15 |
| 4 | STD002 | CS103 | 2025-08-17 |
ตาราง courses:
| course_id | course_name | credits |
|---|---|---|
| CS101 | Database Fundamentals | 3 |
| CS102 | Web Development | 3 |
| CS103 | Data Analytics | 4 |
| CS104 | Machine Learning | 4 |
คำสั่ง
Section titled “คำสั่ง”-
สร้างตารางและใส่ข้อมูล ใน DB Fiddle (PostgreSQL)
-
Query 1: INNER JOIN 3 ตาราง — แสดง name, course_name, credits เฉพาะนักเรียนที่ลงทะเบียน
-
Query 2: LEFT JOIN — แสดงนักเรียนทุกคน รวมคนที่ยังไม่ลงทะเบียน
-
Query 3: หานักเรียนที่ยังไม่ลงทะเบียน — ใช้ LEFT JOIN + WHERE IS NULL
-
Query 4: หาวิชาที่ยังไม่มีใครลง — ใช้ LEFT JOIN จากฝั่ง courses
-
Query 5: รวมหน่วยกิตต่อนักเรียน — ใช้ JOIN + GROUP BY + SUM
Starter Code
Section titled “Starter Code”-- สร้างตาราง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.creditsFROM students sINNER JOIN enrollments e ON s.student_id = e.student_idINNER JOIN courses c ON e.course_id = c.course_id;ผลลัพธ์: 4 แถว — สมชาย (2 วิชา) + สมหญิง (2 วิชา)
Query 2: LEFT JOIN ดูทุกคน
SELECT s.name, c.course_name, c.creditsFROM students sLEFT JOIN enrollments e ON s.student_id = e.student_idLEFT JOIN courses c ON e.course_id = c.course_id;ผลลัพธ์: 6 แถว — วิชัยและมาลีมี NULL ในคอลัมน์ course_name, credits
Query 3: นักเรียนที่ยังไม่ลง
SELECT s.nameFROM students sLEFT JOIN enrollments e ON s.student_id = e.student_idWHERE e.enrollment_id IS NULL;ผลลัพธ์: วิชัย, มาลี
Query 4: วิชาที่ยังไม่มีใครลง
SELECT c.course_nameFROM courses cLEFT JOIN enrollments e ON c.course_id = e.course_idWHERE e.enrollment_id IS NULL;ผลลัพธ์: Machine Learning
Query 5: รวมหน่วยกิตต่อคน
SELECT s.name, COALESCE(SUM(c.credits), 0) AS total_creditsFROM students sLEFT JOIN enrollments e ON s.student_id = e.student_idLEFT JOIN courses c ON e.course_id = c.course_idGROUP BY s.student_id, s.nameORDER BY total_credits DESC;ผลลัพธ์: สมหญิง (7), สมชาย (6), วิชัย (0), มาลี (0)