ข้ามไปยังเนื้อหาหลัก

34 คำถาม-คำตอบสัมภาษณ์งาน MySQL ที่พบบ่อย ปี 2026

เก่ง MySQL ด้วยคู่มือคำถามสัมภาษณ์ พร้อมตัวอย่างใช้งานจริงและเคล็ดลับจากผู้เชี่ยวชาญ เพื่อช่วยให้โดดเด่นในการสัมภาษณ์งานฐานข้อมูลครั้งต่อไป!
อัปเดตแล้ว 2 มิ.ย. 2569  · 15 นาที อ่าน

สังเกตไหมว่าแทบทุกประกาศรับสมัครงานที่เกี่ยวกับฐานข้อมูลมักระบุว่าต้องมีทักษะ MySQL อยู่เสมอ ก็มีเหตุผลดีๆ เพราะ MySQL ขับเคลื่อนตั้งแต่แพลตฟอร์มโซเชียลมีเดียยอดนิยมไปจนถึงแอปที่ใช้กันทุกวัน

คู่มือนี้ถูกจัดทำขึ้นเพื่อช่วยรับมือกับคำถามสัมภาษณ์ MySQL ครอบคลุมตั้งแต่พื้นฐานที่นักพัฒนาระดับจูเนียร์ควรรู้ ไปจนถึงประเด็นซับซ้อนที่ตำแหน่งอาวุโสต้องใช้ อีกทั้งยังมีเคล็ดลับที่จะช่วยให้ดูมั่นใจในสัมภาษณ์สายข้อมูลครั้งถัดไปด้วย 

MySQL คืออะไร?

MySQL เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS) แบบโอเพนซอร์สที่สร้างบน SQL จัดระเบียบข้อมูลเป็นตารางที่มีโครงสร้าง พัฒนาโดย Oracle Corporation

มันได้รับการจัดอันดับเป็น DBMS แบบโอเพนซอร์สที่ได้รับความนิยมสูงสุดในปี 2024 อย่างไรก็ดี แบบสำรวจนักพัฒนา Stack Overflow ปี 2025 แสดงว่า PostgreSQL กลายเป็นฐานข้อมูลที่ถูกใช้งานมากที่สุดในหมู่นักพัฒนามืออาชีพ แซง MySQL เป็นครั้งแรก

อย่างไรก็ตาม MySQL ก็ยังคงได้รับความนิยมอย่างมาก — มีสัดส่วนการใช้งานถึง 40.5% ในปี 2025 — และยังคงขับเคลื่อนเว็บแอปพลิเคชัน ระบบจัดการเนื้อหา และเครื่องมือระดับองค์กรนับไม่ถ้วน โดยเฉพาะหากทำงานกับเว็บแอปหรือสแตก LAMP ทักษะ MySQL ถือเป็นระดับแนวหน้า

กราฟแสดงระบบฐานข้อมูลยอดนิยมในปี 2024 โดย MySQL เป็นที่นิยมมากที่สุด ตามด้วย PostgreSQL

ในปี 2024 MySQL เป็น DBMS แบบโอเพนซอร์สที่ได้รับความนิยมสูงที่สุดของโลก ด้วยคะแนนจัดอันดับ 1061 ที่มา: Statista

คำถามสัมภาษณ์ MySQL ระดับพื้นฐาน

ในช่วงแรกของการสัมภาษณ์ ผู้สัมภาษณ์มักถามคำถามพื้นฐานเพื่อประเมินความเข้าใจเกี่ยวกับแนวคิดฐานข้อมูลและ MySQL เบื้องต้น 

1. ฐานข้อมูลคืออะไร และต่างจาก DBMS อย่างไร? 

ฐานข้อมูลคือภาชนะเก็บข้อมูลที่เราสามารถเข้าถึง แก้ไข และวิเคราะห์ได้ เช่น แพลตฟอร์มโซเชียลมีเดียเก็บข้อมูลว่าใครกดถูกใจโพสต์ของเราไว้ในฐานข้อมูล

DBMS (Database Management System) คือซอฟต์แวร์ที่ให้เราโต้ตอบและจัดการข้อมูลนั้นได้ เช่น การสร้างผู้ใช้และจัดการสิทธิ์การเข้าถึง MySQL เป็นหนึ่งใน DBMS ยอดนิยม ตัวอย่างอื่นๆ ได้แก่ PostgreSQL, MongoDB และ Microsoft SQL Server.

2. MySQL แตกต่างจากระบบจัดการฐานข้อมูลเชิงสัมพันธ์อื่นอย่างไร

MySQL เป็น RDBMS แบบโอเพนซอร์สที่ใช้ SQL จัดการข้อมูล มีชื่อเสียงด้านการใช้งานง่าย ความเร็ว และความเข้ากันได้ดีกับเว็บแอปพลิเคชัน 

ความแตกต่างเมื่อเทียบกับ RDBMS อื่นๆ มีดังนี้:

  • ความเรียบง่ายและประสิทธิภาพ: MySQL มักถูกยกย่องเรื่องการใช้งานง่ายและปรับแต่งประสิทธิภาพมาอย่างดี เป็นตัวเลือกยอดนิยมของนักพัฒนาเว็บและสตาร์ทอัป
  • ฟีเจอร์ขั้นสูง: ขณะเดียวกัน MySQL อาจขาดฟีเจอร์ขั้นสูงบางอย่างที่มีใน RDBMS อื่น เช่น PostgreSQL เช่น การรองรับธุรกรรม ACID ที่ครอบคลุมยิ่งขึ้น ดัชนีขั้นสูง และชุดชนิดข้อมูลที่หลากหลายกว่า
  • เอนจินจัดเก็บข้อมูล: MySQL อนุญาตให้เลือกเอนจินจัดเก็บข้อมูลที่ต่างกันสำหรับตาราง (เช่น InnoDB, MyISAM) เพื่อความยืดหยุ่นตามกรณีใช้งาน

