สรุป SQL ฐานข้อมูล แบบไม่เคยเรียนก็เข้าใจ
อ่านตามลำดับ เริ่มจาก “ก่อนเริ่ม” แล้วไปหัวข้อ 1–4 ทุกตัวอย่างใช้ข้อมูลชุดเดียวกัน และมีตารางไล่ให้ดูทีละแถวว่าแถวไหนผ่าน แถวไหนไม่ผ่าน อ่านจบแล้วไปทำข้อสอบเสมือนจริง 40 ข้อ (ใช้เวลาอ่านประมาณ 30–40 นาที)
ชื่อฟิลด์ในหน้านี้เป็นตัวอย่าง ควรเทียบกับ Lab จริงอีกครั้ง
เนื้อหาจาก PDF ใน LMS (ฝึกเพิ่ม ไม่ได้อยู่ในแนวข้อสอบปลายภาค)
ข้อละ 0.5
ข้อละ 0.5
ข้อละ 0.5
ข้อละ 0.5
ข้อละ 1 (40% ของคะแนน)
ในเว็บนี้ ข้อเติมคำและข้อตอบตัวเลขเป็นแบบ ลากคำไปวางในช่อง ไม่ต้องพิมพ์ (บนมือถือแตะคำ แล้วแตะช่องที่ต้องการวาง)
ก่อนเริ่ม: ฐานข้อมูลกับ SQL คืออะไร
สำหรับคนที่ไม่เคยเรียนมาก่อน อ่านส่วนนี้ก่อน
ฐานข้อมูล (Database) คือที่เก็บข้อมูลอย่างเป็นระเบียบ นึกภาพไฟล์ Excel ที่มีหลายชีต แต่ละชีตเก็บเรื่องเดียว เช่น ชีตนักศึกษา ชีตรายวิชา ชีตการลงทะเบียน ในฐานข้อมูลเราเรียกแต่ละชีตว่า ตาราง (Table)
SQL (อ่านว่า เอส-คิว-แอล หรือ ซีเควล) คือภาษาที่ใช้ “ถาม” ฐานข้อมูล เช่น “ขอรายชื่อนักศึกษาสาขา CS ที่เป็นผู้หญิง” เราเขียนเป็น SQL แล้วฐานข้อมูลจะตอบกลับมาเป็นตาราง
ส่วนประกอบของตาราง
ตาราง Student (ใช้เป็นตัวอย่างตลอดทั้งหน้า)
| student_id | first_name | gender | dept_id |
|---|---|---|---|
| S01 | มาลี | F | CS |
| S02 | มานะ | M | CS |
| S03 | ปิติ | M | IT |
| S04 | ชูใจ | F | IT |
| S05 | ดวงใจ | F | CS |
| S06 | วีระ | M | IS |
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) แต่นิยมเขียนตัวใหญ่ให้อ่านง่าย
ตารางและคีย์
รู้ว่าแต่ละตารางเก็บอะไร และเชื่อมกันด้วยฟิลด์ไหน
ทำไมต้องแยกเป็นหลายตาราง
ถ้าเก็บทุกอย่างไว้ในตารางเดียว ชื่อสาขา “วิทยาการคอมพิวเตอร์” จะถูกพิมพ์ซ้ำทุกแถวของนักศึกษา CS ถ้าวันหนึ่งสาขาเปลี่ยนชื่อ ต้องตามแก้ทุกแถว พลาดแถวเดียวข้อมูลก็ไม่ตรงกัน จึงแยกเก็บสาขาไว้ตาราง Department ที่เดียว แล้วให้นักศึกษาเก็บแค่ รหัสสาขา (dept_id) ไว้ชี้ไปหา
ระบบลงทะเบียน 8 ตาราง
เรื่องราวของระบบ: มหาวิทยาลัยมี สาขา (Department) แต่ละสาขามี นักศึกษา (Student) และ อาจารย์ (Instructor) มี รายวิชา (Course) ที่เปิดสอนในแต่ละ ภาคเรียน (Semester) วิชาหนึ่งเปิดได้หลาย กลุ่มเรียน (Section) นักศึกษา ลงทะเบียน (Enrollment) ในกลุ่มเรียน แล้วได้ เกรด (Grade)
| ตาราง | เก็บอะไร | PK | FK (ชี้ไปที่) |
|---|---|---|---|
| Department | สาขาวิชาและคณะ | dept_id | – |
| Student | นักศึกษาและสาขาที่สังกัด | student_id | dept_id → Department |
| Instructor | อาจารย์และสาขาที่สังกัด | instructor_id | dept_id → Department |
| Course | รายวิชาและหน่วยกิต (เหมือนกันทุกกลุ่ม) | course_id | – |
| Semester | ปีการศึกษาและภาคการศึกษา | semester_id | – |
| Section | กลุ่มเรียน: วิชาอะไร ภาคไหน ใครสอน ห้องไหน รับกี่คน | section_id | course_id, semester_id, instructor_id |
| Enrollment | ใครลงทะเบียนกลุ่มเรียนไหน (1 แถว = 1 รายการ) | enroll_id | student_id, section_id |
| Grade | คะแนนและเกรดของรายการลงทะเบียน | grade_id | enroll_id → Enrollment |
จุดที่คนสับสนบ่อย: Course กับ Section ต่างกัน Course = “วิชาฐานข้อมูล 3 หน่วยกิต” ส่วน Section = “วิชาฐานข้อมูล กลุ่ม 1 ภาค 1/2569 อาจารย์สมศักดิ์ ห้อง 401 รับ 40 คน” ข้อมูลผู้สอน ห้อง และจำนวนรับ จึงอยู่ที่ Section
Primary Key (PK) · คีย์หลัก
เหมือน “เลขบัตรประชาชน” ของแต่ละแถว มี 2 กฎ
- ห้ามซ้ำ สองแถวจะมี PK เดียวกันไม่ได้
- ห้ามว่าง ทุกแถวต้องมีค่า
เช่น 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) |
|---|---|
| S01 | CS |
| S03 | IT |
| S06 | IS |
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'
- เป็นวันที่ไหม → ใช่ =
DATE - มีตัวอักษรปน หรือเป็นตัวเลขที่ไม่ได้เอาไปคำนวณ (รหัส เบอร์โทร) ไหม → ใช่ =
VARCHAR - เป็นตัวเลขที่มีทศนิยมไหม → ใช่ =
DECIMAL· ไม่มีทศนิยม =INT
เลือก กรอง เรียง
SELECT · DISTINCT · WHERE · AND/OR · ORDER BY
ลำดับการเขียนคำสั่ง (ต้องเรียงแบบนี้เสมอ)
ไม่จำเป็นต้องมีครบทุกส่วน แต่ส่วนที่มีต้องอยู่ตามลำดับนี้ เช่น ORDER BY ต้องอยู่ท้ายสุดเสมอ
1) SELECT เลือกคอลัมน์
SELECT student_id, first_name
FROM Student;
อ่านว่าขอดูรหัสและชื่อ ของนักศึกษาทุกคน (ไม่มี WHERE = ทุกแถว)
ชื่อคอลัมน์คั่นด้วย , · ถ้าอยากได้ทุกคอลัมน์ใช้ SELECT *
ผลลัพธ์ (6 แถว 2 คอลัมน์)
| student_id | first_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, IS | CS, IT, IS |
DISTINCT วางต่อจาก SELECT ทันที
3) WHERE กรองแถว
WHERE ทำงานเหมือนตะแกรง: ระบบเอาเงื่อนไขไปเทียบ ทีละแถว แถวไหนเงื่อนไขเป็นจริงจะผ่าน แถวไหนเป็นเท็จจะถูกทิ้ง
SELECT * FROM Student
WHERE gender = 'F';
อ่านว่าขอดูนักศึกษาทุกคอลัมน์ เฉพาะที่เพศเป็น F
ผลลัพธ์ 3 แถว: S01, S04, S05
| แถว | gender | gender = 'F' ? |
|---|---|---|
| S01 | F | ✔ ผ่าน |
| S02 | M | ✘ |
| S03 | M | ✘ |
| S04 | F | ✔ ผ่าน |
| S05 | F | ✔ ผ่าน |
| S06 | M | ✘ |
ตัวดำเนินการใน 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 79 | 60 ≤ 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 | แบบผิด (ไม่มีวงเล็บ) | แบบถูก (มีวงเล็บ) |
|---|---|---|---|
| S01 | CS / F | ✔ | ✔ |
| S02 | CS / M | ✔ (CS ผ่านเลย) | ✘ (ไม่ใช่ F) |
| S03 | IT / M | ✘ | ✘ |
| S04 | IT / F | ✔ | ✔ |
| S05 | CS / F | ✔ | ✔ |
| S06 | IS / 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_id | student_id |
|---|---|
| CS | S01 |
| CS | S02 |
| CS | S05 |
| IS | S06 |
| IT | S03 |
| IT | S04 |
CS → IS → IT ตามตัวอักษร (S ก่อน T) ในกลุ่ม CS เรียง S01, S02, S05
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_names.dept_id= คอลัมน์ dept_id ของตาราง s ต้องระบุเพราะทั้งสองตารางมีคอลัมน์ชื่อนี้
ผลลัพธ์
| first_name | dept_name |
|---|---|
| มาลี | วิทยาการคอมพิวเตอร์ |
| มานะ | วิทยาการคอมพิวเตอร์ |
| ปิติ | เทคโนโลยีสารสนเทศ |
| ชูใจ | เทคโนโลยีสารสนเทศ |
| ดวงใจ | วิทยาการคอมพิวเตอร์ |
| วีระ | ระบบสารสนเทศ |
แผนที่การเชื่อมตาราง
วิธีหาเส้นทาง JOIN ใน 3 ขั้น
- ดูว่าข้อมูลที่โจทย์อยากเห็นอยู่ ตารางไหนบ้าง เช่น ชื่อวิชา (Course) + ชื่ออาจารย์ (Instructor)
- หาเส้นทางในแผนที่ ถ้าสองตารางไม่ติดกัน ต้อง ผ่านตารางตรงกลาง เช่น Course กับ Instructor ต้องผ่าน Section
- เขียน 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_id | student_id | section_id | enroll_date | status |
|---|---|---|---|---|
| E01 | S01 | SEC1 | 2026-06-01 | Registered |
| E02 | S02 | SEC1 | 2026-06-01 | Registered |
| E03 | S03 | SEC1 | 2026-06-02 | Registered |
| E04 | S01 | SEC2 | 2026-06-03 | Registered |
| E05 | S04 | SEC2 | 2026-06-05 | Withdrawn |
| E06 | S05 | SEC3 | 2026-06-10 | Registered |
| E07 | S02 | SEC3 | 2026-06-12 | Registered |
ผลของ Student JOIN Enrollment ON student_id
| นักศึกษา | จับคู่ได้กับ | ได้กี่แถว |
|---|---|---|
| S01 | E01, E04 | 2 |
| S02 | E02, E07 | 2 |
| S03 | E03 | 1 |
| S04 | E05 | 1 |
| S05 | E06 | 1 |
| S06 | ไม่มีคู่ | 0 (ถูกตัดทิ้ง) |
| รวม | 7 แถว | |
คนที่ลงหลายวิชาจะโผล่หลายแถว คนที่ไม่ได้ลงเลยหายไป · ถ้าอยากเห็น S06 ด้วย (ค่า section_id เป็น NULL) ต้องใช้ LEFT JOIN
นับข้อมูลด้วย COUNT
| คำสั่ง | นับอะไร | ตัวอย่างผล |
|---|---|---|
COUNT(*) | ทุกแถว | SELECT COUNT(*) FROM Student; = 6SELECT 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(*) |
|---|---|---|
| CS | S01, S02, S05 | 3 |
| IT | S03, S04 | 2 |
| IS | S06 | 1 |
วิเคราะห์ 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 ขั้น
- ดู FROM / JOIN: ใช้ตารางไหน ถ้ามี JOIN ให้จับคู่แถวก่อน (แถวที่ไม่มีคู่ทิ้งไป)
- ไล่ WHERE ทีละแถว เขียน ✔ / ✘ ข้างแถว (จำไว้ว่า AND ทำก่อน OR)
- ถ้ามี DISTINCT ตัดค่าที่ซ้ำ · ถ้ามี GROUP BY แบ่งกอง · ถ้ามี COUNT นับแถวที่เหลือ
- ถ้ามี ORDER BY และโจทย์ถาม “แถวแรก” ให้เรียงก่อนแล้วดูแถวบนสุด
ตัวอย่างทำทีละขั้น
SELECT COUNT(*) FROM Enrollment
WHERE status = 'Registered'
AND enroll_date BETWEEN '2026-06-01' AND '2026-06-05';
| แถว | status | enroll_date | Registered? | 1–5 มิ.ย.? | ผล (AND) |
|---|---|---|---|---|---|
| E01 | Registered | 2026-06-01 | ✔ | ✔ | ผ่าน |
| E02 | Registered | 2026-06-01 | ✔ | ✔ | ผ่าน |
| E03 | Registered | 2026-06-02 | ✔ | ✔ | ผ่าน |
| E04 | Registered | 2026-06-03 | ✔ | ✔ | ผ่าน |
| E05 | Withdrawn | 2026-06-05 | ✘ | ✔ | ไม่ผ่าน |
| E06 | Registered | 2026-06-10 | ✔ | ✘ | ไม่ผ่าน |
| E07 | Registered | 2026-06-12 | ✔ | ✘ | ไม่ผ่าน |
AND ต้องได้ ✔ ทั้งสองช่อง จึงเหลือ E01–E04 → COUNT(*) = 4
ลองทำ (ใช้ตาราง Student ในหัวข้อ 0) กดเพื่อดูเฉลย
SELECT COUNT(*) FROM Student WHERE gender='F' AND dept_id <> 'CS';
เฉลย 1
- ผู้หญิงมี S01 (CS), S04 (IT), S05 (CS)
<> 'CS'= ไม่ใช่ CS จึงตัด S01 และ S05 ออก- เหลือ S04 คนเดียว
SELECT COUNT(*) FROM Student WHERE dept_id IN ('CS','IS') OR gender='M';
เฉลย 5
IN ('CS','IS')ได้ S01, S02, S05, S06gender='M'ได้ S02, S03, S06- OR = อยู่กลุ่มไหนก็ได้ รวมกันแล้วนับคนละครั้งเดียว: S01, S02, S03, S05, S06
- คนที่ไม่ผ่านมีแค่ 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; แถวแรกคือใคร
เฉลย มานะ
- ชื่อขึ้นต้นด้วย ม: มาลี (S01), มานะ (S02)
- เรียง student_id มากไปน้อย: S02 ก่อน S01
- แถวแรกจึงเป็นมานะ
SELECT COUNT(DISTINCT dept_id) FROM Student WHERE gender='M';
เฉลย 3
- ผู้ชาย: S02 (CS), S03 (IT), S06 (IS)
- dept_id ที่ไม่ซ้ำ: CS, IT, IS → 3
เทคนิคทำข้อสอบแต่ละแบบ
ปรนัย / วิเคราะห์
ตัดตัวเลือกที่ผิดรูปแบบก่อน (ไม่มี ' ' · สลับ SELECT/FROM · จับฟิลด์คนละชนิด) แล้วค่อยเทียบที่เหลือกับโจทย์ทีละคำ “และ / หรือ / ตั้งแต่ / แต่ละ”
เติมคำ (ลากวาง)
อ่านคำที่อยู่รอบช่อง เช่น หลัง SELECT ก่อนชื่อคอลัมน์ = DISTINCT · หลัง ORDER BY score = ASC/DESC · หน้าชื่อตาราง + ON = JOIN
ตอบตัวเลข
อย่าคิดในหัว เขียน ✔/✘ ข้างทุกแถวตามขั้นตอนข้างบน แล้วนับ ระวังขอบของ BETWEEN และ DISTINCT
พื้นฐานฐานข้อมูล
PDF บทที่ 1 · แฟ้มข้อมูล ระบบฐานข้อมูล และ DBMS
ก่อนมีฐานข้อมูล แต่ละแผนกเก็บข้อมูลเป็น แฟ้ม ของตัวเอง (เหมือนแต่ละแผนกมีไฟล์ Excel ของใครของมัน) ทำให้ข้อมูลซ้ำและไม่ตรงกัน ฐานข้อมูล แก้ปัญหานี้ด้วยการรวมข้อมูลไว้ที่เดียวและให้ทุกคนใช้ร่วมกัน โดยมีโปรแกรม DBMS (เช่น MySQL) เป็นผู้จัดการ
โครงสร้างข้อมูล (เล็ก → ใหญ่)
Bit = 0 หรือ 1 · 8 บิต = 1 ไบต์ (1 ตัวอักษร) · Field = 1 ช่องข้อมูล เช่น รหัสนักศึกษา · Record = ข้อมูล 1 คน (1 แถว) · File = หลายเรคอร์ดเรื่องเดียวกัน (1 ตาราง) · Database = หลายแฟ้มที่สัมพันธ์กัน
ประเภทแฟ้มข้อมูล
| Master | ข้อมูลหลักที่ค่อนข้างคงที่ เปลี่ยนไม่บ่อย เช่น แฟ้มพนักงาน แฟ้มสินค้า |
|---|---|
| Transaction | รายการที่เกิดทุกวัน เช่น ขาย ลงทะเบียน ฝากถอน ใช้ไปปรับปรุงแฟ้ม Master |
| Document | รายงานที่ประมวลผลแล้ว เช่น ไฟล์ PDF รายงานยอดขาย |
| Archival | ข้อมูลเก่าที่ย้ายไปเก็บแบบออฟไลน์ไว้เป็นหลักฐาน |
| Table Look-up | ตารางอ้างอิงค่าคงที่ เช่น รหัสไปรษณีย์ อัตราภาษี |
| Audit | Log File บันทึกว่าใครทำอะไรเมื่อไร |
ข้อจำกัดของระบบแฟ้มข้อมูล
- ข้อมูลแยกเก็บคนละที่ (Separation)
- ข้อมูลซ้ำซ้อน (Duplication) จึงเกิด Anomaly: เพิ่มไม่ครบ = Insertion · ลบไม่ครบ = Deletion · แก้ไม่ครบ = Modification
- ข้อมูลขึ้นต่อโปรแกรม (Data Dependence) แก้แฟ้มแล้วต้องแก้โปรแกรมตาม
- รูปแบบแฟ้มไม่ตรงกัน (Incompatible Formats)
- รายงานคงที่ตายตัว (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 จะหายไป)
สถาปัตยกรรมฐานข้อมูล
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 Key | PK ที่ใช้ 2 แอตทริบิวต์ขึ้นไปรวมกัน เช่น (Pure_Id, P_Code) |
| Candidate Key | ฟิลด์ที่เป็น PK ได้ (ไม่ซ้ำ) ตัวที่ไม่ถูกเลือกเรียก Alternate Key เช่น เลขบัตรประชาชน |
| Foreign Key | PK ของรีเลชันอื่นที่นำมาเชื่อมความสัมพันธ์ |
| Super Key | แอตทริบิวต์หรือกลุ่มแอตทริบิวต์ใดก็ได้ที่ทำให้แถวไม่ซ้ำ |
กฎของ Codd ที่ควรจำ
มี 13 ข้อ (0–12) เช่น ข้อ 1 ข้อมูลอยู่ในตาราง 2 มิติ · ข้อ 2 เข้าถึงค่าใดก็ได้ด้วยชื่อตาราง + PK + ชื่อคอลัมน์ · ข้อ 3 Null ต่างจาก 0 และช่องว่าง · ข้อ 8–9 อิสระเชิงกายภาพและเชิงตรรกะ
วิเคราะห์และออกแบบฐานข้อมูล
PDF บทที่ 3 · วงจรการพัฒนาระบบฐานข้อมูล (DSDLC)
DSDLC มี 6 ระยะ เปรียบกับการสร้างบ้าน: สำรวจความต้องการ → เขียนแบบ → ก่อสร้าง → ตรวจรับ → เข้าอยู่ → ซ่อมบำรุง
1. ศึกษาข้อมูลเบื้องต้น
- วิเคราะห์สถานการณ์บริษัท: สัมภาษณ์ (ได้ข้อมูลเชิงลึก) · แบบสอบถาม (คนจำนวนมาก) · สังเกต (เห็นขั้นตอนจริง) · ทบทวนเอกสาร (แบบฟอร์ม รายงาน คู่มือ)
- กำหนดปัญหาและเงื่อนไข
- กำหนดวัตถุประสงค์
- กำหนด Scope (ระบบต้องทำอะไรได้ เช่น ยืม-คืน) และ Boundaries (ข้อจำกัดภายนอก: งบ ฮาร์ดแวร์ เวลา)
2. ออกแบบฐานข้อมูล (สำคัญที่สุด)
| ① Conceptual | เขียน E-R Model (ยังไม่สนว่าใช้โปรแกรมอะไร) |
|---|---|
| ② DBMS Selection | เลือก DBMS จากต้นทุน เครื่องมือ แบบจำลอง การขยาย ฮาร์ดแวร์ |
| ③ Logical | แปลง E-R → ตาราง ได้ PK/FK · Normalization ลดความซ้ำซ้อน · พจนานุกรมข้อมูล |
| ④ Physical | เลือกสื่อจัดเก็บและวิธีเข้าถึงข้อมูล |
สำคัญที่สุดเพราะออกแบบผิด ระยะหลังผิดตามหมด
Implementation ติดตั้ง DBMS สร้างฐานข้อมูลด้วย DDL บรรจุข้อมูล กำหนดสิทธิ์ · Testing ทดสอบประสิทธิภาพ ความปลอดภัย ความคงสภาพ · Operation ใช้งานจริงบนเซิร์ฟเวอร์ · Maintenance หลังใช้งานไปแล้ว: แผนสำรองข้อมูลและตรวจประสิทธิภาพ
แบบจำลอง 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
- ศึกษาระบบงาน
- กำหนดเอนทิตี
- กำหนดความสัมพันธ์
- กำหนดแอตทริบิวต์
- กำหนดคีย์หลัก (ขีดเส้นใต้)
- วาดแผนภาพ
- ตรวจสอบกับผู้ใช้
กฎการแปลง 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
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:SSINT / DECIMALจำนวนเต็ม / ทศนิยมแม่นยำView คือตารางเสมือนที่ไม่เก็บข้อมูลจริง เป็นเหมือนหน้าต่างที่มองเห็นแค่บางคอลัมน์ เช่น บรรณารักษ์เห็นชื่อและที่อยู่ แต่ไม่เห็นรหัสผ่าน · Index เหมือนสารบัญท้ายเล่ม ช่วยค้นหาและเรียงข้อมูลที่ใช้บ่อยให้เร็วขึ้น
ทรานแซกชันและความปลอดภัย
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 นาที ข้อเติมคำเป็นแบบลากวาง มีเฉลยและคำอธิบายทีละขั้นทุกข้อ