
Bạn đã ôn SQL cả tuần, tự tin bước vào phòng phỏng vấn Data Analyst — rồi bị hỏi một câu tưởng đơn giản mà không trả lời được. Cảm giác đó rất quen thuộc với nhiều bạn.
Thực tế, theo khảo sát từ các HR tuyển dụng DA tại Việt Nam, hơn 80% ứng viên bị loại ở vòng kỹ thuật không phải vì không biết SQL — mà vì không biết SQL đúng cách: sai logic, không tối ưu, hoặc không hiểu khi nào dùng hàm nào. Dưới đây là 5 dạng câu hỏi SQL điển hình và cách trả lời đúng để bạn vượt qua vòng 1.
1. Window Function: ROW_NUMBER vs RANK vs DENSE_RANK
Đây là câu hỏi phân biệt ứng viên mới học với người đã thực chiến. Nhà tuyển dụng thường hỏi: “Lấy nhân viên có lương cao nhất trong mỗi phòng ban” hoặc “Xếp hạng doanh số theo tháng”.
Nhiều bạn dùng MAX() kết hợp GROUP BY rồi JOIN lại — cách này chạy được nhưng sẽ bị đánh giá thấp. Cách đúng là dùng Window Function:
-- Lấy nhân viên lương cao nhất mỗi phòng ban
WITH ranked AS (
SELECT
employee_id,
department_id,
salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn
FROM employees
)
SELECT * FROM ranked WHERE rn = 1;
Phân biệt 3 hàm:
ROW_NUMBER(): luôn cho số thứ tự khác nhau dù giá trị bằng nhau (1, 2, 3, 4)RANK(): bỏ qua số thứ tự khi có tie (1, 1, 3, 4)DENSE_RANK(): không bỏ số thứ tự khi có tie (1, 1, 2, 3)
Khi hỏi “top 1 mỗi nhóm” dùng ROW_NUMBER(). Khi hỏi “xếp hạng” cho phép đồng hạng thì dùng DENSE_RANK().
2. Self JOIN: Tìm Mối Quan Hệ Trong Cùng Một Bảng
Dạng câu hỏi: “Tìm tất cả nhân viên có lương cao hơn manager của họ” hoặc “Liệt kê cặp sản phẩm thường được mua cùng nhau”.
-- Nhân viên có lương cao hơn manager
SELECT
e.employee_id,
e.name AS employee_name,
e.salary AS employee_salary,
m.name AS manager_name,
m.salary AS manager_salary
FROM employees e
JOIN employees m ON e.manager_id = m.employee_id
WHERE e.salary > m.salary;
Trick nhớ: khi bảng có cột tự tham chiếu (manager_id → employee_id, parent_id → id), đó là dấu hiệu cần Self JOIN.
3. NULL Handling: Bẫy Logic Cực Kỳ Phổ Biến
Câu hỏi: “Tìm tất cả đơn hàng chưa có ngày giao” — câu trả lời sai:
-- SAI: NULL không so sánh bằng = được
SELECT * FROM orders WHERE delivery_date = NULL;
-- ĐÚNG
SELECT * FROM orders WHERE delivery_date IS NULL;
Phức tạp hơn — xử lý NULL trong phép tính:
-- Tính doanh thu, nếu discount NULL thì coi là 0
SELECT
order_id,
price * (1 - COALESCE(discount, 0)) AS final_price
FROM orders;
Nhà tuyển dụng rất hay test NULL vì đây là lỗi phổ biến trong dữ liệu thực tế tại doanh nghiệp Việt Nam, nơi dữ liệu thường không được clean kỹ.
4. Subquery vs CTE: Khi Nào Dùng Cái Nào?
Câu hỏi: “Tìm khách hàng có tổng chi tiêu trên trung bình”.
-- Dùng CTE (rõ ràng, dễ đọc)
WITH customer_spending AS (
SELECT
customer_id,
SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
),
avg_spending AS (
SELECT AVG(total_spent) AS avg_amount FROM customer_spending
)
SELECT cs.customer_id, cs.total_spent
FROM customer_spending cs, avg_spending a
WHERE cs.total_spent > a.avg_amount;
Dùng CTE khi logic phức tạp, nhiều bước, cần tái sử dụng. Dùng Subquery khi logic đơn giản, one-time. Trong phỏng vấn, ưu tiên CTE để thể hiện tư duy rõ ràng.
5. Aggregation + HAVING: Lọc Sau Khi GROUP BY
Câu hỏi: “Tìm sản phẩm có số lượng đơn hàng trên 100 trong tháng 5/2026”.
-- SAI: WHERE không dùng được với aggregate function
SELECT product_id, COUNT(*) AS order_count
FROM orders
WHERE order_date BETWEEN '2026-05-01' AND '2026-05-31'
AND COUNT(*) > 100
GROUP BY product_id;
-- ĐÚNG: dùng HAVING
SELECT product_id, COUNT(*) AS order_count
FROM orders
WHERE order_date BETWEEN '2026-05-01' AND '2026-05-31'
GROUP BY product_id
HAVING COUNT(*) > 100;
Quy tắc nhớ: WHERE lọc hàng trước khi GROUP BY. HAVING lọc nhóm sau khi GROUP BY.
Tổng Kết: 5 Điểm Cần Nhớ
- Window Function (ROW_NUMBER / RANK / DENSE_RANK) — dùng khi cần xếp hạng trong nhóm
- Self JOIN — khi bảng có cột tự tham chiếu
- NULL phải dùng IS NULL / IS NOT NULL, không dùng = NULL
- CTE ưu tiên hơn Subquery khi logic nhiều bước
- HAVING thay WHERE khi lọc sau aggregate
Nếu bạn đang chuẩn bị cho vòng phỏng vấn Data Analyst hoặc muốn nâng cao SQL từ cơ bản đến thực chiến, khóa học SQL ứng dụng tại MCNA sẽ giúp bạn luyện đúng những dạng bài thực tế mà doanh nghiệp hay hỏi nhất. Liên hệ Mr. Sơn 0916.442.368 để được tư vấn lộ trình học phù hợp.
Triều Đặng — Middle Data Analyst tại MCNA Technology School.
🌐 Website chính thức | 📞 0916.442.368 (Mr. Son)
Hệ thống cơ sở đào tạo: 📍 Cơ sở 1: 30 Trung Liệt, Đống Đa, Hà Nội. 📍 Cơ sở 2: Liền kề 44B, TT2, Văn Quán, Hà Đông, Hà Nội. 📍 Cơ sở 3: The BIB Space, 50B Phan Tây Hồ, Cầu Kiệu, TPHCM.
