Chuyển đến nội dung chính

34 Câu Hỏi Phỏng Vấn MySQL Hàng Đầu và Đáp Án Cho Năm 2026

Làm chủ MySQL với hướng dẫn câu hỏi phỏng vấn cùng ví dụ thực tế và mẹo chuyên gia giúp bạn tỏa sáng trong buổi phỏng vấn cơ sở dữ liệu tiếp theo!
Đã cập nhật 16 thg 4, 2026  · 15 phút đọc

Bạn đã từng để ý MySQL gần như luôn xuất hiện trong hầu hết mô tả công việc liên quan đến cơ sở dữ liệu chưa? Có lý do chính đáng cho điều đó — MySQL hầu như vận hành mọi thứ, từ các nền tảng mạng xã hội yêu thích đến những ứng dụng bạn dùng mỗi ngày.

Tôi đã tổng hợp hướng dẫn này để giúp bạn xử lý các câu hỏi phỏng vấn MySQL. Tôi sẽ bao quát mọi khía cạnh, từ kiến thức cơ bản mà lập trình viên junior cần biết đến những nội dung phức tạp yêu cầu cho vị trí senior. Ngoài ra, tôi sẽ chia sẻ một số mẹo giúp bạn thể hiện sự tự tin trong các buổi phỏng vấn liên quan đến dữ liệu sắp tới. 

MySQL là gì?

MySQL là hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) mã nguồn mở được xây dựng trên SQL, tổ chức dữ liệu thành các bảng có cấu trúc. Nó được phát triển bởi Oracle Corporation.

MySQL được xếp hạng là DBMS phổ biến nhất năm 2024 vì ngày càng nhiều doanh nghiệp chuyển dữ liệu của họ sang MySQL. Đó là lý do nếu bạn dự định làm việc với cơ sở dữ liệu, việc nắm vững MySQL và cơ sở dữ liệu quan hệ là vô cùng quan trọng. 

Biểu đồ hiển thị các hệ quản trị cơ sở dữ liệu phổ biến nhất năm 2024, trong đó MySQL là phổ biến nhất, tiếp theo là PostgreSQL.

Tính đến tháng 6/2024, MySQL là hệ quản trị cơ sở dữ liệu (DBMS) mã nguồn mở phổ biến nhất thế giới, với điểm xếp hạng 1061. Nguồn: Statista.

Câu hỏi phỏng vấn MySQL cơ bản

Ở giai đoạn đầu phỏng vấn, người phỏng vấn có thể hỏi các câu hỏi nền tảng để đánh giá hiểu biết của bạn về các khái niệm cơ bản của cơ sở dữ liệu và MySQL. 

1. Cơ sở dữ liệu là gì và khác gì với DBMS? 

Cơ sở dữ liệu là một kho lưu trữ chứa dữ liệu mà chúng ta có thể truy cập, sửa đổi và phân tích. Ví dụ, các nền tảng mạng xã hội lưu trữ dữ liệu về những ai đã thích bài đăng của chúng ta trong các cơ sở dữ liệu.

DBMS (Hệ quản trị cơ sở dữ liệu) là phần mềm cho phép chúng ta tương tác và quản lý dữ liệu đó bằng cách tạo người dùng và quản lý quyền truy cập của họ. MySQL là một trong những lựa chọn DBMS phổ biến nhất. Các ví dụ khác bao gồm PostgreSQL, MongoDBMicrosoft SQL Server.

2. MySQL khác gì so với các hệ quản trị cơ sở dữ liệu quan hệ khác?

MySQL là hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) mã nguồn mở sử dụng SQL để quản lý dữ liệu. Nó nổi tiếng nhờ dễ sử dụng, tốc độ và khả năng tương thích với các ứng dụng web. 

MySQL khác với các RDBMS khác như sau:

  • Đơn giản và hiệu năng: MySQL thường được khen ngợi về sự đơn giản và tối ưu hiệu năng, khiến nó trở thành lựa chọn hàng đầu cho nhà phát triển web và startup.
  • Tính năng nâng cao: Trong khi MySQL vượt trội về tính dễ dùng, nó có thể thiếu một số tính năng nâng cao có ở các RDBMS khác như PostgreSQL, chẳng hạn hỗ trợ toàn diện hơn cho giao dịch ACID, chỉ mục nâng cao và tập hợp kiểu dữ liệu rộng hơn.
  • Bộ máy lưu trữ: MySQL cho phép bạn chọn các bộ máy lưu trữ khác nhau (ví dụ: InnoDB, MyISAM) cho từng bảng, mang lại sự linh hoạt cho các trường hợp sử dụng cụ thể.

