สรุป SQL ฐานข้อมูล แบบไม่เคยเรียนก็เข้าใจ

อ่านตามลำดับ เริ่มจาก “ก่อนเริ่ม” แล้วไปหัวข้อ 1–4 ทุกตัวอย่างใช้ข้อมูลชุดเดียวกัน และมีตารางไล่ให้ดูทีละแถวว่าแถวไหนผ่าน แถวไหนไม่ผ่าน อ่านจบแล้วไปทำข้อสอบเสมือนจริง 40 ข้อ (ใช้เวลาอ่านประมาณ 30–40 นาที)

ชื่อฟิลด์ในหน้านี้เป็นตัวอย่าง ควรเทียบกับ Lab จริงอีกครั้ง

เนื้อหาจาก PDF ใน LMS (ฝึกเพิ่ม ไม่ได้อยู่ในแนวข้อสอบปลายภาค)

10ปรนัย
ข้อละ 0.5
5จับคู่
ข้อละ 0.5
10เติมคำตอบ
ข้อละ 0.5
5ตอบเป็นตัวเลข
ข้อละ 0.5
10วิเคราะห์สถานการณ์
ข้อละ 1 (40% ของคะแนน)

ในเว็บนี้ ข้อเติมคำและข้อตอบตัวเลขเป็นแบบ ลากคำไปวางในช่อง ไม่ต้องพิมพ์ (บนมือถือแตะคำ แล้วแตะช่องที่ต้องการวาง)

0

ก่อนเริ่ม: ฐานข้อมูลกับ SQL คืออะไร

สำหรับคนที่ไม่เคยเรียนมาก่อน อ่านส่วนนี้ก่อน

ฐานข้อมูล (Database) คือที่เก็บข้อมูลอย่างเป็นระเบียบ นึกภาพไฟล์ Excel ที่มีหลายชีต แต่ละชีตเก็บเรื่องเดียว เช่น ชีตนักศึกษา ชีตรายวิชา ชีตการลงทะเบียน ในฐานข้อมูลเราเรียกแต่ละชีตว่า ตาราง (Table)

SQL (อ่านว่า เอส-คิว-แอล หรือ ซีเควล) คือภาษาที่ใช้ “ถาม” ฐานข้อมูล เช่น “ขอรายชื่อนักศึกษาสาขา CS ที่เป็นผู้หญิง” เราเขียนเป็น SQL แล้วฐานข้อมูลจะตอบกลับมาเป็นตาราง

ส่วนประกอบของตาราง

ตาราง Student (ใช้เป็นตัวอย่างตลอดทั้งหน้า)

student_idfirst_namegenderdept_id
S01มาลีFCS
S02มานะMCS
S03ปิติMIT
S04ชูใจFIT
S05ดวงใจFCS
S06วีระMIS

F = หญิง (Female) · M = ชาย (Male) · CS วิทยาการคอมพิวเตอร์ · IT เทคโนโลยีสารสนเทศ · IS ระบบสารสนเทศ

ตาราง (Table)
ข้อมูล 1 เรื่อง เช่น ตารางนักศึกษา
แถว (Row / Record)
ข้อมูล 1 รายการ เช่น นักศึกษา 1 คน ตารางนี้มี 6 แถว
คอลัมน์ (Column / Field)
หัวข้อของข้อมูล เช่น gender ตารางนี้มี 4 คอลัมน์
ค่า (Value)
ข้อมูลในช่อง 1 ช่อง เช่น แถว S04 คอลัมน์ gender มีค่า F
NULL
ช่องที่ว่าง ไม่มีค่า (ไม่ใช่ 0 และไม่ใช่ข้อความว่าง)

อ่าน SQL ให้เหมือนอ่านประโยคภาษาไทย

SELECT first_name
FROM Student
WHERE dept_id = 'CS';

อ่านว่า“ขอดู ชื่อ (SELECT) จากตาราง Student (FROM) เฉพาะแถวที่ สาขาเป็น CS (WHERE)”
ได้ผลลัพธ์ 3 แถว: มาลี · มานะ · ดวงใจ

คำสั่งแปลว่าใช้ทำอะไร
SELECTเลือก / ขอดูบอกว่าอยากเห็น คอลัมน์ ไหน (* = ทุกคอลัมน์)
FROMจากบอกว่าเอาข้อมูลจาก ตาราง ไหน
WHEREที่ซึ่ง / เฉพาะที่กรองเอาเฉพาะ แถว ที่ตรงเงื่อนไข
ORDER BYเรียงตามเรียงลำดับผลลัพธ์
JOIN ... ONต่อกับ ... โดยจับคู่ที่เอาข้อมูลจาก 2 ตารางมาต่อกัน
COUNTนับนับจำนวนแถว
GROUP BYจัดกลุ่มตามแบ่งแถวเป็นกลุ่ม แล้วนับ/คำนวณแยกแต่ละกลุ่ม

กติกาการเขียนที่ต้องรู้: คำสั่งจบด้วย ; · ข้อความและวันที่ต้องอยู่ใน ' ' เช่น 'CS', '2026-06-01' · ตัวเลขไม่ต้องใส่ ' ' เช่น score >= 80 · คำสั่งเขียนตัวเล็กหรือตัวใหญ่ก็ได้ (select = SELECT) แต่นิยมเขียนตัวใหญ่ให้อ่านง่าย

1

ตารางและคีย์

รู้ว่าแต่ละตารางเก็บอะไร และเชื่อมกันด้วยฟิลด์ไหน

ทำไมต้องแยกเป็นหลายตาราง

ถ้าเก็บทุกอย่างไว้ในตารางเดียว ชื่อสาขา “วิทยาการคอมพิวเตอร์” จะถูกพิมพ์ซ้ำทุกแถวของนักศึกษา CS ถ้าวันหนึ่งสาขาเปลี่ยนชื่อ ต้องตามแก้ทุกแถว พลาดแถวเดียวข้อมูลก็ไม่ตรงกัน จึงแยกเก็บสาขาไว้ตาราง Department ที่เดียว แล้วให้นักศึกษาเก็บแค่ รหัสสาขา (dept_id) ไว้ชี้ไปหา

ระบบลงทะเบียน 8 ตาราง

