SQL cơ bản cho Tester trái ngành: 5 câu Query cần biết để kiểm tra dữ liệu (2026)

3 tháng trước · 8 phút đọc
Tại sao Tester cần biết SQL?
Mình nhớ tuần đầu đi làm tester, dev fix xong bug và bảo: "Em check DB xem data đã đúng chưa nhé." Mình ngồi nhìn màn hình không biết bắt đầu từ đâu. Không biết SQL lúc đó thật sự là điểm yếu lớn.
Thực tế khi làm tester, có khoảng phần lớn dự án phần mềm yêu cầu tester biết truy vấn database cơ bản - không phải để viết code, mà để xác minh dữ liệu sau khi test. Ví dụ:
- Bạn test tính năng đăng ký tài khoản. Màn hình báo thành công, nhưng user có thật sự được tạo trong DB chưa?
- Dev fix bug tính toán đơn hàng. Số tiền hiển thị đúng, nhưng trong bảng
orderscó khớp không? - Tính năng xóa dữ liệu: bấm xóa xong, record đó có thật sự biến mất hay chỉ ẩn đi?
Những câu hỏi này chỉ SQL mới trả lời được. Giao diện đôi khi nói dối - dữ liệu thật nằm trong database.
Giao diện hiển thị đúng chưa chắc DB đã đúng - đây là lý do tester cần SQL
Tin vui: bạn không cần học lập trình để dùng SQL cho việc test. 5 dạng câu query trong bài này đủ để xử lý 80-90% tình huống kiểm tra dữ liệu thường gặp khi đi làm. Mình sẽ giải thích từng dòng theo cách dễ hiểu nhất có thể.
Câu 1: SELECT và WHERE - truy vấn cơ bản nhất
Đây là 2 từ khóa bạn sẽ dùng mỗi ngày. Hiểu 2 cái này xong thì phần còn lại học nhanh hơn nhiều.
SELECT nghĩa là "lấy cột nào". WHERE nghĩa là "theo điều kiện gì".
Dịch ra tiếng Việt: Lấy tất cả thông tin (*) từ bảng users, với điều kiện email bằng '[email protected]'.
Dấu * nghĩa là "lấy tất cả cột". Nếu chỉ muốn xem vài cột:
SELECT và WHERE là bộ đôi quan trọng nhất - nắm 2 này là dùng được ngay
Dùng khi test gì?
- Sau khi đăng ký tài khoản: kiểm tra user đã tồn tại trong DB chưa
- Sau khi cập nhật thông tin: xem dữ liệu đã thay đổi đúng chưa
- Sau khi đặt hàng: tìm đơn hàng theo email hoặc mã đơn
Lưu ý nhỏ: chuỗi ký tự (text) phải đặt trong dấu nháy đơn 'như thế này'. Số thì không cần: WHERE id = 5.
Câu 2: ORDER BY và LIMIT - tìm dữ liệu mới nhất
Bạn test xong tính năng, muốn kiểm tra bản ghi vừa tạo có trong DB không. Tìm theo email thì dễ, nhưng nếu không biết email chính xác thì sao?
Dùng ORDER BY để sắp xếp và LIMIT để giới hạn kết quả:
DESC nghĩa là giảm dần (mới nhất lên đầu). ASC là tăng dần (cũ nhất lên đầu). LIMIT 10 chỉ lấy 10 bản ghi thôi, không kéo cả ngàn dòng về.
Xem 10 bản ghi mới nhất giúp verify nhanh sau mỗi test case
Mình hay dùng combo này ngay sau khi bấm submit một form. Chạy query xem record mới nhất, so sánh với dữ liệu mình vừa nhập. Sai chỗ nào sẽ thấy ngay.
Kết hợp cả 3 lại:
CURDATE() trả về ngày hôm nay. DATE(created_at) lấy phần ngày từ cột timestamp. Câu này hữu ích khi bạn test nhiều lần trong ngày và muốn xem chỉ data của hôm nay.
Câu 3: COUNT - đếm số lượng bản ghi
Tính năng gửi email xác nhận: hệ thống báo gửi cho 150 user, nhưng thật sự bao nhiêu người nhận được? COUNT giúp xác minh số lượng.
AS tong_user_active đặt tên cho cột kết quả. Không bắt buộc, nhưng đặt tên rõ hơn thì đọc dễ hơn.
COUNT giúp verify số lượng - màn hình hiện 150 nhưng DB có đúng 150 không?
Dùng COUNT kết hợp với GROUP BY để đếm theo nhóm:
Kết quả trả về dạng:
| status | so_luong |
|---|---|
| active | 1243 |
| inactive | 87 |
| pending | 32 |
Câu này giúp mình verify nhanh toàn bộ phân phối data mà không cần đọc từng dòng. Test tính năng vô hiệu hóa tài khoản hàng loạt? Chạy query này trước và sau, so sánh số liệu là biết ngay đúng chưa.
Mẹo: COUNT(*) đếm tất cả dòng kể cả NULL. COUNT(column_name) chỉ đếm dòng có giá trị ở cột đó, bỏ qua NULL. Biết điểm khác biệt này tránh được nhiều nhầm lẫn khi verify data.
Câu 4: JOIN - kết hợp dữ liệu từ nhiều bảng
Database thực tế không bao giờ chỉ có 1 bảng. Thông tin user ở bảng users, đơn hàng ở bảng orders, sản phẩm ở bảng products. JOIN dùng để kéo dữ liệu từ nhiều bảng về cùng một lúc.
Nghe có vẻ phức tạp, nhưng thật ra chỉ cần hiểu 1 loại là đủ dùng cho phần lớn tình huống test: INNER JOIN.
INNER JOIN nối 2 bảng lại - như ghép 2 mảnh puzzle có cùng 1 mảnh khớp nhau
Giải thích từng phần:
FROM orders AS o: lấy từ bảngorders, đặt bí danh ngắn làoINNER JOIN users AS u: kết hợp với bảngusers, bí danhuON o.user_id = u.user_id: khớp theo cộtuser_idcủa 2 bảng- Sau đó dùng
o.vàu.để phân biệt cột thuộc bảng nào
Dùng khi test gì? Khi cần verify dữ liệu có liên quan nhau đúng không. Ví dụ: đơn hàng order_id = 1001 có thật sự thuộc về user email = '[email protected]' không? Một câu JOIN là ra ngay.
Thấy khó ở phần này bình thường. Mình cũng mất 2-3 ngày mới quen với cú pháp JOIN. Cứ copy template trên, thay tên bảng và tên cột là dùng được.
Câu 5: UPDATE kiểm tra và IS NULL - tìm dữ liệu bị thiếu
Tìm dữ liệu NULL là kỹ năng mình dùng rất thường khi test. NULL trong database nghĩa là "không có giá trị" - khác với chuỗi rỗng '' hay số 0. Nếu ô dữ liệu bị NULL khi không được phép thì đó là bug.
Không viết WHERE phone = NULL - cách đó không hoạt động trong SQL. Phải dùng IS NULL.
IS NULL phát hiện dữ liệu bị thiếu - bug im lặng nguy hiểm nhất trong database
Câu query thứ 2 rất hữu ích: tìm đơn hàng đã ở trạng thái "shipped" nhưng lại không có ngày giao. Đây là inconsistency rõ ràng - tester phải bắt được loại lỗi này trước khi production.
IS NOT NULL dùng ngược lại:
Dịch: đếm số user đăng ký hơn 7 ngày mà vẫn chưa xác minh email. Đây là loại data anomaly (dữ liệu bất thường) mà tester phải chủ động tìm, không đợi user báo bug.
Tải về file tổng hợp 5 câu query này để luyện tập: Tải SQL Cheat Sheet cho Tester