MySQL เหมาะกับสถานการณ์ที่ต้องการความเร็วและการขยายตัว แต่หากต้องการฟีเจอร์ซับซ้อนระดับองค์กร PostgreSQL อาจเป็นตัวเลือกที่ดีกว่า

3. ชนิดข้อมูลหลักที่มีใน MySQL มีอะไรบ้าง

MySQL รองรับชนิดข้อมูลหลากหลาย แบ่งเป็นหมวดหมู่ดังนี้:

  • เชิงตัวเลข: INT, DECIMAL, FLOAT, DOUBLE เป็นต้น

  • สตริง: CHAR, VARCHAR, TEXT, BLOB.

  • วัน/เวลา: DATE, DATETIME, TIMESTAMP, TIME.

  • JSON: สำหรับเก็บออบเจ็กต์ JSON

4. ความแตกต่างระหว่างชนิดข้อมูล INT และ DECIMAL คืออะไร? 

INT เก็บจำนวนเต็มที่ไม่มีจุดทศนิยม ใช้เมื่อไม่ต้องการเศษส่วน ในทางกลับกัน DECIMAL สามารถเก็บค่าทางการเงิน เหมาะสำหรับการคำนวณที่ต้องการความแม่นยำทศนิยม 

5. DATE ต่างจาก DATETIME ใน MySQL อย่างไร? 

ฟังก์ชัน DATE ใน MySQL เก็บวันที่ในรูปแบบปี เดือน วัน: 

YYYY-MM-DD

ขณะที่ DATETIME เก็บทั้งวันที่และเวลา โดยมีรูปแบบดังนี้: 

YYYY-MM-DD HH:MM:SS 

6. คีย์ต่างประเทศ (foreign key) คืออะไร และใช้ในฐานข้อมูลอย่างไร? 

คีย์ต่างประเทศคือฟิลด์ในตารางหนึ่งที่ลิงก์กับคีย์หลักของอีกตารางหนึ่ง 

ตัวอย่างเช่น ในตาราง customers ที่เก็บข้อมูลลูกค้า แต่ละคนมี customer_id ที่ไม่ซ้ำกัน — ในอีกตารางชื่อ transactions (เก็บประวัติการซื้อ) เราใช้ customer_id เป็นคีย์ต่างประเทศ โดย customer_id ในตาราง transactions จะลิงก์แต่ละการซื้อเข้ากับลูกค้าเฉพาะรายในตาราง customers นั่นเอง

ตัวอย่าง SQL:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);
CREATE TABLE transactions (
    transaction_id INT PRIMARY KEY,
    customer_id INT,
    amount DECIMAL(10,2),
    date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

7. ความแตกต่างระหว่าง INNER JOIN, LEFT JOIN, RIGHT JOIN และ FULL JOIN

การ join ใช้รวมแถวจากหลายตารางตามคอลัมน์ที่สัมพันธ์กัน ความแตกต่างมีดังนี้:

  • INNER JOIN: คืนค่าเฉพาะแถวที่มีการจับคู่กันในทั้งสองตาราง

  • LEFT JOIN: คืนค่าทุกแถวจากตารางซ้ายและเฉพาะแถวที่จับคู่ได้จากตารางขวา หากไม่มีคู่ที่ตรงกัน คอลัมน์ของตารางขวาจะเป็น NULL

  • RIGHT JOIN: คล้าย LEFT JOIN แต่คืนค่าทุกแถวจากตารางขวาและเฉพาะแถวที่จับคู่ได้จากตารางซ้าย

  • FULL JOIN: รวมผลลัพธ์ของ LEFT JOIN และ RIGHT JOIN รวมถึงแถวที่ไม่จับคู่จากทั้งสองตาราง หมายเหตุ: MySQL ไม่รองรับไวยากรณ์ FULL JOIN โดยตรง หากต้องการผลลัพธ์เดียวกัน ให้ใช้ UNION ของ LEFT JOIN และ RIGHT JOIN

8. ความแตกต่างระหว่าง DELETE, TRUNCATE และ DROP ใน MySQL

คำสั่ง DELETE, TRUNCATE และ DROP ฟังดูคล้ายกัน แต่พฤติกรรมต่างกันดังนี้:

DELETE: ลบแถวจากตารางตามเงื่อนไข สามารถย้อนกลับได้หากอยู่ในทรานแซกชัน ตัวอย่าง:

DELETE FROM employees WHERE department_id = 5;

TRUNCATE: ลบทุกแถวจากตาราง แต่โครงสร้างตารางยังคงอยู่ เร็วกว่า DELETE และไม่สามารถย้อนกลับได้ ตัวอย่าง:

TRUNCATE TABLE employees;

DROP: ลบทั้งโครงสร้างและข้อมูลของตาราง รวมถึงสิ่งที่เกี่ยวข้อง เช่น ดัชนี ตัวอย่าง:

DROP TABLE employees;

9. จะสร้างและแก้ไขตารางใน MySQL อย่างไร ยกตัวอย่าง

ใช้คำสั่ง CREATE TABLE เพื่อสร้างตาราง และมักใช้ ALTER TABLE เพื่อแก้ไขตาราง ตัวอย่าง:

สร้างตาราง:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));

แก้ไขเพื่อเพิ่มคอลัมน์:

ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);

10. ตารางชั่วคราว (temporary table) ใน SQL คืออะไร? 

ตารางชั่วคราวจะคงอยู่เฉพาะระหว่างเซสชันฐานข้อมูลปัจจุบัน เมื่อปิดเซสชัน ตารางจะถูกลบ ใช้เก็บผลลัพธ์ระหว่างทางชั่วคราว เหมาะสำหรับทดสอบ กรอง หรือเตรียมข้อมูลก่อนใส่ลงตารางถาวร

ตัวอย่าง:

CREATE TEMPORARY TABLE temp_employees (
    id INT,
    name VARCHAR(50)
);
INSERT INTO temp_employees VALUES (1, 'John Doe');
SELECT * FROM temp_employees;