เรื่องราวของระบบ: มหาวิทยาลัยมี สาขา (Department) แต่ละสาขามี นักศึกษา (Student) และ อาจารย์ (Instructor) มี รายวิชา (Course) ที่เปิดสอนในแต่ละ ภาคเรียน (Semester) วิชาหนึ่งเปิดได้หลาย กลุ่มเรียน (Section) นักศึกษา ลงทะเบียน (Enrollment) ในกลุ่มเรียน แล้วได้ เกรด (Grade)

ตารางเก็บอะไรPKFK (ชี้ไปที่)
Departmentสาขาวิชาและคณะdept_id–
Studentนักศึกษาและสาขาที่สังกัดstudent_iddept_id → Department
Instructorอาจารย์และสาขาที่สังกัดinstructor_iddept_id → Department
Courseรายวิชาและหน่วยกิต (เหมือนกันทุกกลุ่ม)course_id–
Semesterปีการศึกษาและภาคการศึกษาsemester_id–
Sectionกลุ่มเรียน: วิชาอะไร ภาคไหน ใครสอน ห้องไหน รับกี่คนsection_idcourse_id, semester_id, instructor_id
Enrollmentใครลงทะเบียนกลุ่มเรียนไหน (1 แถว = 1 รายการ)enroll_idstudent_id, section_id
Gradeคะแนนและเกรดของรายการลงทะเบียนgrade_idenroll_id → Enrollment

จุดที่คนสับสนบ่อย: Course กับ Section ต่างกัน Course = “วิชาฐานข้อมูล 3 หน่วยกิต” ส่วน Section = “วิชาฐานข้อมูล กลุ่ม 1 ภาค 1/2569 อาจารย์สมศักดิ์ ห้อง 401 รับ 40 คน” ข้อมูลผู้สอน ห้อง และจำนวนรับ จึงอยู่ที่ Section

Primary Key (PK) · คีย์หลัก

เหมือน “เลขบัตรประชาชน” ของแต่ละแถว มี 2 กฎ

  1. ห้ามซ้ำ สองแถวจะมี PK เดียวกันไม่ได้
  2. ห้ามว่าง ทุกแถวต้องมีค่า

เช่น Student.student_id ไม่มีนักศึกษาสองคนที่รหัส S01 · PK เป็นข้อความได้ ไม่จำเป็นต้องเป็นตัวเลข

Foreign Key (FK) · คีย์นอก

ฟิลด์ที่เก็บ ค่า PK ของอีกตาราง ใช้เป็นสะพานเชื่อมสองตาราง ค่าใน FK ซ้ำได้

เช่น Student.dept_id → Department.dept_id
มาลี (S01) มี dept_id = CS → เปิดตาราง Department แถว CS ก็รู้ว่าเป็น “วิทยาการคอมพิวเตอร์” · นักศึกษา 3 คนมี dept_id = CS เหมือนกันได้

ดูการเชื่อมด้วยตาเปล่า

Student (ส่วนหนึ่ง)

student_id (PK)dept_id (FK)
S01CS
S03IT
S06IS

Department

dept_id (PK)dept_name
CSวิทยาการคอมพิวเตอร์
ITเทคโนโลยีสารสนเทศ
ISระบบสารสนเทศ

ค่า CS ใน Student.dept_id ตรงกับ CS ใน Department.dept_id นี่คือการจับคู่ FK = PK ที่จะใช้ใน JOIN (หัวข้อ 3)

ชนิดข้อมูลที่ต้องรู้ และวิธีเลือก

INTจำนวนเต็ม ไม่มีทศนิยม
เช่น credit = 3, capacity = 40
DECIMALตัวเลขมีทศนิยม
เช่น score = 72.5
VARCHARข้อความ ต้องใส่ '...'
เช่น 'S01', 'มาลี'
DATEวันที่ รูปแบบ 'YYYY-MM-DD'
เช่น '2026-06-01'
  1. เป็นวันที่ไหม → ใช่ = DATE
  2. มีตัวอักษรปน หรือเป็นตัวเลขที่ไม่ได้เอาไปคำนวณ (รหัส เบอร์โทร) ไหม → ใช่ = VARCHAR
  3. เป็นตัวเลขที่มีทศนิยมไหม → ใช่ = DECIMAL · ไม่มีทศนิยม = INT
2

เลือก กรอง เรียง

SELECT · DISTINCT · WHERE · AND/OR · ORDER BY

ลำดับการเขียนคำสั่ง (ต้องเรียงแบบนี้เสมอ)

SELECTFROMJOINWHEREGROUP BYORDER BY

ไม่จำเป็นต้องมีครบทุกส่วน แต่ส่วนที่มีต้องอยู่ตามลำดับนี้ เช่น ORDER BY ต้องอยู่ท้ายสุดเสมอ

1) SELECT เลือกคอลัมน์

SELECT student_id, first_name
FROM Student;

อ่านว่าขอดูรหัสและชื่อ ของนักศึกษาทุกคน (ไม่มี WHERE = ทุกแถว)

ชื่อคอลัมน์คั่นด้วย , · ถ้าอยากได้ทุกคอลัมน์ใช้ SELECT *

ผลลัพธ์ (6 แถว 2 คอลัมน์)

student_idfirst_name
S01มาลี
S02มานะ
S03ปิติ
S04ชูใจ
S05ดวงใจ
S06วีระ

2) DISTINCT ตัดค่าที่ซ้ำ

SELECT dept_id FROM Student;          -- ได้ 6 แถว
SELECT DISTINCT dept_id FROM Student; -- ได้ 3 แถว

อ่านว่ามีรหัสสาขาอะไรบ้าง (แต่ละค่าแสดงครั้งเดียว)

ไม่มี DISTINCTมี DISTINCT
CS, CS, IT, IT, CS, ISCS, IT, IS

DISTINCT วางต่อจาก SELECT ทันที

3) WHERE กรองแถว

WHERE ทำงานเหมือนตะแกรง: ระบบเอาเงื่อนไขไปเทียบ ทีละแถว แถวไหนเงื่อนไขเป็นจริงจะผ่าน แถวไหนเป็นเท็จจะถูกทิ้ง

SELECT * FROM Student
WHERE gender = 'F';

อ่านว่าขอดูนักศึกษาทุกคอลัมน์ เฉพาะที่เพศเป็น F

ผลลัพธ์ 3 แถว: S01, S04, S05

แถวgendergender = 'F' ?
S01F✔ ผ่าน
S02M✘
S03M✘
S04F✔ ผ่าน
S05F✔ ผ่าน
S06M✘