MySQL lý tưởng cho các kịch bản cần tốc độ và khả năng mở rộng; nhưng với những tính năng phức tạp hoặc cấp doanh nghiệp, PostgreSQL có thể là lựa chọn tốt hơn.

3. Các kiểu dữ liệu chính có trong MySQL là gì?

MySQL hỗ trợ nhiều kiểu dữ liệu được phân loại như sau:

  • Số: INT, DECIMAL, FLOAT, DOUBLE, v.v.
  • Chuỗi: CHAR, VARCHAR, TEXT, BLOB.
  • Ngày/giờ: DATE, DATETIME, TIMESTAMP, TIME.
  • JSON: Dùng để lưu trữ đối tượng JSON.

4. Sự khác nhau giữa kiểu dữ liệu INT và DECIMAL là gì? 

INT lưu số nguyên không có phần thập phân. Ta dùng khi không cần số lẻ. Ngược lại, DECIMAL có thể lưu giá trị tài chính và phù hợp cho các phép tính thập phân chính xác. 

5. DATE khác gì với DATETIME trong MySQL? 

Hàm DATE trong MySQL lưu ngày theo định dạng năm, tháng, ngày: 

YYYY-MM-DD

Trong khi đó, DATETIME lưu ngày kèm thời gian, trông như sau: 

YYYY-MM-DD HH:MM:SS 

6. Khóa ngoại (foreign key) là gì và bạn dùng nó thế nào trong cơ sở dữ liệu? 

Khóa ngoại là một trường trong bảng này liên kết đến khóa chính của bảng khác. 

Ví dụ, trong bảng customers lưu thông tin khách hàng, mỗi khách có customer_id duy nhất — ở một bảng khác tên transactions (lưu lịch sử mua), ta dùng customer_id làm khóa ngoại. customer_id trong bảng transactions sẽ liên kết mỗi giao dịch với một khách hàng cụ thể trong bảng customers .

Cú pháp SQL minh họa:

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. Sự khác nhau giữa INNER JOIN, LEFT JOIN, RIGHT JOIN và FULL JOIN là gì?

Join kết hợp các hàng từ hai hoặc nhiều bảng dựa trên cột liên quan. Khác biệt như sau:

  • INNER JOIN: Trả về các hàng có khớp ở cả hai bảng.
  • LEFT JOIN: Trả về tất cả hàng từ bảng bên trái và các hàng khớp từ bảng bên phải. Nếu không khớp, các cột của bảng bên phải trả về NULL.
  • RIGHT JOIN: Tương tự LEFT JOIN, trả về tất cả hàng từ bảng bên phải và các hàng khớp từ bảng bên trái.
  • FULL JOIN: Kết hợp kết quả của LEFT JOINRIGHT JOIN, bao gồm cả các hàng không khớp từ cả hai bảng.

8. Sự khác nhau giữa DELETE, TRUNCATE và DROP trong MySQL là gì?

Các lệnh như DELETE, TRUNCATEDROP nghe có vẻ giống nhau, nhưng hành vi khác nhau:

  • DELETE: Xóa các hàng trong bảng dựa trên điều kiện. Có thể rollback nếu nằm trong một giao dịch. Ví dụ:
DELETE FROM employees WHERE department_id = 5;
  • TRUNCATE: Xóa toàn bộ hàng trong bảng, nhưng vẫn giữ cấu trúc bảng. Nhanh hơn DELETE và không thể rollback. Ví dụ:
TRUNCATE TABLE employees;
  • DROP: Xóa hoàn toàn cấu trúc và dữ liệu bảng, cùng các phụ thuộc như chỉ mục. Ví dụ:
DROP TABLE employees;

9. Làm thế nào để tạo và chỉnh sửa một bảng trong MySQL? Cho ví dụ.

Để tạo bảng, bạn dùng câu lệnh CREATE TABLE, và để chỉnh sửa, thường dùng ALTER TABLE. Ví dụ:

  • Tạo bảng:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));
  • Chỉnh sửa để thêm cột:
ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);

10. Bảng tạm (temporary table) trong SQL là gì? 

Bảng tạm chỉ tồn tại trong phiên làm việc cơ sở dữ liệu hiện tại. Khi đóng phiên, bảng sẽ bị xóa. Kiểu bảng này có thể tạm lưu trữ kết quả trung gian. Ta có thể dùng cho thử nghiệm, lọc hoặc chuẩn bị dữ liệu trước khi chèn vào bảng vĩnh viễn.

Ví dụ:

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