11. ซับคิวรี (subquery) ใน MySQL คืออะไร อธิบายพร้อมตัวอย่าง 

ซับคิวรี (หรือคิวรีซ้อน) คือคิวรีที่อยู่ภายในคิวรีอีกชั้น ใช้แตกงานที่ซับซ้อนให้เป็นขั้นตอนย่อยๆ เช่น หาอัตราค่าจ้างพนักงานที่สูงกว่าเงินเดือนเฉลี่ย: 

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

อธิบายทีละส่วน:

  1. คิวรีด้านใน SELECT AVG(salary) FROM employees คำนวณเงินเดือนเฉลี่ยก่อน

  2. คิวรีด้านนอกใช้ค่าเฉลี่ยนี้เพื่อหาพนักงานที่มีรายได้สูงกว่า

12. จะใช้คำสั่ง INSERT ใน MySQL เพื่อเพิ่มข้อมูลลงตารางอย่างไร และมีแนวทางปฏิบัติที่ดีอะไรบ้าง? 

ใช้คำสั่ง INSERT เพื่อเพิ่มข้อมูลลงตาราง ไวยากรณ์พื้นฐาน:

INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...); 

แนวทางปฏิบัติที่ดีเมื่อใช้ INSERT

  1. ระบุรายชื่อคอลัมน์อย่างชัดเจน ทำให้โค้ดอ่านง่ายและลดข้อผิดพลาดหากโครงสร้างตารางเปลี่ยนในอนาคต

  2. สำหรับคอลัมน์ AUTO_INCREMENT เช่น ID ให้ข้ามใน INSERT MySQL จะจัดการให้เองเพื่อป้องกันเลขซ้ำ 

  3. ใช้เครื่องหมายอัญประกาศสำหรับสตริงให้สอดคล้องกัน ส่วนตัวนิยมเครื่องหมาย single quote แต่ใช้แบบใดแบบหนึ่งก็ได้

  4. หากเพิ่มหลายแถว ควรทำในคำสั่งเดียวเพื่อประสิทธิภาพที่ดีกว่า

13. ความสำคัญของคุณลักษณะ AUTO_INCREMENT ใน MySQL คืออะไร

คุณลักษณะ AUTO_INCREMENT ใน MySQL สร้างตัวเลขลำดับที่ไม่ซ้ำกันสำหรับคอลัมน์ โดยมักใช้กับคีย์หลักของตาราง

ตัวอย่างการสร้างตารางที่มีคอลัมน์ AUTO_INCREMENT:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50)
);

และตัวอย่างการเพิ่มแถว:

INSERT INTO employees (name, department) VALUES ('John Doe', 'Sales');
INSERT INTO employees (name, department) VALUES ('Jane Smith', 'Marketing');

14. วิว (view) ใน MySQL คืออะไร? 

วิวคือคิวรีที่บันทึกไว้ซึ่งทำงานเสมือนเป็นตารางเสมือน เราสามารถนำคิวรีซับซ้อนมาตั้งชื่อและใช้เหมือนตารางในการคิวรีครั้งต่อไป โดยไม่ต้องพิมพ์ใหม่ทุกครั้ง

ตัวอย่าง เพื่อให้ง่ายต่อการดึงรายละเอียดพนักงานพร้อมชื่อแผนก สามารถสร้างวิวได้ดังนี้:

CREATE VIEW employee_details AS
SELECT 
    e.id,
    e.name,
    d.department_name,
    e.salary
FROM 
    employees e
JOIN 
    departments d ON e.department_id = d.department_id;

จากนั้นสามารถคิวรีวิว employee_details ได้เหมือนตาราง:

SELECT * FROM employee_details;

อย่างไรก็ตาม วิวส่วนมากใช้เพื่ออ่านอย่างเดียว ไม่สามารถใช้เพื่อ insert และ update ข้อมูลได้ และช่วยจำกัดการเข้าถึงฐานข้อมูลเพื่อเพิ่มความปลอดภัย ทั้งนี้ วิวอาจทำให้คิวรีช้าลงได้ เพราะต้องรันคิวรีพื้นฐานทุกครั้งที่เรียกใช้งาน

คำถามสัมภาษณ์ MySQL ระดับกลาง

ส่วนนี้จะครอบคลุมหัวข้อระดับกลาง คำถามเหล่านี้เน้นทดสอบความรู้เกี่ยวกับชนิดข้อมูลและโครงสร้างของ MySQL

15. ตารางแบบ system-versioned คืออะไร และทำงานอย่างไร? 

ตารางแบบ system-versioned จะเก็บประวัติการเปลี่ยนแปลงทั้งหมดของข้อมูลในตารางนั้นๆ เพราะเก็บเวอร์ชันก่อนหน้าไว้ในแต่ละแถว จึงใช้สำหรับตรวจสอบย้อนหลังและกู้คืนข้อมูลได้ 

หลักการคือเพิ่มสองคอลัมน์พิเศษ — StartTime และ EndTime — เพื่อบันทึกช่วงเวลาที่แต่ละแถวมีผล เมื่อมีการ insert, update หรือ delete ค่าสองนี้จะถูกอัปเดต:

  • Insert: แถวใหม่จะถูกเพิ่มพร้อม StartTime เป็นเวลาปัจจุบัน และ EndTime เป็น 9999-12-31 23:59:59 ซึ่งเป็นค่าสูงสุดของ DATETIME ใน MySQL ใช้เป็นค่าส่งสัญญาณว่า "แถวนี้ยังใช้งานอยู่"

  • Update: อัปเดต EndTime ของแถวเดิมเป็นเวลาปัจจุบันเพื่อทำเครื่องหมายว่าไม่ถูกต้องแล้ว จากนั้นสร้างแถวใหม่ที่มีข้อมูลอัปเดต โดยตั้ง StartTime เป็นเวลาปัจจุบันและ EndTime เป็น "ตลอดไป"

  • Delete: อัปเดต EndTime ของแถวที่มีอยู่เป็นเวลาปัจจุบันเพื่อบ่งบอกว่าแถวนี้ไม่ถูกต้องแล้ว