ตัวดำเนินการใน WHERE พร้อมตัวอย่าง

เขียนความหมายตัวอย่างผ่านถ้า…
=เท่ากับdept_id = 'IT'S03, S04
<> หรือ !=ไม่เท่ากับdept_id <> 'CS'S03, S04, S06
> / <มากกว่า / น้อยกว่า (ไม่รวม ค่านั้น)score > 80คะแนน 85, 90 (80 พอดีไม่ผ่าน)
>= / <=ตั้งแต่…ขึ้นไป / …ลงมา (รวม ค่านั้น)score >= 80คะแนน 80 ขึ้นไป
BETWEEN a AND bอยู่ในช่วง a ถึง b รวมขอบทั้งสองscore BETWEEN 60 AND 7960 ≤ score ≤ 79 (60 และ 79 ผ่าน)
IN (...)ตรงกับค่าใดค่าหนึ่งในวงเล็บdept_id IN ('CS','IS')S01, S02, S05, S06
LIKE 'ม%'ขึ้นต้นด้วย ม (% = ตัวอักษรอะไรก็ได้ กี่ตัวก็ได้)first_name LIKE 'ม%'มาลี, มานะ
LIKE '%ใจ'ลงท้ายด้วย ใจfirst_name LIKE '%ใจ'ชูใจ, ดวงใจ
IS NULLช่องว่าง ไม่มีค่าgrade IS NULLแถวที่ยังไม่มีเกรด (ห้าม เขียน = NULL)

แปลภาษาไทยเป็นเครื่องหมาย: “ตั้งแต่ / ไม่น้อยกว่า / ขึ้นไป” = >= · “เกิน / มากกว่า” = > · “ไม่เกิน / ไม่มากกว่า” = <= · “ต่ำกว่า / น้อยกว่า” = < · “ระหว่าง…ถึง…” = BETWEEN

4) AND กับ OR

AND = “และ” ต้องจริงทั้งคู่

dept_id='CS' AND gender='F'

ต้องเป็น CS และ เป็นผู้หญิง → S01, S05 (2 คน)
ยิ่งใส่ AND มาก ผลยิ่ง น้อยลง

OR = “หรือ” จริงข้างเดียวก็พอ

dept_id='CS' OR gender='F'

เป็น CS หรือ เป็นผู้หญิงก็ได้ → S01, S02, S04, S05 (4 คน)
ยิ่งใส่ OR มาก ผลยิ่ง มากขึ้น

กับดักที่ออกสอบแน่: AND ทำก่อน OR

เหมือนคณิตศาสตร์ที่ × ทำก่อน + เช่น 2 + 3 × 4 = 14 ไม่ใช่ 20 ใน SQL ก็เช่นกัน ถ้าไม่ใส่วงเล็บ ระบบจะจับคู่ AND ก่อน

โจทย์: “นักศึกษาสาขา CS หรือ IT ที่เป็นเพศหญิง”

ผิดWHERE dept_id='CS' OR dept_id='IT' AND gender='F'ระบบอ่านเป็น CS OR (IT AND F) → CS ทุกคนผ่านหมดโดยไม่สนเพศ ได้ S01, S02, S04, S05 (มี S02 ผู้ชายหลุดมา)

ถูกWHERE (dept_id='CS' OR dept_id='IT') AND gender='F'

แถวdept / genderแบบผิด (ไม่มีวงเล็บ)แบบถูก (มีวงเล็บ)
S01CS / F✔✔
S02CS / M✔ (CS ผ่านเลย)✘ (ไม่ใช่ F)
S03IT / M✘✘
S04IT / F✔✔
S05CS / F✔✔
S06IS / M✘✘
รวม4 แถว3 แถว

จำง่าย: ถ้ามีทั้ง AND และ OR ในเงื่อนไขเดียวกัน ให้ใส่วงเล็บรอบ OR เสมอ

5) ORDER BY เรียงลำดับ

SELECT * FROM Grade
ORDER BY score DESC;           -- มาก → น้อย

SELECT * FROM Student
ORDER BY dept_id, student_id;  -- สาขาก่อน แล้วรหัส
  • ASC = น้อย → มาก (A → Z) และเป็นค่าเริ่มต้นถ้าไม่ใส่อะไร
  • DESC = มาก → น้อย (Z → A) จำ DESC = Down
  • หลายคอลัมน์: เรียงตามตัวแรกก่อน ตัวถัดไปใช้เมื่อค่าตัวแรกเท่ากัน

ผลของ ORDER BY dept_id, student_id

dept_idstudent_id
CSS01
CSS02
CSS05
ISS06
ITS03
ITS04

CS → IS → IT ตามตัวอักษร (S ก่อน T) ในกลุ่ม CS เรียง S01, S02, S05

3

JOIN และการนับ

เชื่อม FK = PK ตามเส้นทาง แล้วนับด้วย COUNT

JOIN คืออะไร

ข้อมูลที่อยากเห็นมักอยู่คนละตาราง เช่น อยากได้ “ชื่อนักศึกษา + ชื่อสาขา” แต่ชื่อนักศึกษาอยู่ Student ชื่อสาขาอยู่ Department JOIN คือการเอาสองตารางมาวางต่อกัน โดยจับคู่แถวที่มีค่าตรงกันตามเงื่อนไขหลัง ON

SELECT s.first_name, d.dept_name
FROM Student s
JOIN Department d
  ON s.dept_id = d.dept_id;

อ่านว่าเอาตาราง Student (ตั้งชื่อเล่นว่า s) มาต่อกับ Department (ชื่อเล่น d) โดยจับคู่แถวที่รหัสสาขาตรงกัน แล้วแสดงชื่อนักศึกษากับชื่อสาขา

  • Student s = ตั้งชื่อย่อ (alias) ให้ตาราง จะได้เขียน s.first_name แทน Student.first_name
  • s.dept_id = คอลัมน์ dept_id ของตาราง s ต้องระบุเพราะทั้งสองตารางมีคอลัมน์ชื่อนี้

ผลลัพธ์

first_namedept_name
มาลีวิทยาการคอมพิวเตอร์
มานะวิทยาการคอมพิวเตอร์
ปิติเทคโนโลยีสารสนเทศ
ชูใจเทคโนโลยีสารสนเทศ
ดวงใจวิทยาการคอมพิวเตอร์
วีระระบบสารสนเทศ