11. Truy vấn lồng (subquery) trong MySQL là gì? Giải thích với ví dụ. 

Subquery (còn gọi là truy vấn lồng) được lồng trong một truy vấn khác. Nó chia nhỏ các thao tác phức tạp thành các bước dễ quản lý hơn. Ví dụ, bạn có thể dùng subquery để tìm nhân viên có mức lương cao hơn trung bình: 

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

Cùng phân tích:

  1. Truy vấn bên trong SELECT AVG(salary) FROM employees tính lương trung bình trước.
  2. Truy vấn bên ngoài dùng giá trị trung bình này để tìm nhân viên có lương cao hơn. 

12. Bạn sẽ dùng câu lệnh INSERT trong MySQL để thêm dữ liệu vào bảng như thế nào? Có mẹo hay nào không? 

Ta có thể dùng câu lệnh INSERT() để thêm dữ liệu vào bảng. Cú pháp cơ bản:

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

Một vài thực hành tốt khi dùng INSERT():

  1. Liệt kê rõ các cột. Điều này giúp mã rõ ràng hơn và tránh lỗi nếu cấu trúc bảng thay đổi sau này.
  2. Với các cột AUTO_INCREMENT như ID, bỏ qua trong lệnh INSERT(). MySQL sẽ tự xử lý để tránh trùng ID. 
  3. Nhất quán về dấu nháy chuỗi. Cá nhân tôi thích dấu nháy đơn, nhưng dùng dấu nào cũng được.
  4. Nếu chèn nhiều hàng, có thể gộp vào một lệnh duy nhất để hiệu năng tốt hơn.

13. Ý nghĩa của thuộc tính AUTO_INCREMENT trong MySQL là gì?

Thuộc tính AUTO_INCREMENT trong MySQL tạo ra các số thứ tự duy nhất cho một cột, thường là khóa chính của bảng.

Ví dụ tạo bảng với cột AUTO_INCREMENT:

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

Và chèn dữ liệu:

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

14. View trong MySQL là gì? 

View là một truy vấn được lưu lại và hoạt động như một bảng ảo. Nhờ đó, ta có thể lấy một truy vấn phức tạp, đặt tên và dùng nó như một bảng cho các truy vấn sau này. Bạn không phải gõ lại toàn bộ truy vấn mỗi lần.

Ví dụ, để đơn giản hóa việc truy vấn thông tin nhân viên kèm tên phòng ban, bạn có thể tạo view:

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;

Giờ bạn có thể truy vấn view employee_details như một bảng:

SELECT * FROM employee_details;

Tuy nhiên, chúng ta không thể dùng view để chèn và cập nhật dữ liệu. Phần lớn là chỉ đọc và ngăn người dùng truy cập trực tiếp cơ sở dữ liệu, tăng cường bảo mật dữ liệu. Đôi khi view có thể làm chậm truy vấn vì mỗi lần truy cập, truy vấn nền sẽ được chạy lại.

Câu hỏi phỏng vấn MySQL mức trung cấp

Phần này sẽ đề cập đến các chủ đề mức trung cấp. Những câu hỏi này chủ yếu dùng để kiểm tra hiểu biết của bạn về kiểu dữ liệu và cấu trúc trong MySQL.

15. Bảng có phiên bản hệ thống (system-versioned) là gì và hoạt động như thế nào? 

Bảng system-versioned lưu toàn bộ lịch sử thay đổi được thực hiện trên bảng. Vì giữ các phiên bản trước của từng hàng, ta có thể dùng chúng để kiểm toán và khôi phục dữ liệu. 

Chúng hoạt động bằng cách thêm hai cột — StartTimeEndTime — để ghi lại thời điểm mỗi hàng còn hiệu lực. Khi chèn, cập nhật hoặc xóa dữ liệu, các mốc thời gian này sẽ được cập nhật:

  • Insert: Một hàng mới được thêm với StartTime là thời điểm hiện tại và EndTime9999-12-31 23:59:59 (hoặc giá trị tương đương “vô thời hạn”). Điều này cho biết hàng hiện đang hiệu lực.
  • Update: EndTime của hàng gốc được cập nhật về thời điểm hiện tại để đánh dấu là không còn hiệu lực. Sau đó tạo một hàng mới với dữ liệu cập nhật, StartTime là hiện tại và EndTime là “vô thời hạn”.
  • Delete: EndTime của hàng hiện có được cập nhật về thời điểm hiện tại, cho biết hàng không còn hiệu lực.