โดยใช้คลอส FOR SYSTEM_TIME ใน SQL จะสามารถคิวรีสถานะของตารางในช่วงเวลาหนึ่งหรือ ณ เวลาที่ระบุได้ เช่น:

  • FOR SYSTEM_TIME AS OF '2024-01-01': ดึงสถานะของตาราง ณ วันที่ 1 มกราคม 2024

  • FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31': แสดงทุกแถวที่มีผลในช่วงวันที่ดังกล่าว

16. ทรานแซกชันใน MySQL คืออะไร และใช้อย่างไร

ทรานแซกชันคือชุดการทำงานที่ถูกรันเป็นหน่วยเดียว เพื่อคงความถูกต้องของข้อมูล โดยให้ทุกการทำงานสำเร็จหรือไม่สำเร็จพร้อมกัน

ตัวอย่างการใช้งาน:

START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- บันทึกการเปลี่ยนแปลงถาวร
-- หรือ
ROLLBACK; -- ย้อนกลับการเปลี่ยนแปลง

17. ค่ากำหนดค่าเริ่มต้น (default constraint) ใน MySQL คืออะไร ตั้งค่าเริ่มต้นให้คอลัมน์อย่างไร

Default constraint ใน MySQL ใช้กำหนดค่าเริ่มต้นให้คอลัมน์เมื่อไม่มีการระบุค่าในระหว่างการทำ INSERT ช่วยให้คอลัมน์ยังคงข้อมูลที่ถูกต้องแม้ผู้ใช้จะไม่กรอก

ตัวอย่างการสร้างตารางพร้อมค่าเริ่มต้น:

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    status VARCHAR(10) DEFAULT 'active'
);

จากนั้นสามารถ insert แถวโดยไม่ระบุ status ได้:

INSERT INTO employees (name) VALUES ('John Doe');

แนวทางนี้ช่วยลดโอกาสเกิดค่า NULL หรือข้อมูลไม่ถูกต้องในคอลัมน์สำคัญ และทำให้คิวรีง่ายขึ้นเพราะไม่ต้องจัดการกรณีค่าเริ่มต้นด้วยตนเอง

Field

Type

Null

Key

Default

Extra

id

INT

NO

PRI

NULL

AUTO_INCREMENT

name

VARCHAR(50)

YES

 

NULL

 

status

VARCHAR(10)

YES

 

active

 

คำสั่งนี้มีประโยชน์เพราะ:

  • ช่วยให้นักพัฒนาทำความเข้าใจสคีมาของตารางก่อนเขียนคิวรี
  • ใช้ดีบักได้ดี โดยเฉพาะเมื่อทำงานกับฐานข้อมูลที่ไม่คุ้นเคย
  • ช่วยระบุ constraint ต่างๆ ได้รวดเร็ว เช่น primary key หรือค่าเริ่มต้น

18. ความแตกต่างระหว่าง CHAR และ VARCHAR ใน MySQL

ทั้งสองเก็บข้อมูลแบบสตริง แต่จัดการการเก็บต่างกัน:

  • CHAR(n) จะเก็บเสมอจำนวนตัวอักษรเท่ากับ n โดยคั่นด้วยช่องว่างหากค่าสั้นกว่า เป็นแบบความยาวคงที่ จึงเร็วกว่าเล็กน้อยสำหรับคอลัมน์ที่ค่ามีความยาวเท่ากันทั้งหมด เช่น รหัสประเทศหรือสถานะ

  • VARCHAR(n) จะเก็บเฉพาะจำนวนอักขระจริงที่ป้อน มากสุดไม่เกิน n ใช้พื้นที่น้อยกว่าสำหรับข้อมูลความยาวแปรผัน แต่มีค่า overhead เล็กน้อยเพื่อเก็บความยาว

CREATE TABLE example (
    country_code CHAR(2),      -- Always 2 chars, e.g. 'US', 'UK'
    email VARCHAR(255)         -- Variable length up to 255 chars
);

หลักจำง่ายๆ: ใช้ CHAR สำหรับค่าความยาวตายตัว และใช้ VARCHAR สำหรับอย่างอื่น

19. จะใช้ฟังก์ชันสตริงใน SQL เพื่อจัดการข้อความอย่างไร? 

มีฟังก์ชันสตริงหลายชนิดใน SQL สำหรับจัดการชื่อและข้อมูลตัวอักษร ตัวอย่างเช่น:

  • ฟังก์ชัน LENGTH() แสดงจำนวนอักขระในชื่อ 

  • UPPER() และ LOWER() แปลงข้อความเป็นตัวใหญ่ทั้งหมดหรือตัวเล็กทั้งหมด 

  • CONCAT() เชื่อมชื่อจริงและนามสกุลเข้าด้วยกัน 

  • SUBSTRING() ดึงบางส่วนของข้อความ เช่น แยกเดือนออกจากวันเกิด 

ตัวอย่างคิวรี:

SELECT 
    UPPER(first_name) AS upper_name,
    CONCAT(first_name, ' ', last_name) AS full_name,
    SUBSTRING(birthdate, 6, 2) AS birth_month,
    TRIM(last_name) AS trimmed_last_name,
    REPLACE(first_name, 'a', '@') AS replaced_name
FROM employees;

คิวรีนี้:

  • แปลงชื่อเป็นตัวพิมพ์ใหญ่

  • รวมชื่อจริงและนามสกุลเป็นชื่อเต็ม

  • ดึงเดือนเกิดจากคอลัมน์ birthdate

  • ตัดช่องว่างหน้า-หลังของนามสกุล

  • แทนที่อักษร "a" ทั้งหมดในชื่อจริงด้วย "@"

20. จะอัปเดตแถวเฉพาะในฐานข้อมูลด้วย SQL ได้อย่างไร

ใช้คำสั่ง UPDATE ร่วมกับเงื่อนไข WHERE เพื่อระบุเรคอร์ดที่ต้องการแก้ไข 