แผนที่การเชื่อมตาราง

วิธีหาเส้นทาง JOIN ใน 3 ขั้น

  1. ดูว่าข้อมูลที่โจทย์อยากเห็นอยู่ ตารางไหนบ้าง เช่น ชื่อวิชา (Course) + ชื่ออาจารย์ (Instructor)
  2. หาเส้นทางในแผนที่ ถ้าสองตารางไม่ติดกัน ต้อง ผ่านตารางตรงกลาง เช่น Course กับ Instructor ต้องผ่าน Section
  3. เขียน ON ทีละคู่ โดยใช้ ชื่อฟิลด์บนเส้น เช่น sec.course_id = c.course_id (ฟิลด์ชื่อเดียวกัน เก็บของชนิดเดียวกัน)

รายวิชา + กลุ่ม + ผู้สอน

SELECT c.course_name, sec.section_id,
       i.first_name
FROM Section sec
JOIN Course c
  ON sec.course_id = c.course_id
JOIN Instructor i
  ON sec.instructor_id = i.instructor_id;

Course กับ Instructor ไม่มีฟิลด์เชื่อมกันตรง ๆ จึงเริ่มจาก Section ซึ่งมีทั้ง course_id และ instructor_id

นักศึกษา + ลงทะเบียน + ผลการเรียน

SELECT s.student_id, e.section_id,
       g.score, g.grade
FROM Student s
JOIN Enrollment e
  ON s.student_id = e.student_id
JOIN Grade g
  ON e.enroll_id = g.enroll_id;

Grade ไม่มี student_id ต้องผ่าน Enrollment ก่อน: Student → Enrollment → Grade

INNER JOIN ตัดแถวที่ไม่มีคู่

JOIN เฉย ๆ คือ INNER JOIN แสดงเฉพาะแถวที่ หาคู่เจอ ในทั้งสองตาราง ดูตัวอย่างการจับ Student กับ Enrollment

Enrollment

enroll_idstudent_idsection_idenroll_datestatus
E01S01SEC12026-06-01Registered
E02S02SEC12026-06-01Registered
E03S03SEC12026-06-02Registered
E04S01SEC22026-06-03Registered
E05S04SEC22026-06-05Withdrawn
E06S05SEC32026-06-10Registered
E07S02SEC32026-06-12Registered

ผลของ Student JOIN Enrollment ON student_id

นักศึกษาจับคู่ได้กับได้กี่แถว
S01E01, E042
S02E02, E072
S03E031
S04E051
S05E061
S06ไม่มีคู่0 (ถูกตัดทิ้ง)
รวม7 แถว

คนที่ลงหลายวิชาจะโผล่หลายแถว คนที่ไม่ได้ลงเลยหายไป · ถ้าอยากเห็น S06 ด้วย (ค่า section_id เป็น NULL) ต้องใช้ LEFT JOIN

นับข้อมูลด้วย COUNT

คำสั่งนับอะไรตัวอย่างผล
COUNT(*)ทุกแถวSELECT COUNT(*) FROM Student; = 6
SELECT COUNT(*) FROM Enrollment; = 7
COUNT(คอลัมน์)แถวที่คอลัมน์นั้น ไม่ว่าง (ข้าม NULL)ถ้ามี 10 แถว แต่ grade ว่าง 2 แถว COUNT(grade) = 8
COUNT(DISTINCT คอลัมน์)จำนวนค่าที่ ไม่ซ้ำCOUNT(DISTINCT student_id) จาก Enrollment = 5 (S01–S05)
COUNT(DISTINCT dept_id) จาก Student = 3
... GROUP BY คอลัมน์นับแยกทีละกลุ่มCS 3 · IT 2 · IS 1

นับ “รายการ” หรือนับ “คน”? ใน Enrollment S01 ลง 2 วิชา ถ้าโจทย์ถามว่า “มีการลงทะเบียนกี่รายการ” ใช้ COUNT(*) = 7 แต่ถ้าถามว่า “มีนักศึกษากี่คนที่ลงทะเบียน” ใช้ COUNT(DISTINCT student_id) = 5

GROUP BY ทำงานอย่างไร

SELECT dept_id, COUNT(*)
FROM Student
GROUP BY dept_id;

อ่านว่าแบ่งนักศึกษาเป็นกองตามรหัสสาขา แล้วนับว่าแต่ละกองมีกี่คน

สัญญาณว่าต้องใช้ GROUP BY: โจทย์มีคำว่า “แต่ละ…” หรือ “แยกตาม…” · ถ้าลืม GROUP BY จะได้ตัวเลขรวมค่าเดียว (6) หรือระบบแจ้ง error

กองสมาชิกCOUNT(*)
CSS01, S02, S053
ITS03, S042
ISS061
4

วิเคราะห์ SQL และหาจุดผิด

ข้อ 31–40 มีค่า 10 คะแนน ฝึกส่วนนี้ให้คล่อง

จุดผิดที่ข้อสอบชอบออก

1. เชื่อมผิดฟิลด์

ผิดON s.student_id = d.dept_id

ถูกON s.dept_id = d.dept_id

รหัสนักศึกษา (S01) ไม่มีวันเท่ากับรหัสสาขา (CS) ต้องจับฟิลด์ที่เก็บของอย่างเดียวกัน

2. ใช้ OR แทน AND

โจทย์ “สาขา CS และเพศหญิง”

ผิดdept_id='CS' OR gender='F'

ถูกdept_id='CS' AND gender='F'

OR ได้ 4 แถว (เกิน) · AND ได้ 2 แถว

3. ลืมวงเล็บ

ผิดa OR b AND c

ถูก(a OR b) AND c

ไม่มีวงเล็บ ระบบอ่านเป็น a OR (b AND c)

4. ตรวจค่าว่างผิด

ผิดgrade = NULL

ถูกgrade IS NULL

= NULL ไม่เคยเป็นจริง จึงได้ 0 แถวเสมอ

5. ข้อความไม่มี ' '

ผิดdept_id = CS

ถูกdept_id = 'CS'

ไม่มี ' ' ระบบจะคิดว่า CS เป็นชื่อคอลัมน์ · วันที่ก็ต้องมี ' ' เช่น '2026-06-30'

6. นับแยกกลุ่มแต่ลืม GROUP BY

ผิดSELECT dept_id, COUNT(*) FROM Student;