Bằng cách dùng mệnh đề FOR SYSTEM_TIME trong SQL, bạn có thể truy vấn bảng để xem trạng thái của nó tại một thời điểm cụ thể hoặc trong một khoảng thời gian. Ví dụ:

  • FOR SYSTEM_TIME AS OF '2024-01-01': Lấy trạng thái bảng tại ngày 1/1/2024.
  • FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31': Hiển thị tất cả các hàng còn hiệu lực trong khoảng thời gian này.

16. Giao dịch (transaction) trong MySQL là gì và bạn dùng như thế nào?

Giao dịch là một tập hợp thao tác được thực thi như một đơn vị duy nhất. Chúng đảm bảo tính toàn vẹn dữ liệu bằng cách cho phép tất cả thao tác cùng thành công hoặc cùng thất bại.

Ví dụ sử dụng:

START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- Lưu thay đổi vĩnh viễn
-- hoặc
ROLLBACK; -- Hoàn tác thay đổi

17. Ràng buộc mặc định (default constraint) trong MySQL là gì? Làm thế nào đặt giá trị mặc định cho một cột?

Ràng buộc mặc định trong MySQL gán giá trị mặc định cho một cột khi không cung cấp giá trị rõ ràng trong thao tác INSERT. Điều này đảm bảo cột vẫn hợp lệ dù người dùng bỏ qua khi nhập dữ liệu.

Cách tạo bảng với giá trị mặc định:

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

Sau đó bạn có thể chèn một hàng mà không chỉ định status:

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

Cách làm này giảm khả năng xuất hiện NULL hoặc dữ liệu không hợp lệ ở các cột quan trọng và đơn giản hóa truy vấn bằng cách loại bỏ nhu cầu xử lý trường hợp mặc định một cách tường minh.

Kết quả:

Field

Type

Null

Key

Default

Extra

id

INT

NO

PRI

NULL

AUTO_INCREMENT

name

VARCHAR(50)

YES

 

NULL

 

status

VARCHAR(10)

YES

 

active

 

Lệnh này hữu ích vì:

  • Giúp nhà phát triển hiểu lược đồ bảng trước khi viết truy vấn.
  • Có thể dùng để gỡ lỗi, đặc biệt khi làm việc với cơ sở dữ liệu không quen thuộc.
  • Nhanh chóng xác định các ràng buộc, như khóa chính hoặc giá trị mặc định.

19. Bạn sẽ dùng các hàm xử lý chuỗi trong SQL để quản lý văn bản như thế nào? 

Các hàm chuỗi khác nhau trong SQL làm việc với tên và dữ liệu văn bản khác. Ví dụ:

  • Hàm LENGTH() hiển thị số ký tự trong một tên. 
  • UPPER()LOWER() chuyển văn bản thành viết hoa hoặc viết thường toàn bộ. 
  • CONCAT() nối họ và tên thành một cột. 
  • SUBSTRING() trích một phần cụ thể của văn bản. Ví dụ, ta có thể dùng để tách tháng từ ngày sinh. 

Ví dụ truy vấn:

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;

Truy vấn này:

  • Chuyển tên sang viết hoa.
  • Kết hợp họ và tên thành tên đầy đủ.
  • Trích tháng sinh từ cột birthdate.
  • Loại bỏ khoảng trắng ở họ.
  • Thay thế tất cả ký tự "a" bằng "@" trong tên.

20. Bạn sẽ cập nhật một hàng cụ thể trong cơ sở dữ liệu bằng SQL như thế nào?

Bạn có thể dùng câu lệnh UPDATE và mệnh đề WHERE để xác định bản ghi cần thay đổi. 

Ví dụ, nếu muốn cập nhật thể loại phim “Inception” năm 2010 thành “Sci-fi”, bạn có thể dùng truy vấn sau: 

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

Ở đây, UPDATE movies chỉ định bảng cần cập nhật, và mệnh đề WHERE chọn hàng có tiêu đề “Inception” và năm “2010”. 

Câu hỏi phỏng vấn MySQL nâng cao

Các câu hỏi nâng cao kiểm tra khả năng xử lý các tình huống MySQL phức tạp và cho người phỏng vấn thấy khả năng ra quyết định của bạn. 

21. Trigger trong MySQL là gì? Cách triển khai? 

Trong MySQL, trigger là một tập hành động chạy khi có sự kiện cơ sở dữ liệu xảy ra. Trigger có thể được cấu hình để thực thi trước hoặc sau các sự kiện như INSERT, UPDATE hoặc DELETE

Ví dụ, giả sử có bảng orders nơi các đơn hàng mới được thêm. Ta có thể tạo trigger ghi log mọi đơn hàng mới vào bảng 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;