เช่น หากต้องการอัปเดตประเภทภาพยนตร์ “Inception” ปี 2010 เป็น “Sci-fi” ใช้คิวรีดังนี้: 

UPDATE movies
SET genre = 'Sci-Fi'
WHERE movie_title = 'Inception' AND year = 2010;

ที่นี่ UPDATE movies ระบุตารางที่ต้องการอัปเดต และคลอส WHERE เจาะจงแถวที่ชื่อเรื่องเป็น “Inception” และปีเป็น “2010” 

คำถามสัมภาษณ์ MySQL ระดับสูง

คำถามระดับสูงจะทดสอบความสามารถในการจัดการสถานการณ์ MySQL ที่ซับซ้อน และสะท้อนวิธีตัดสินใจของผู้สมัคร 

21. ทริกเกอร์ (trigger) ใน MySQL คืออะไร และจะใช้อย่างไร? 

ทริกเกอร์ใน MySQL คือชุดการทำงานที่รันเมื่อเกิดเหตุการณ์ในฐานข้อมูล สามารถตั้งให้ทำงานก่อนหรือหลังเหตุการณ์อย่าง INSERT, UPDATE หรือ DELETE 

ตัวอย่าง สมมติว่ามีตาราง orders ที่เพิ่มคำสั่งซื้อใหม่ เราสามารถสร้างทริกเกอร์เพื่อบันทึกทุกคำสั่งซื้อใหม่ลงตาราง order_history ได้:

CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
    INSERT INTO order_history (order_id, action, timestamp)
    VALUES (NEW.order_id, 'inserted', NOW());
END;

หลังทริกเกอร์ทำงาน ตาราง order_history จะถูกอัปเดตโดยอัตโนมัติ:

history_id

order_id

action

timestamp

1

1

inserted

2024-12-24 10:00:00

2

2

inserted

2024-12-24 11:00:00

22. ทำไมการเพิ่มดัชนีจึงทำให้คิวรี SQL เร็วขึ้น? 

หากไม่มีดัชนี ฐานข้อมูลต้องสแกนทุกแถวเพื่อหาข้อมูลที่ต้องการ ดัชนีทำหน้าที่คล้ายสารบัญ ช่วยให้เข้าถึงแถวที่เกี่ยวข้องได้ทันที จึงลดเวลาในการค้นหาและทำให้คิวรีทำงานเร็วขึ้น 

โดยทั่วไป ดัชนีใช้โครงสร้างข้อมูลอย่าง B-tree หรือ hash table ช่วยให้ค้นหา ดูค่า และทำ range scan ได้มีประสิทธิภาพ

ตัวอย่างการสร้างดัชนี:

-- ไม่มีดัชนี:
SELECT * FROM employees WHERE last_name = 'Smith';
-- เพิ่มดัชนีที่คอลัมน์ last_name:
CREATE INDEX idx_last_name ON employees(last_name);
-- เมื่อมีดัชนีแล้ว ฐานข้อมูลสามารถค้นหาแถวที่มี 'Smith' ในคอลัมน์ last_name ได้อย่างรวดเร็ว

อย่างไรก็ตาม ดัชนีก็มีข้อเสียบางประการ เช่น:

  • การเขียนช้าลง: การทำ INSERT, UPDATE และ DELETE ช้าลงเพราะต้องอัปเดตดัชนีทุกครั้งที่ข้อมูลเปลี่ยน

  • ต้นทุนพื้นที่จัดเก็บ: ดัชนีต้องใช้พื้นที่เก็บข้อมูลเพิ่มเติม

23. ในตาราง SQL ควรใช้ชนิดข้อมูลใดสำหรับน้ำหนักและราคา และเพราะเหตุใด? 

สำหรับน้ำหนัก โดยทั่วไป DECIMAL ปลอดภัยกว่า แม้ FLOAT และ REAL จะเก็บค่าทศนิยมได้ แต่ใช้การคำนวณแบบ floating-point ซึ่งอาจเกิดความคลาดเคลื่อนจากการปัดเศษเล็กน้อย

สำหรับน้ำหนักสินค้าที่ต้องการความแม่นยำ (เช่น ค่าขนส่ง สต็อก) การใช้ DECIMAL(8, 3) ให้การควบคุมที่แม่นยำด้วยทศนิยม 3 ตำแหน่งและไม่เกิดการปัดเศษที่ไม่คาดคิด ส่วน FLOAT ยอมรับได้เฉพาะเมื่อยอมให้มีความคลาดเคลื่อนเล็กน้อย

24. จะหาข้อมูลซ้ำใน SQL ด้วย window function ได้อย่างไร? 

วิธีหาข้อมูลซ้ำด้วยฟังก์ชัน ROW_NUMBER() มีดังนี้:

WITH DuplicateCheck AS (
    SELECT product_name, 
           category,
           ROW_NUMBER() OVER(
               PARTITION BY product_name, category 
               ORDER BY id
           ) AS row_num
    FROM sales
)
SELECT *
FROM DuplicateCheck
WHERE row_num > 1;

อธิบายการทำงาน:

1. ROW_NUMBER() จะกำหนดหมายเลขให้แต่ละแถวในผลลัพธ์ 

2. PARTITION BY จัดกลุ่มตาม product_name และ category 

3. ภายในแต่ละกลุ่ม จะแสดงหมายเลขเรียงจาก 1 

4. ค่า row_num มากกว่า 1 บ่งชี้ว่าซ้ำ 

เช่น หากมีข้อมูลดังนี้:

  • Product A, Category X, row_num = 1
  • Product A, Category X, row_num = 2 (ซ้ำ)
  • Product B, Category Y, row_num = 1

คิวรีจะคืนแถวที่สองเพราะ row_num มากกว่า 1

25. จะสร้างและใช้ stored procedure ที่มีพารามิเตอร์ใน MySQL อย่างไร อธิบายพร้อมตัวอย่าง 

Stored procedure ช่วยบันทึกและนำคิวรีซับซ้อนไปใช้ซ้ำได้ ทำให้การทำงานกับฐานข้อมูลมีประสิทธิภาพและดูแลง่าย มาดูวิธีสร้างและใช้พารามิเตอร์ผ่านตัวอย่างจริง

สมมติว่ามีฐานข้อมูลนักเรียนและอยากสร้าง procedure เพื่อกรองตามอายุ ทำได้ดังนี้:

ก่อนอื่น สร้าง stored procedure แบบง่ายที่รับพารามิเตอร์อายุ:

CREATE PROCEDURE get_student_info(IN age INT)
BEGIN
    SELECT * FROM student WHERE student.age = age;
END;

เพื่อเรียกใช้ ให้ CALL พร้อมอายุที่ต้องการ:

CALL get_student_info(21);

เราสามารถทำให้ procedure ซับซ้อนขึ้นได้โดยใช้พารามิเตอร์ขาออก (output) เช่น นับจำนวนนักเรียนตามอายุที่ระบุ:

CREATE PROCEDURE count_students_by_age(IN age INT, OUT student_count INT)
BEGIN
    SELECT COUNT(*) INTO student_count FROM students WHERE students.age = age;
END;

วิธีรับค่าจาก procedure:

SET @count = 0;
CALL count_students_by_age(21, @count);
SELECT @count AS total_students;

26. ทำไม referential integrity จึงสำคัญในฐานข้อมูล? 

Referential integrity ช่วยให้ความสัมพันธ์ระหว่างตารางถูกต้อง เมื่อสร้างคีย์ต่างประเทศ มันจะบังคับให้ค่าที่อยู่ในตารางหนึ่งต้องสอดคล้องกับค่าที่ไม่ซ้ำกันในตารางอ้างอิง

ตัวอย่างจริง: สมมติว่าจัดการฐานข้อมูลอีคอมเมิร์ซ มีตาราง Customers และ Orders โดยทุกออเดอร์ต้องเป็นของลูกค้าที่มีอยู่จริง Referential integrity ที่บังคับด้วย foreign key จะทำให้:

  • ไม่สามารถสร้างออเดอร์ให้กับลูกค้าที่ไม่มีอยู่จริงได้
  • ไม่สามารถลบลูกค้าที่มีออเดอร์อยู่ (เว้นแต่จะกำหนดพฤติกรรมต่อออเดอร์เหล่านั้นไว้ชัดเจน)
  • ไม่สามารถแก้ไขรหัสลูกค้าได้หากลูกค้ารายนั้นเคยมีออเดอร์

ดังนั้นเมื่อสร้างข้อบังคับคีย์ต่างประเทศเช่นนี้:

ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

ฐานข้อมูลจะบังคับใช้กฎโดยอัตโนมัติว่า:

  • ทุก CustomerID ในตาราง Orders ต้องมีอยู่ในตาราง Customers

  • ความพยายามที่จะละเมิดกฎ (เช่น ใส่ CustomerID ที่ไม่ถูกต้อง) จะถูกปฏิเสธ

สิ่งนี้ป้องกันความไม่สอดคล้องของข้อมูลที่อาจทำให้เกิดปัญหาร้ายแรง เช่น ออเดอร์ที่ไม่สามารถโยงกลับไปหาลูกค้าได้จริง หรือรายงานที่ขาดข้อมูลลูกค้า

คำถามสัมภาษณ์ MySQL สำหรับผู้ดูแลฐานข้อมูล

หากสมัครตำแหน่งผู้ดูแลฐานข้อมูลโดยเฉพาะ ต่อไปนี้คือคำถามที่ผู้สรรหาอาจถาม

27. ทำไมแอปขนาดใหญ่จึงใช้การแบ่งชาร์ดฐานข้อมูล (sharding) และมีความท้าทายอะไรบ้าง? 

แอปขนาดใหญ่ใช้การแบ่งชาร์ดเพื่อกระจายข้อมูลจำนวนมากไปยังหลายเซิร์ฟเวอร์ แต่ละชาร์ดเก็บเพียงส่วนย่อยของข้อมูล ช่วยกระจายภาระงาน จึงไม่ต้องพึ่งฮาร์ดแวร์สเปกสูง ความเร็วและการขยายตัวก็ดีขึ้น แต่ก็มีความท้าทาย เช่น: 

  • คิวรีบางประเภทอย่างการ join ข้ามชาร์ดอาจทำได้ยาก ทำให้การจัดการข้อมูลซับซ้อนขึ้น 
  • เมื่อข้อมูลเติบโต ชาร์ดบางส่วนอาจกลายเป็นจุดร้อน (hotspot) ทำให้ประสิทธิภาพช้าลง 

28. อธิบายบทบาทของ redo log ในการกู้คืนเมื่อ MySQL ล่ม 

ทุกครั้งที่ข้อมูลถูกแก้ไข MySQL ต้องเขียนลงดิสก์ แต่การเขียนลงไฟล์ข้อมูลโดยตรงทั้งช้าและเสี่ยง ดังนั้นก่อนที่ MySQL จะปรับแก้ไฟล์ข้อมูล มันจะเขียนสิ่งที่กำลังจะทำลงใน redo log ก่อน วิธีนี้ปลอดภัยกว่าการแก้ไขไฟล์ข้อมูลโดยพลการ

เช่น เมื่ออัปเดตที่อยู่ของลูกค้า:

  1. MySQL เขียนการเปลี่ยนแปลงลง redo log ก่อน
  2. จากนั้นรับรองว่าทรานแซกชันคอมมิตแล้ว
  3. ท้ายที่สุดค่อยนำการเปลี่ยนแปลงไปใช้กับไฟล์ข้อมูลจริง