ถูก... FROM Student GROUP BY dept_id;

โจทย์มีคำว่า “แต่ละ” ต้องมี GROUP BY

7. ใช้ > แทน >=

โจทย์ “ตั้งแต่ 80 ขึ้นไป”

ผิดscore > 80

ถูกscore >= 80

“ตั้งแต่” รวมค่านั้นด้วย

8. คิดว่า JOIN แสดงทุกคน

นักศึกษาที่ไม่ได้ลงทะเบียน

ผิดคิดว่ายังโผล่ แต่ช่องว่าง

ถูกไม่โผล่เลย (INNER JOIN)

ต้องใช้ LEFT JOIN ถ้าอยากให้โผล่

9. สลับ SELECT กับ FROM

ผิดSELECT Student FROM first_name;

ถูกSELECT first_name FROM Student;

หลัง SELECT = คอลัมน์ · หลัง FROM = ตาราง

อ่าน SQL แล้วหาผลลัพธ์ใน 4 ขั้น

  1. ดู FROM / JOIN: ใช้ตารางไหน ถ้ามี JOIN ให้จับคู่แถวก่อน (แถวที่ไม่มีคู่ทิ้งไป)
  2. ไล่ WHERE ทีละแถว เขียน ✔ / ✘ ข้างแถว (จำไว้ว่า AND ทำก่อน OR)
  3. ถ้ามี DISTINCT ตัดค่าที่ซ้ำ · ถ้ามี GROUP BY แบ่งกอง · ถ้ามี COUNT นับแถวที่เหลือ
  4. ถ้ามี ORDER BY และโจทย์ถาม “แถวแรก” ให้เรียงก่อนแล้วดูแถวบนสุด

ตัวอย่างทำทีละขั้น

SELECT COUNT(*) FROM Enrollment
WHERE status = 'Registered'
  AND enroll_date BETWEEN '2026-06-01' AND '2026-06-05';
แถวstatusenroll_dateRegistered?1–5 มิ.ย.?ผล (AND)
E01Registered2026-06-01✔✔ผ่าน
E02Registered2026-06-01✔✔ผ่าน
E03Registered2026-06-02✔✔ผ่าน
E04Registered2026-06-03✔✔ผ่าน
E05Withdrawn2026-06-05✘✔ไม่ผ่าน
E06Registered2026-06-10✔✘ไม่ผ่าน
E07Registered2026-06-12✔✘ไม่ผ่าน

AND ต้องได้ ✔ ทั้งสองช่อง จึงเหลือ E01–E04 → COUNT(*) = 4

ลองทำ (ใช้ตาราง Student ในหัวข้อ 0) กดเพื่อดูเฉลย

SELECT COUNT(*) FROM Student WHERE gender='F' AND dept_id <> 'CS';

เฉลย 1

  1. ผู้หญิงมี S01 (CS), S04 (IT), S05 (CS)
  2. <> 'CS' = ไม่ใช่ CS จึงตัด S01 และ S05 ออก
  3. เหลือ S04 คนเดียว
SELECT COUNT(*) FROM Student WHERE dept_id IN ('CS','IS') OR gender='M';

เฉลย 5

  1. IN ('CS','IS') ได้ S01, S02, S05, S06
  2. gender='M' ได้ S02, S03, S06
  3. OR = อยู่กลุ่มไหนก็ได้ รวมกันแล้วนับคนละครั้งเดียว: S01, S02, S03, S05, S06
  4. คนที่ไม่ผ่านมีแค่ S04 (IT และเป็นผู้หญิง) → 6 − 1 = 5
SELECT DISTINCT gender FROM Student; ได้กี่แถว

เฉลย 2 แถว

ค่า gender ทั้งหมดคือ F, M, M, F, F, M ตัดตัวซ้ำเหลือ F กับ M

SELECT first_name FROM Student WHERE first_name LIKE 'ม%' ORDER BY student_id DESC; แถวแรกคือใคร

เฉลย มานะ

  1. ชื่อขึ้นต้นด้วย ม: มาลี (S01), มานะ (S02)
  2. เรียง student_id มากไปน้อย: S02 ก่อน S01
  3. แถวแรกจึงเป็นมานะ
SELECT COUNT(DISTINCT dept_id) FROM Student WHERE gender='M';

เฉลย 3

  1. ผู้ชาย: S02 (CS), S03 (IT), S06 (IS)
  2. dept_id ที่ไม่ซ้ำ: CS, IT, IS → 3

เทคนิคทำข้อสอบแต่ละแบบ

ปรนัย / วิเคราะห์

ตัดตัวเลือกที่ผิดรูปแบบก่อน (ไม่มี ' ' · สลับ SELECT/FROM · จับฟิลด์คนละชนิด) แล้วค่อยเทียบที่เหลือกับโจทย์ทีละคำ “และ / หรือ / ตั้งแต่ / แต่ละ”

เติมคำ (ลากวาง)

อ่านคำที่อยู่รอบช่อง เช่น หลัง SELECT ก่อนชื่อคอลัมน์ = DISTINCT · หลัง ORDER BY score = ASC/DESC · หน้าชื่อตาราง + ON = JOIN

ตอบตัวเลข

อย่าคิดในหัว เขียน ✔/✘ ข้างทุกแถวตามขั้นตอนข้างบน แล้วนับ ระวังขอบของ BETWEEN และ DISTINCT

5

พื้นฐานฐานข้อมูล

PDF บทที่ 1 · แฟ้มข้อมูล ระบบฐานข้อมูล และ DBMS

ก่อนมีฐานข้อมูล แต่ละแผนกเก็บข้อมูลเป็น แฟ้ม ของตัวเอง (เหมือนแต่ละแผนกมีไฟล์ Excel ของใครของมัน) ทำให้ข้อมูลซ้ำและไม่ตรงกัน ฐานข้อมูล แก้ปัญหานี้ด้วยการรวมข้อมูลไว้ที่เดียวและให้ทุกคนใช้ร่วมกัน โดยมีโปรแกรม DBMS (เช่น MySQL) เป็นผู้จัดการ

โครงสร้างข้อมูล (เล็ก → ใหญ่)

BitByteFieldRecordFileDatabase