Sau khi trigger chạy, bảng order_history được cập nhật tự động:

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. Vì sao thêm chỉ mục (index) giúp truy vấn SQL nhanh hơn? 

Nếu không có chỉ mục, cơ sở dữ liệu phải quét từng hàng để tìm mục cụ thể. Chỉ mục hoạt động như một mục lục, giúp cơ sở dữ liệu truy cập các hàng liên quan. Vì vậy, thêm chỉ mục rút ngắn thời gian tìm kiếm và làm truy vấn chạy nhanh hơn. 

Chỉ mục thường được triển khai bằng các cấu trúc dữ liệu như B-tree hoặc bảng băm, cho phép cơ sở dữ liệu thực hiện tìm kiếm, tra cứu và quét phạm vi hiệu quả.

Ví dụ tạo chỉ mục:

-- Không có chỉ mục:
SELECT * FROM employees WHERE last_name = 'Smith';
-- Thêm chỉ mục trên cột last_name:
CREATE INDEX idx_last_name ON employees(last_name);
-- Với chỉ mục, cơ sở dữ liệu có thể nhanh chóng xác định các hàng có 'Smith' trong cột last_name.

Chỉ mục cũng có nhược điểm, ví dụ:

  • Ghi chậm hơn: INSERT, UPDATEDELETE operations are slower because the index must be updated each time data changes.
  • Tốn dung lượng lưu trữ: Chỉ mục cần thêm không gian lưu trữ.

23. Ta dùng kiểu dữ liệu nào cho trọng lượng và giá của sản phẩm trong bảng SQL, và vì sao? 

Ta dùng kiểu FLOAT hoặc REAL để lưu trọng lượng vì trọng lượng thường có phần thập phân và chấp nhận sai số nhỏ. Vì các kiểu này lưu giá trị xấp xỉ, chúng phù hợp hơn cho cột trọng lượng. 

Kiểu DECIMAL thường dùng để lưu giá vì các giá trị tài chính như giá không chấp nhận dù chỉ làm tròn nhỏ. Độ chính xác này chỉ có ở kiểu thập phân (ví dụ, DECIMAL(10, 2) cho 10 chữ số, với 2 chữ số sau dấu thập phân).

24. Làm thế nào tìm các hàng trùng lặp trong SQL bằng hàm cửa sổ? 

Cách tìm trùng lặp bằng hàm cửa sổ 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;

Diễn giải cách hoạt động:

1. ROW_NUMBER() gán số thứ tự cho mỗi hàng trong kết quả. 

2. PARTITION BY nhóm các hàng theo product_namecategory

3. Trong mỗi nhóm, các hàng được đánh số bắt đầu từ 1. 

4. Bất kỳ row_num lớn hơn 1 cho thấy bản ghi trùng. 

Ví dụ, nếu có các bản ghi:

  • Sản phẩm A, Danh mục X, row_num = 1
  • Sản phẩm A, Danh mục X, row_num = 2 (trùng)
  • Sản phẩm B, Danh mục Y, row_num = 1

Truy vấn sẽ hiển thị hàng thứ hai vì row_num lớn hơn 1.

25. Làm thế nào tạo và dùng stored procedure với tham số trong MySQL? Giải thích bằng ví dụ. 

Ta có thể lưu và tái sử dụng các truy vấn phức tạp bằng stored procedure để giúp thao tác cơ sở dữ liệu hiệu quả và dễ bảo trì hơn. Hãy xem cách tạo và dùng chúng với tham số qua ví dụ thực tế.

Giả sử có cơ sở dữ liệu sinh viên và muốn tạo thủ tục lọc sinh viên theo tuổi. Cách làm như sau:

Đầu tiên, tạo một stored procedure đơn giản nhận tham số tuổi:

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

Để dùng thủ tục này, chỉ cần CALL với độ tuổi mong muốn:

CALL get_student_info(21);

Ta có thể làm thủ tục tinh vi hơn bằng tham số đầu ra. Ví dụ, tạo thủ tục đếm số sinh viên ở độ tuổi cụ thể:

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;

Để lấy kết quả từ thủ tục này:

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

26. Vì sao tính toàn vẹn tham chiếu (referential integrity) quan trọng trong cơ sở dữ liệu? 

Tính toàn vẹn tham chiếu giữ cho các mối quan hệ giữa các bảng luôn chính xác. Khi tạo khóa ngoại, nó đảm bảo các giá trị trong một bảng khớp với giá trị duy nhất trong bảng được tham chiếu.