การกู้คืนกรณีล่มสำคัญในสถานการณ์ที่ MySQL ล่มหลังขั้นตอนที่ 1 หรือ 2 แต่ก่อนขั้นตอนที่ 3 เมื่อเริ่มใหม่ MySQL จะอ่าน redo log แล้วทำงานที่ยังไม่เสร็จให้ครบโดยรีเพลย์การเปลี่ยนแปลงตาม redo log ทำให้มั่นใจว่าไม่มีทรานแซกชันที่คอมมิตแล้วสูญหาย แม้จะล่มในจังหวะไม่พอดีก็ตาม

29. เอนจินจัดเก็บข้อมูลใน MySQL มีอะไรบ้าง และต่างกันอย่างไร

MySQL รองรับหลายเอนจินจัดเก็บข้อมูล โดยแต่ละแบบเหมาะกับกรณีใช้งานต่างกัน เปรียบเทียบที่ใช้บ่อยมีดังนี้:

Storage Engine Key Features Best For
InnoDB เอนจินค่าเริ่มต้น รองรับ ACID ล็อกระดับแถว ทรานแซกชันและคีย์ต่างประเทศ อีคอมเมิร์ซ ระบบการเงิน งานที่ต้องการความถูกต้องของข้อมูล
MyISAM อ่านเร็ว ล็อกระดับตาราง ไม่รองรับทรานแซกชันหรือคีย์ต่างประเทศ แอปที่อ่านหนักและให้ความสำคัญกับความเร็วมากกว่าความถูกต้อง
Memory เก็บข้อมูลใน RAM เร็วมากแต่สูญหายเมื่อรีสตาร์ต แคช จัดการเซสชัน ข้อมูลชั่วคราว
CSV เก็บข้อมูลเป็นไฟล์ CSV ธรรมดา ไม่มีดัชนี แลกเปลี่ยนข้อมูลระหว่างแอปหรือเก็บไฟล์แบนง่ายๆ
Archive บีบอัดสูง รองรับ INSERT และ SELECT เท่านั้น ไม่มีดัชนี ข้อมูลล็อกหรือประวัติที่คิวรีไม่บ่อย
NDB (Clustered) การจัดเก็บแบบกระจาย ความพร้อมใช้งานสูง ทนทานต่อความขัดข้อง รองรับทรานแซกชัน แอปกระจายขนาดใหญ่ที่ต้องการประสิทธิภาพเรียลไทม์

30. จะตั้งค่าเอนจินจัดเก็บข้อมูลเริ่มต้นใน MySQL อย่างไร? 

ก่อนอื่น ตรวจสอบเอนจินค่าเริ่มต้นปัจจุบันได้ด้วย:

SHOW ENGINES;

แนะนำให้ใช้ InnoDB เป็นค่าเริ่มต้น เพราะรองรับคุณสมบัติสำคัญ เช่น:

  • ทรานแซกชันที่เป็นไปตาม ACID
  • ข้อบังคับคีย์ต่างประเทศ
  • การกู้คืนเมื่อระบบล่ม
  • การล็อกระดับแถว

หากต้องการเปลี่ยนเอนจินเริ่มต้นชั่วคราวสำหรับเซสชันปัจจุบัน ใช้:

SET default_storage_engine = 'InnoDB';

หากต้องการเปลี่ยนถาวร ให้แก้ไฟล์คอนฟิก MySQL โดยเพิ่มบรรทัดนี้ใต้ส่วน [mysqld]:

default-storage-engine = InnoDB

31. จะซ่อมแซมตารางที่เสียหายใน MySQL ได้อย่างไร? 

ก่อนอื่น ตรวจสอบทุกฐานข้อมูลด้วยคำสั่งนี้: 

mysqlcheck --check --all-databases -u root -p

คำสั่งจะสแกนทุกตารางและรายงานความเสียหาย หากพบ ให้รันคำสั่งต่อไปนี้เพื่อซ่อมแซม: 

mysqlcheck --repair database_name table_name -u root -p

การซ่อมแซมอาจทำให้ข้อมูลสูญหายในกรณีที่ความเสียหายรุนแรง ควรสำรองข้อมูลไว้ก่อน

คำถามสัมภาษณ์ MySQL แบบสถานการณ์และการแก้ปัญหา

คำถามเหล่านี้ประเมินประสบการณ์รับมือสถานการณ์ซับซ้อนจริงและทักษะการแก้ปัญหา

32. อธิบายสถานการณ์ที่ใช้ subquery ใน MySQL

สามารถตอบคำถามลักษณะนี้ได้ดังนี้:

ผม/ฉันดูแลฐานข้อมูลร้านอีคอมเมิร์ซในงานล่าสุด ต้องจัดทำรายงานสินค้าที่สร้างยอดขายสูงกว่าค่าเฉลี่ย ซึ่งต้องใช้ subquery เพื่อวิเคราะห์หลายขั้นตอน

นี่คือคิวรี SQL ที่ใช้แก้ปัญหา:

SELECT 
    p.product_id,
    p.product_name,
    s.sales_amount
FROM products p
JOIN sales s ON p.product_id = s.product_id
WHERE s.sales_amount > (
    SELECT AVG(sales_amount)
    FROM sales
)
ORDER BY s.sales_amount DESC;

เริ่มจากหาค่าเฉลี่ยยอดขายของสินค้าทั้งหมดด้วย subquery ในคลอส WHERE ที่คำนวณ AVG(sales_amount) จากตาราง sales เพื่อใช้เป็นเกณฑ์ไดนามิกในการเทียบผลงานของแต่ละสินค้า

คิวรีหลัก join ตาราง products และ sales เพื่อดึงรายละเอียดสินค้า ขณะที่คลอส WHERE คัดกรองสินค้าที่มียอดขายต่ำกว่าค่าเฉลี่ยออก 

ด้วยโครงสร้างนี้ สามารถระบุสินค้าที่ทำผลงานได้ดีในการคิวรีครั้งเดียว โดยไม่ต้องรันหลายคิวรีแยกกัน

33. อธิบายสถานการณ์ที่ใช้ SQL joins เพื่อรวมข้อมูลจากหลายตาราง 

ตัวอย่างคำตอบ:

ล่าสุดทำโปรเจกต์ที่มีสองตารางหลัก — ตารางหนึ่งเป็นข้อมูลยอดขายสินค้า และอีกตารางเป็นรายละเอียดสินค้า งานที่ได้รับคือสร้างรายงานที่แสดง sales, product name, category และ price

เพื่อรวมข้อมูลที่ต้องการ ผม/ฉันใช้ INNER JOIN บนคอลัมน์ร่วม product_id เพื่อเชื่อมธุรกรรมการขายกับรายละเอียดสินค้า:

SELECT 
    s.sales_date,
    p.product_name,
    p.category,
    s.quantity_sold,
    p.price
FROM 
    sales s
INNER JOIN 
    products p
ON 
    s.product_id = p.product_id;

รายงานนี้ช่วยให้เห็นภาพรวมแนวโน้มการขาย ช่วยผู้มีส่วนได้ส่วนเสียระบุหมวดสินค้าที่ทำผลงานดีและที่ต้องปรับปรุง

34. มีประสบการณ์กับทริกเกอร์หรือไม่ อธิบายการใช้งานที่เคยทำ

ตัวอย่างคำตอบ:

มีครับ/ค่ะ มีประสบการณ์กับทริกเกอร์อย่างกว้างขวาง ล่าสุดได้สร้างทริกเกอร์ AFTER UPDATE สำหรับตรวจสอบการเปลี่ยนแปลงราคา 

รายละเอียดคือ สร้างทริกเกอร์ที่บันทึกประวัติราคาโดยอัตโนมัติเมื่อราคาสินค้าเปลี่ยน นี่คือสคริปต์ SQL ที่ใช้:

CREATE TRIGGER tr_AuditPriceChanges
AFTER UPDATE ON Products
FOR EACH ROW
BEGIN
    -- Only log if the price actually changed
    IF OLD.UnitPrice <> NEW.UnitPrice THEN
        INSERT INTO PriceAudit (
            ProductID,
            OldPrice,
            NewPrice,
            ChangedBy,
            ChangeDate,
            PercentageChange
        )
        VALUES (
            NEW.ProductID,
            OLD.UnitPrice,
            NEW.UnitPrice,
            CURRENT_USER(),
            NOW(),
            ROUND(((NEW.UnitPrice - OLD.UnitPrice) / OLD.UnitPrice * 100), 2)
        );
    END IF;
END;

จุดเด่นของแนวทางนี้คือ:

  1. ทำงานเฉพาะเมื่อราคามีการเปลี่ยนจริง
  2. บันทึกผู้ที่แก้ไขด้วย SYSTEM_USER
  3. คำนวณเปอร์เซ็นต์การเปลี่ยนแปลงเพื่อใช้ในรายงาน
  4. มีเงื่อนไขกรองกรณีที่ไม่มีการเปลี่ยนแปลงจากการอัปเดตคอลัมน์อื่น

ภายหลังยังได้เพิ่มการจัดการข้อผิดพลาดและล็อก เมื่อพบเคสปลายทางที่ราคามีค่า NULL

เคล็ดลับเตรียมตัวสัมภาษณ์ MySQL

หากเพิ่งเริ่มอาชีพ ต่อไปนี้คือเคล็ดลับที่จะช่วยให้ผ่านสัมภาษณ์:

เชี่ยวชาญแนวคิดหลักของ MySQL: ศึกษา พื้นฐานการออกแบบฐานข้อมูล เช่น การทำดัชนี ทรานแซกชัน และตัวปรับคิวรี ทำความเข้าใจว่า MySQL ประมวลผลคิวรีและจัดการการจัดเก็บข้อมูลอย่างไร จะช่วยให้เขียนคิวรีได้มีประสิทธิภาพและอธิบายวิธีแก้ปัญหาได้ชัดเจนในสัมภาษณ์

ลงมือปฏิบัติจริง: ติดตั้ง MySQL บนคอมพิวเตอร์ แล้วฝึกเป็นประจำ สร้างฐานข้อมูลทดสอบ เขียนคิวรีหลายรูปแบบ และลองปรับแต่งให้ดีขึ้น การลงมือทำจริงคือวิธีเรียนรู้ที่ดีที่สุดและเสริมความมั่นใจก่อนสัมภาษณ์

เพื่อทบทวนความรู้เพิ่มเติม ลองดูแหล่งข้อมูลของ DataCamp: 

เรียนรู้เครื่องมือและการผสานการทำงานของ MySQL: ทำความคุ้นเคยกับ MySQL Workbench หรือเครื่องมืออื่นๆ สำหรับจัดการฐานข้อมูลและมอนิเตอร์พื้นฐาน สามารถศึกษา การทำงานร่วมกันของ MySQL กับ Python และเฟรมเวิร์กที่เกี่ยวข้อง เพื่อแสดงความพร้อมทำงานในสภาพแวดล้อมพัฒนาจริง

สรุป

ทั้งหมดนี้คือ 34 คำถามสัมภาษณ์ MySQL ยอดนิยมที่จะช่วยให้คว้างานถัดไป ไม่ว่าจะสมัครตำแหน่งระดับเริ่มต้นหรือผู้ดูแลฐานข้อมูลขั้นสูง การมีพื้นฐาน MySQL ที่แน่น การปรับแต่งคิวรี และการจัดการฐานข้อมูลที่ดี จะทำให้โดดเด่นขึ้น 

เพื่อขยายความรู้เกี่ยวกับระบบจัดการฐานข้อมูลอื่นๆ เพิ่มเติม ลองดู คอร์ส SQL ของ DataCamp

หัวข้อ

เรียนรู้เพิ่มเติมเกี่ยวกับ SQL ด้วยคอร์สเหล่านี้!

Courses

Data Manipulation in SQL

4 ชม.
324.4K
Master the complex SQL queries necessary to answer a wide variety of data science questions and prepare robust data sets for analysis in PostgreSQL.
ดูรายละเอียดRight Arrow
เริ่มหลักสูตร
ดูเพิ่มเติมRight Arrow