Bit = 0 หรือ 1 · 8 บิต = 1 ไบต์ (1 ตัวอักษร) · Field = 1 ช่องข้อมูล เช่น รหัสนักศึกษา · Record = ข้อมูล 1 คน (1 แถว) · File = หลายเรคอร์ดเรื่องเดียวกัน (1 ตาราง) · Database = หลายแฟ้มที่สัมพันธ์กัน

ประเภทแฟ้มข้อมูล

Masterข้อมูลหลักที่ค่อนข้างคงที่ เปลี่ยนไม่บ่อย เช่น แฟ้มพนักงาน แฟ้มสินค้า
Transactionรายการที่เกิดทุกวัน เช่น ขาย ลงทะเบียน ฝากถอน ใช้ไปปรับปรุงแฟ้ม Master
Documentรายงานที่ประมวลผลแล้ว เช่น ไฟล์ PDF รายงานยอดขาย
Archivalข้อมูลเก่าที่ย้ายไปเก็บแบบออฟไลน์ไว้เป็นหลักฐาน
Table Look-upตารางอ้างอิงค่าคงที่ เช่น รหัสไปรษณีย์ อัตราภาษี
AuditLog File บันทึกว่าใครทำอะไรเมื่อไร

ข้อจำกัดของระบบแฟ้มข้อมูล

  1. ข้อมูลแยกเก็บคนละที่ (Separation)
  2. ข้อมูลซ้ำซ้อน (Duplication) จึงเกิด Anomaly: เพิ่มไม่ครบ = Insertion · ลบไม่ครบ = Deletion · แก้ไม่ครบ = Modification
  3. ข้อมูลขึ้นต่อโปรแกรม (Data Dependence) แก้แฟ้มแล้วต้องแก้โปรแกรมตาม
  4. รูปแบบแฟ้มไม่ตรงกัน (Incompatible Formats)
  5. รายงานคงที่ตายตัว (Fixed Queries) อยากได้รายงานใหม่ต้องเขียนโปรแกรมใหม่

ลักษณะของฐานข้อมูล

Persistent คงอยู่ถาวร ปิดเครื่องไม่หาย · Shared ใช้ร่วมกันหลายคน · Interrelated ทุกแฟ้มสัมพันธ์กัน

ข้อดีของฐานข้อมูล

Program-Data Independence (แก้โครงสร้างโดยไม่ต้องแก้โปรแกรม) · ลดความซ้ำซ้อน · ข้อมูลสอดคล้องกัน · ใช้ข้อมูลร่วมกัน · มีมาตรฐานเดียวกัน · คุณภาพข้อมูลดีขึ้น

ภาษาใน DBMS

DDL Definition นิยามโครงสร้าง (CREATE, ALTER, DROP)
DML Manipulation จัดการข้อมูล (SELECT, INSERT, UPDATE, DELETE)
DCL Control ควบคุมสิทธิ์ (GRANT, REVOKE)

องค์ประกอบ 5 ส่วน

ฮาร์ดแวร์ · ซอฟต์แวร์ · ข้อมูล · กระบวนการทำงาน (คู่มือ/ระเบียบ) · บุคลากร (User, Programmer, Designer, Analyst, DBA)

DBA = ผู้ดูแลฐานข้อมูล: สร้างผู้ใช้ กำหนดสิทธิ์ สำรองและกู้คืนข้อมูล

ตัวเลขที่เป็นข้อความ: เบอร์โทร บ้านเลขที่ รหัสไปรษณีย์ ไม่ได้เอาไปคำนวณ จึงเป็นข้อมูลตัวอักษร (เก็บเป็นตัวเลขแล้ว 0 ข้างหน้า เช่น 081 จะหายไป)

6

สถาปัตยกรรมฐานข้อมูล

PDF บทที่ 2 · ANSI/SPARC 3 ระดับ แบบจำลอง คีย์ และกฎของ Codd

แบ่งฐานข้อมูลเป็น 3 ชั้น เพื่อให้แต่ละชั้นแก้ไขได้โดยไม่กระทบกัน เปรียบกับร้านอาหาร: ลูกค้าเห็นแค่เมนู (External) · ผู้จัดการรู้ว่ามีเมนูอะไร ใช้วัตถุดิบอะไร (Conceptual) · ในครัวรู้ว่าของเก็บไว้ตู้ไหน ชั้นไหน (Internal)

ระดับมุมมองของเห็นอะไร
External (ภายนอก)ผู้ใช้แต่ละคนView เฉพาะข้อมูลที่ตนต้องการ
Conceptual (แนวคิด)DBA, โปรแกรมเมอร์ภาพรวมทั้งหมด: เอนทิตี แอตทริบิวต์ ความสัมพันธ์ ข้อบังคับ
Internal (ภายใน)DBA ผ่าน OS/DBMSการจัดเก็บจริงบนดิสก์ ดัชนี B-Tree วิธีเข้าถึง

Mapping = ตัวแปลงระหว่างชั้น ทำให้แก้ชั้นหนึ่งแล้วชั้นอื่นไม่ต้องแก้

Physical Data Independence

แก้ระดับภายใน (ย้ายดิสก์ เปลี่ยนวิธีเก็บ สร้างดัชนี) ไม่กระทบระดับแนวคิดและภายนอก

คำใบ้: ดิสก์ · วิธีจัดเก็บ · ดัชนี

Logical Data Independence

แก้ระดับแนวคิด (เพิ่มตาราง เพิ่มฟิลด์) ไม่กระทบมุมมองของผู้ใช้

คำใบ้: ตาราง · ฟิลด์ · โครงสร้าง

แบบจำลองฐานข้อมูล

ลำดับชั้นต้นไม้ พ่อ–ลูก ลูกมีพ่อได้คนเดียว รองรับ 1:1, 1:M เท่านั้น
เครือข่ายลูกมีพ่อได้หลายโหนด รองรับ M:N
เชิงสัมพันธ์ตาราง 2 มิติ เชื่อมด้วยคีย์ นิยมที่สุด ใช้ SQL
เชิงวัตถุObject, Class, Method, Encapsulation

คำศัพท์ของรีเลชัน

Degree = จำนวนคอลัมน์ · Cardinality = จำนวนแถว · Domain = ขอบเขตค่าที่บันทึกได้ เช่น Min ≥ 5

ตาราง Student ในหัวข้อ 0 มี Degree = 4 และ Cardinality = 6

ประเภทคีย์