Ví dụ thực tế: Giả sử bạn quản lý cơ sở dữ liệu thương mại điện tử. Có bảng Customers và bảng Orders. Mỗi đơn hàng phải thuộc về một khách hàng có thật. Tính toàn vẹn tham chiếu, được thực thi qua khóa ngoại, đảm bảo điều này bằng cách:

  • Không thể tạo đơn hàng cho khách hàng không tồn tại.
  • Không thể xóa khách hàng còn đơn hàng (trừ khi cấu hình rõ điều gì xảy ra với các đơn đó).
  • Không thể cập nhật ID khách hàng nếu khách đó đang có đơn hàng.

Vì vậy khi tạo ràng buộc khóa ngoại như sau:

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

Cơ sở dữ liệu sẽ tự động thực thi các quy tắc này:

  • Mỗi CustomerID trong bảng Orders phải tồn tại trong bảng Customers.
  • Mọi cố gắng vi phạm (như chèn CustomerID không hợp lệ) sẽ bị từ chối.

Điều này ngăn những bất nhất dữ liệu có thể gây vấn đề nghiêm trọng, như các đơn hàng không thể truy vết về khách hàng thực hoặc báo cáo thiếu thông tin khách. 

Câu hỏi phỏng vấn MySQL cho Quản trị viên Cơ sở dữ liệu

Nếu bạn ứng tuyển riêng cho vai trò quản trị viên cơ sở dữ liệu, dưới đây là một số câu hỏi nhà tuyển dụng có thể hỏi.

27. Tại sao một ứng dụng lớn lại dùng sharding cơ sở dữ liệu? Hãy nêu các thách thức. 

Một ứng dụng lớn dùng sharding để chia dữ liệu lớn trên nhiều máy chủ. Mỗi phần (shard) chứa một phần nhỏ dữ liệu. Vì phân tán tải dữ liệu, không cần phần cứng cao cấp. Dù tốc độ và khả năng mở rộng được cải thiện, cũng có thách thức: 

  • Một số truy vấn như join có thể không hoạt động, gây phức tạp trong quản lý dữ liệu. 
  • Khi dữ liệu tăng, shard có thể bị quá tải, tạo điểm nóng làm chậm hiệu năng. 

28. Giải thích vai trò của redo log trong quá trình khôi phục sau sự cố của MySQL. 

Mỗi lần dữ liệu được sửa đổi trong MySQL, nó cần được ghi xuống đĩa. Tuy nhiên, ghi trực tiếp vào tệp dữ liệu vừa chậm vừa rủi ro. Vì vậy trước khi MySQL sửa đổi bất kỳ tệp dữ liệu nào, nó ghi trước những gì sẽ làm vào redo log. Cách này an toàn hơn so với cập nhật ngẫu nhiên tệp dữ liệu.

Giả sử bạn cập nhật địa chỉ khách hàng:

  1. MySQL ghi thay đổi này vào redo log trước.
  2. Sau đó xác nhận giao dịch của bạn là đã commit.
  3. Cuối cùng, áp dụng thay đổi vào tệp dữ liệu thực sự.

Khôi phục sau sự cố quan trọng nếu MySQL gặp sự cố sau bước 1 hoặc 2 nhưng trước bước 3. Khi khởi động lại, MySQL xem redo log rồi hoàn tất công việc còn dang dở bằng cách phát lại các thay đổi đã ghi trong redo log. Điều này đảm bảo các giao dịch đã commit không bị mất, ngay cả khi MySQL gặp sự cố vào thời điểm bất tiện.

29. Các bộ máy lưu trữ khác nhau có trong MySQL là gì và chúng khác nhau thế nào?

MySQL hỗ trợ nhiều bộ máy lưu trữ khác nhau, mỗi loại được tối ưu cho các trường hợp sử dụng riêng. Sau đây là so sánh những loại phổ biến:

Bộ máy lưu trữ

Tính năng

Trường hợp sử dụng

InnoDB

- Bộ máy mặc định.

- Tuân thủ ACID.

- Khóa mức hàng.

- Hỗ trợ giao dịch và khóa ngoại.

Ứng dụng yêu cầu tính toàn vẹn dữ liệu cao, như nền tảng thương mại điện tử hoặc hệ thống tài chính.

MyISAM

- Nhanh cho tác vụ đọc nhiều.

- Khóa mức bảng.

- Không hỗ trợ giao dịch hoặc khóa ngoại.

Ứng dụng thiên về đọc, nơi tốc độ quan trọng hơn tính toàn vẹn dữ liệu.

Memory

- Lưu dữ liệu trong RAM.

- Cực nhanh.

- Mất dữ liệu khi khởi động lại.