Primary Keyระบุแต่ละแถว ไม่ซ้ำ ห้าม Null
Composite KeyPK ที่ใช้ 2 แอตทริบิวต์ขึ้นไปรวมกัน เช่น (Pure_Id, P_Code)
Candidate Keyฟิลด์ที่เป็น PK ได้ (ไม่ซ้ำ) ตัวที่ไม่ถูกเลือกเรียก Alternate Key เช่น เลขบัตรประชาชน
Foreign KeyPK ของรีเลชันอื่นที่นำมาเชื่อมความสัมพันธ์
Super Keyแอตทริบิวต์หรือกลุ่มแอตทริบิวต์ใดก็ได้ที่ทำให้แถวไม่ซ้ำ

กฎของ Codd ที่ควรจำ

มี 13 ข้อ (0–12) เช่น ข้อ 1 ข้อมูลอยู่ในตาราง 2 มิติ · ข้อ 2 เข้าถึงค่าใดก็ได้ด้วยชื่อตาราง + PK + ชื่อคอลัมน์ · ข้อ 3 Null ต่างจาก 0 และช่องว่าง · ข้อ 8–9 อิสระเชิงกายภาพและเชิงตรรกะ

7

วิเคราะห์และออกแบบฐานข้อมูล

PDF บทที่ 3 · วงจรการพัฒนาระบบฐานข้อมูล (DSDLC)

DSDLC มี 6 ระยะ เปรียบกับการสร้างบ้าน: สำรวจความต้องการ → เขียนแบบ → ก่อสร้าง → ตรวจรับ → เข้าอยู่ → ซ่อมบำรุง

Initial StudyDesignImplementationTestingOperationMaintenance

1. ศึกษาข้อมูลเบื้องต้น

  1. วิเคราะห์สถานการณ์บริษัท: สัมภาษณ์ (ได้ข้อมูลเชิงลึก) · แบบสอบถาม (คนจำนวนมาก) · สังเกต (เห็นขั้นตอนจริง) · ทบทวนเอกสาร (แบบฟอร์ม รายงาน คู่มือ)
  2. กำหนดปัญหาและเงื่อนไข
  3. กำหนดวัตถุประสงค์
  4. กำหนด Scope (ระบบต้องทำอะไรได้ เช่น ยืม-คืน) และ Boundaries (ข้อจำกัดภายนอก: งบ ฮาร์ดแวร์ เวลา)

2. ออกแบบฐานข้อมูล (สำคัญที่สุด)

① Conceptualเขียน E-R Model (ยังไม่สนว่าใช้โปรแกรมอะไร)
② DBMS Selectionเลือก DBMS จากต้นทุน เครื่องมือ แบบจำลอง การขยาย ฮาร์ดแวร์
③ Logicalแปลง E-R → ตาราง ได้ PK/FK · Normalization ลดความซ้ำซ้อน · พจนานุกรมข้อมูล
④ Physicalเลือกสื่อจัดเก็บและวิธีเข้าถึงข้อมูล

สำคัญที่สุดเพราะออกแบบผิด ระยะหลังผิดตามหมด

Implementation ติดตั้ง DBMS สร้างฐานข้อมูลด้วย DDL บรรจุข้อมูล กำหนดสิทธิ์ · Testing ทดสอบประสิทธิภาพ ความปลอดภัย ความคงสภาพ · Operation ใช้งานจริงบนเซิร์ฟเวอร์ · Maintenance หลังใช้งานไปแล้ว: แผนสำรองข้อมูลและตรวจประสิทธิภาพ

8

แบบจำลอง E-R (Chen Model)

PDF บทที่ 4 · สัญลักษณ์ ประเภท และการแปลงเป็นตาราง

E-R Diagram คือแผนภาพที่วาดก่อนสร้างตาราง บอกว่ามี สิ่งของ (Entity) อะไรบ้าง เช่น นักศึกษา วิชา แต่ละอย่างมี คุณสมบัติ (Attribute) อะไร และ เกี่ยวข้องกัน (Relationship) อย่างไร เช่น นักศึกษา “ลงทะเบียน” วิชา

สัญลักษณ์

สี่เหลี่ยมผืนผ้าStrong Entity (อยู่ได้ด้วยตัวเอง)
สี่เหลี่ยมเส้นคู่Weak Entity (อยู่ได้เมื่อมีเอนทิตีหลัก)
สี่เหลี่ยมซ้อนข้าวหลามตัดAssociative Entity (เกิดจาก M:N)
ข้าวหลามตัดRelationship (ใส่คำกริยา)
วงรีSimple / Single-Value Attribute
วงรีแตกย่อยComposite เช่น ที่อยู่, ชื่อ-สกุล
วงรีเส้นประDerived เช่น อายุจากวันเกิด
วงรีซ้อนกันMulti-valued เช่น วุฒิการศึกษา

ดีกรีของความสัมพันธ์ (นับจำนวนเอนทิตี)

Unary 1 เอนทิตี ภายในตัวเอง (หัวหน้า–ลูกน้อง) · Binary 2 เอนทิตี (1:1, 1:M, M:N) · Ternary 3 เอนทิตี (รถ–ช่าง–อะไหล่)

อัตราส่วนความสัมพันธ์

1:1 คนหนึ่งมีบัตรประชาชนใบเดียว · 1:M สาขาหนึ่งมีนักศึกษาหลายคน · M:N นักศึกษาหลายคนลงหลายวิชา

ขั้นตอนเขียน E-R

  1. ศึกษาระบบงาน
  2. กำหนดเอนทิตี
  3. กำหนดความสัมพันธ์
  4. กำหนดแอตทริบิวต์
  5. กำหนดคีย์หลัก (ขีดเส้นใต้)
  6. วาดแผนภาพ
  7. ตรวจสอบกับผู้ใช้

กฎการแปลง E-R เป็นตาราง

1:1

นำ PK ฝั่งใดฝั่งหนึ่งไปเป็น FK อีกฝั่ง

1:M

นำ PK ฝั่ง 1 ไปเป็น FK ฝั่ง M (เหมือน Student.dept_id)

Room(room_no, rate, type, a_no)

M:N

เพิ่มตารางที่ 3 ใช้ PK ทั้งสองฝั่งรวมกันเป็น PK (เหมือน Enrollment)

Sale(E_id, P_no, Amount, Date)

Weak Entity

PK ของ Strong + คีย์ของ Weak

Family(E_id, No, F_name)

Multi-valued