- Kích thước hạn chế.

Lưu trữ tạm thời, caching hoặc quản lý phiên.

CSV

- Lưu dữ liệu trong tệp CSV thuần.

- Dễ tích hợp với công cụ bên ngoài.

- Không hỗ trợ chỉ mục.

Trao đổi dữ liệu giữa ứng dụng hoặc lưu trữ đơn giản không cần truy vấn phức tạp.

Archive

- Tối ưu nén cao.

- Chỉ hỗ trợ thao tác INSERT và SELECT.

- Không có chỉ mục.

Lưu trữ dữ liệu lịch sử hoặc log, nơi truy xuất dữ liệu không thường xuyên.

NDB (Clustered)

- Lưu trữ phân tán cho MySQL Cluster.

- Tính sẵn sàng cao và chống lỗi.

- Hỗ trợ giao dịch.

Ứng dụng phân tán quy mô lớn yêu cầu hiệu năng thời gian thực.

30. Làm thế nào đặt bộ máy lưu trữ mặc định trong MySQL? 

Trước tiên, bạn có thể kiểm tra bộ máy mặc định hiện tại:

SHOW ENGINES;

Khuyến nghị dùng InnoDB làm mặc định vì hỗ trợ các tính năng quan trọng như:

  • Giao dịch tuân thủ ACID
  • Ràng buộc khóa ngoại
  • Khôi phục sau sự cố
  • Khóa mức hàng

Để tạm thời thay đổi bộ máy mặc định cho phiên hiện tại, bạn có thể dùng:

SET default_storage_engine = 'InnoDB';

Để thay đổi vĩnh viễn, chỉnh tệp cấu hình MySQL bằng cách thêm dòng này trong phần [mysqld]:

default-storage-engine = InnoDB

31. Làm thế nào sửa chữa các bảng bị hỏng trong MySQL? 

Trước tiên, bạn có thể kiểm tra tất cả cơ sở dữ liệu bằng lệnh: 

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

Lệnh sẽ quét tất cả bảng và báo cáo nếu có hỏng hóc. Sau đó, bạn có thể chạy lệnh sau để sửa bảng: 

mysqlcheck --repair database_name table_name -u root -p

Việc sửa có thể dẫn đến mất dữ liệu trong trường hợp hỏng nặng, vì vậy hãy sao lưu dữ liệu trước.

Câu hỏi phỏng vấn MySQL theo tình huống và giải quyết vấn đề

Những câu hỏi này đánh giá kinh nghiệm của bạn với các tình huống phức tạp thực tế và khả năng giải quyết vấn đề.

32. Giải thích một tình huống bạn đã dùng subquery trong MySQL.

Bạn có thể trả lời như sau:

Tôi từng quản lý cơ sở dữ liệu một cửa hàng thương mại điện tử ở công việc gần đây, nơi tôi phải chuẩn bị báo cáo sản phẩm. Mục tiêu là tìm các sản phẩm tạo doanh số trên trung bình, yêu cầu dùng subquery để thực hiện phân tích nhiều bước này.

Đây là truy vấn SQL tôi xây dựng để giải quyết:

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;

Đầu tiên, tôi xác định chuẩn bằng cách tính doanh số trung bình trên tất cả sản phẩm. Để làm vậy, tôi dùng subquery trong mệnh đề WHERE tính AVG(sales_amount) từ bảng sales. Subquery này hoạt động như một ngưỡng động để đo hiệu suất từng sản phẩm.

Truy vấn chính sau đó join bảng products và sales để lấy chi tiết sản phẩm liên quan, trong khi mệnh đề WHERE lọc các sản phẩm có doanh số dưới mức trung bình đã tính. 

Bằng cách cấu trúc truy vấn như vậy, tôi có thể xác định sản phẩm hiệu suất cao trong một thao tác cơ sở dữ liệu duy nhất thay vì chạy nhiều truy vấn riêng.

33. Bạn có thể giải thích một tình huống đã dùng SQL join để kết hợp dữ liệu từ nhiều bảng? 

Ví dụ câu trả lời:

Gần đây, tôi làm một dự án với hai bảng chính — một bảng doanh số sản phẩm và một bảng chi tiết sản phẩm. Nhiệm vụ của tôi là tạo báo cáo hiển thị doanh số, tên sản phẩm, danh mụcgiá.

Để kết hợp dữ liệu liên quan, tôi dùng INNER JOIN trên cột chung product_id để liên kết giao dịch bán với chi tiết sản phẩm:

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;