แยกตารางใหม่ PK = PK เดิม + แอตทริบิวต์นั้น (1 แถว = 1 ค่า)

Employees_Degree(E_id, Degree)

Composite / Derived / Unary

Composite เก็บเฉพาะฟิลด์ย่อย · Derived ไม่นิยมเก็บเพราะคำนวณได้ · Unary เพิ่มฟิลด์ที่ชี้กลับตารางเดิม เช่น boss_id

9

SQL นิยามข้อมูล (DDL)

PDF บทที่ 5 · CREATE · ALTER · DROP · INDEX · VIEW

DDL ใช้สร้างและแก้ โครง ของตาราง (เหมือนตีเส้นตารางเปล่า) ส่วนการใส่ข้อมูลลงไปเป็นหน้าที่ของ DML (INSERT)

สร้างตารางและกำหนด PK

-- แบบที่ 1 ต่อท้ายคอลัมน์
CREATE TABLE book (
  book_id varchar(7) PRIMARY KEY,
  book_name varchar(100)
);

-- แบบที่ 2 ประกาศแยก (ใช้แบบนี้ถ้า PK มีหลายคอลัมน์)
CREATE TABLE book (
  book_id varchar(7),
  book_name varchar(100),
  PRIMARY KEY(book_id)
);

แก้ไขและลบ

ALTER TABLE book ADD author varchar(50);            -- เพิ่มคอลัมน์
ALTER TABLE book MODIFY COLUMN author varchar(100); -- แก้ชนิด/ขนาด
ALTER TABLE book DROP author;                       -- ลบคอลัมน์
DROP TABLE book;                                    -- ลบทั้งตาราง

CREATE INDEX book_name_idx ON book(book_name);
DROP INDEX book_name_idx ON book;

CREATE VIEW member_library AS
  SELECT name, address FROM member;
DROP VIEW member_library;

ชนิดข้อมูล MySQL ที่ควรรู้

CHAR(M)ยาวคงที่ เติมช่องว่างให้ครบ M
'Hello' ใน char(10) ใช้ 10 ช่อง
VARCHAR(M)ยาวตามข้อมูลจริง เหมาะกับชื่อ
'Hello' ใน varchar(10) ใช้ 5 ช่อง
DATE / DATETIMEYYYY-MM-DD / YYYY-MM-DD HH:MM:SS
INT / DECIMALจำนวนเต็ม / ทศนิยมแม่นยำ

View คือตารางเสมือนที่ไม่เก็บข้อมูลจริง เป็นเหมือนหน้าต่างที่มองเห็นแค่บางคอลัมน์ เช่น บรรณารักษ์เห็นชื่อและที่อยู่ แต่ไม่เห็นรหัสผ่าน · Index เหมือนสารบัญท้ายเล่ม ช่วยค้นหาและเรียงข้อมูลที่ใช้บ่อยให้เร็วขึ้น

10

ทรานแซกชันและความปลอดภัย

PDF บทที่ 6 · ACID การทำงานพร้อมกัน การล็อก การกู้คืน

ทรานแซกชัน คือชุดคำสั่งที่ต้องสำเร็จไปด้วยกัน เช่น โอนเงิน = หักบัญชี A + เพิ่มบัญชี B ถ้าทำได้แค่ครึ่งเดียวเงินจะหาย จึงต้องมีคุณสมบัติ ACID

Atomicityทำครบทุกคำสั่ง หรือยกเลิกทั้งหมด (หักแล้วต้องเพิ่ม)
Consistencyผลลัพธ์ถูกต้องตามข้อบังคับเสมอ (ห้ามโอนเกินยอด)
Isolationแก้ข้อมูลชุดเดียวกันพร้อมกันไม่ได้ ต้องรอคิว
Durabilityเสร็จแล้วข้อมูลคงทน แม้ไฟดับ

สถานะ: Begin → Active → Partially Committed → Committed · ถ้าผิดพลาด: Failed → Aborted (Rollback) · COMMIT = ยืนยันบันทึกถาวร · ROLLBACK = ยกเลิกกลับเป็นเหมือนเดิม

ปัญหาการทำงานพร้อมกัน

Lost Updateสองคนอ่านค่าเดียวกันแล้วเขียนทับกัน ยอด 35 ซื้อเพิ่ม 100 ขาย 30 ควรได้ 105 แต่ได้ 5 เพราะการขายเขียนทับ
Uncommitted Dependencyอ่านค่าที่ยังไม่ Commit แล้วต้นทาง Rollback ค่าที่คิดต่อจึงผิด
Inconsistent Analysisอ่านหลายค่าเพื่อรวมผล ระหว่างที่อีกรายการกำลังแก้ ผลรวมจึงผิด
Deadlockต่างฝ่ายต่างล็อกของตัวเองและรอของอีกฝ่าย รอกันไม่สิ้นสุด

การควบคุม

Shared Lock (ล็อกอ่าน) คนอื่นอ่านได้ แต่แก้ไม่ได้ · Exclusive Lock (ล็อกเขียน) ห้ามทั้งอ่านและแก้

ระดับการล็อก: ฐานข้อมูล › ตาราง › เรคอร์ด › ฟิลด์

ไม่ใช้การล็อก: Optimistic (ทำไปก่อน ตรวจตอนจบ ขัดแย้งให้ Rollback) · Timestamp (เรียงตามเวลาหรือ Counter)

ความขัดข้อง

System Failure = Soft Crash (ระบบค้าง ข้อมูลในหน่วยความจำหาย ดิสก์ไม่เป็นอะไร) · Transaction Failure · Media Failure = Hard Crash (ดิสก์เสีย ต้องกู้จาก Backup)

ความปลอดภัย (CIA)

Confidentiality ความลับ (Username/Password) · Integrity ข้อมูลไม่ถูกแก้โดยไม่ได้รับอนุญาต · Availability พร้อมใช้เสมอ

วิธีควบคุม

Authentication ตรวจว่า “เป็นใคร” · Authorization กำหนดว่า “ทำอะไรได้” · Encryption เข้ารหัส · Backup สำรองข้อมูล

พร้อมแล้วใช่ไหม?

ข้อสอบเสมือนจริง 40 ข้อ รูปแบบเดียวกับสอบจริง จับเวลา 120 นาที ข้อเติมคำเป็นแบบลากวาง มีเฉลยและคำอธิบายทีละขั้นทุกข้อ

ไปทำข้อสอบ