Báo cáo cung cấp bức tranh rõ ràng về xu hướng doanh số, giúp các bên liên quan xác định danh mục sản phẩm nào hoạt động tốt và danh mục nào cần chú ý.

34. Bạn có kinh nghiệm với trigger không? Hãy giải thích cách bạn đã dùng chúng.

Ví dụ trả lời:

Có, tôi có nhiều kinh nghiệm với trigger trong cơ sở dữ liệu. Ở vai trò gần đây, tôi triển khai trigger AFTER UPDATE để kiểm toán thay đổi giá. 

Cụ thể: Tôi tạo trigger tự động ghi lại lịch sử giá mỗi khi giá sản phẩm thay đổi. Đây là script SQL tôi viết:

CREATE TRIGGER tr_AuditPriceChanges
ON Products
AFTER UPDATE AS
BEGIN
    -- Only execute if the price was actually changed
    IF UPDATE(UnitPrice)
    BEGIN
        INSERT INTO PriceAudit (
            ProductID,
            OldPrice,
            NewPrice,
            ChangedBy,
            ChangeDate,
            PercentageChange
        )
        SELECT 
            i.ProductID,
            d.UnitPrice AS OldPrice,
            i.UnitPrice AS NewPrice,
            SYSTEM_USER,
            GETDATE(),
            ROUND(((i.UnitPrice - d.UnitPrice) / d.UnitPrice * 100), 2)
        FROM INSERTED i
        JOIN DELETED d ON i.ProductID = d.ProductID
        WHERE i.UnitPrice <> d.UnitPrice;
    END
END;

Giải pháp hiệu quả vì:

  1. Chỉ kích hoạt khi có thay đổi giá thực sự.
  2. Ghi nhận người thực hiện thay đổi bằng SYSTEM_USER.
  3. Tính phần trăm thay đổi phục vụ báo cáo.
  4. Bao gồm mệnh đề WHERE để loại các trường hợp không thay đổi do cập nhật cột khác.

Tôi cũng thêm xử lý lỗi và ghi log khi phát hiện một số trường hợp biên với giá NULL.

Mẹo chuẩn bị cho phỏng vấn MySQL

Nếu bạn mới bắt đầu sự nghiệp, dưới đây là vài mẹo giúp bạn vượt qua buổi phỏng vấn sắp tới:

Nắm vững các khái niệm cốt lõi của MySQL: Học các kiến thức nền tảng về cơ sở dữ liệu như index, giao dịch và bộ tối ưu truy vấn. Hiểu cách MySQL xử lý truy vấn và quản lý lưu trữ dữ liệu. Điều này giúp bạn viết truy vấn hiệu quả và giải thích giải pháp trong phỏng vấn.

Thực hành trực tiếp: Cài đặt MySQL trên máy tính và luyện tập thường xuyên. Tạo các cơ sở dữ liệu thử nghiệm, viết nhiều loại truy vấn và cố gắng tối ưu chúng. Thực hành thực tế là cách tốt nhất để hiểu cách mọi thứ vận hành và xây dựng sự tự tin cho phỏng vấn.

Để ôn luyện thêm, hãy xem các tài nguyên của DataCamp: 

Tìm hiểu về công cụ và tích hợp MySQL: Làm quen với MySQL Workbench hoặc công cụ khác cho quản trị cơ sở dữ liệu và theo dõi cơ bản. Bạn cũng có thể khám phá cách MySQL hoạt động với Python và các framework liên quan, thể hiện bạn có thể làm việc trong môi trường phát triển thực tế.

Kết luận

Vậy là xong! Tôi đã tổng hợp 34 câu hỏi phỏng vấn MySQL hàng đầu để giúp bạn chinh phục công việc tiếp theo. Dù bạn ứng tuyển vị trí entry-level hay quản trị dữ liệu nâng cao, bạn cần nắm vững nền tảng MySQL, tối ưu truy vấn và quản trị cơ sở dữ liệu để nổi bật. 

Để mở rộng kiến thức về các hệ quản trị cơ sở dữ liệu khác, hãy xem các khóa học SQL của DataCamp.


Laiba Siddiqui's photo
Author
Laiba Siddiqui
LinkedIn
Twitter

Tôi là một chiến lược gia nội dung, yêu thích việc đơn giản hóa các chủ đề phức tạp. Tôi đã giúp các công ty như Splunk, Hackernoon và Tiiny Host tạo nội dung hấp dẫn và giàu thông tin cho khán giả của họ.

Chủ đề

Tìm hiểu thêm về SQL với các khóa học này!

Courses

Xử lý dữ liệu trong SQL

4 giờ
317K
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow