sql cho tester

Câu lệnh SQL cho tester

Các Lệnh SQL Cơ Bản Mà Tester Nào Cũng Cần Biết

Nếu bạn đang làm Manual Tester hay Automation Tester, chắc hẳn không ít lần bạn cần tự tay kiểm tra dữ liệu trong database thay vì chỉ ngồi chờ Dev xác nhận. Biết SQL không biến bạn thành DBA, nhưng nó giúp bạn tự chủ hơn trong việc verify dữ liệu, viết bug report có bằng chứng thuyết phục hơn, và tiết kiệm rất nhiều thời gian tranh cãi “có bug hay không có bug” với team Dev.

Bài viết này tổng hợp những lệnh mà một Tester thực chiến sẽ dùng gần như mỗi ngày — không đi sâu học thuật, chỉ tập trung vào cái bạn cần để làm việc.


1. SELECT — Câu lệnh bạn sẽ gõ nhiều nhất

Việc đầu tiên và thường xuyên nhất của Tester là xem dữ liệu, không phải sửa dữ liệu. Vì vậy SELECT chính là lệnh “sống còn”.

SELECT * FROM users;

Lệnh trên lấy toàn bộ cột, toàn bộ dòng trong bảng users. Nhưng thực tế bạn hiếm khi cần lấy hết như vậy — nên chỉ định rõ cột cần xem:

SELECT id, username, email, status FROM users;

Tình huống thực tế: Test case yêu cầu “sau khi đăng ký, tài khoản phải có status = pending”. Thay vì hỏi Dev, bạn tự query:

SELECT id, username, status FROM users WHERE email = 'test@example.com';

2. WHERE — Lọc đúng dữ liệu bạn cần

WHERE là điều kiện lọc, giúp bạn không phải mò mẫm giữa hàng nghìn dòng dữ liệu.

SELECT * FROM orders WHERE status = 'failed';

Các toán tử hay dùng khi test:

Toán tửÝ nghĩaVí dụ
=BằngWHERE status = 'active'
!= hoặc <>KhácWHERE status != 'deleted'
>, <, >=, <=So sánh số/ngàyWHERE price > 100000
LIKETìm gần đúng (chuỗi)WHERE email LIKE '%@gmail.com'
INNằm trong danh sáchWHERE status IN ('pending', 'failed')
BETWEENTrong khoảngWHERE created_at BETWEEN '2026-01-01' AND '2026-01-31'
IS NULLGiá trị rỗngWHERE phone IS NULL

Tình huống thực tế: Kiểm tra xem có user nào bị trùng email không (bug nghiêm trọng nếu hệ thống cho phép đăng ký trùng):

SELECT email, COUNT(*) as total
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

3. ORDER BY và LIMIT — Sắp xếp và giới hạn kết quả

Khi bảng có hàng chục nghìn dòng, bạn cần sắp xếp để tìm dữ liệu mới nhất/cũ nhất, và giới hạn số dòng hiển thị để không bị “ngợp”:

SELECT * FROM orders
ORDER BY created_at DESC
LIMIT 10;

Lệnh trên lấy 10 đơn hàng mới nhất — cực kỳ hữu ích khi bạn vừa thực hiện 1 hành động trên UI (đặt hàng, đăng ký) và muốn xác nhận ngay dữ liệu vừa ghi vào DB có đúng không.


4. JOIN — Khi dữ liệu nằm ở nhiều bảng khác nhau

Đây là phần khiến nhiều Tester “sợ” nhất, nhưng thực ra chỉ cần hiểu ý tưởng: dữ liệu thật thường không nằm gọn trong 1 bảng. Ví dụ đơn hàng (orders) chỉ lưu user_id, còn tên khách hàng thật nằm ở bảng users.

SELECT o.id AS order_id, u.username, o.total_price, o.status
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 'completed';

Tình huống thực tế: Kiểm tra bug “khách hàng A mua khóa học B nhưng không thấy trong danh sách khóa học đã mua”:

SELECT u.username, c.course_name, e.enrolled_at
FROM enrollments e
JOIN users u ON e.user_id = u.id
JOIN courses c ON e.course_id = c.id
WHERE u.username = 'nguyenvana';

Nếu query này trả về rỗng dù bạn biết chắc khách đã thanh toán thành công → bạn đã có bằng chứng cụ thể để báo bug, thay vì chỉ nói suông “em thấy nó bị lỗi”.


5. COUNT, SUM, AVG — Kiểm tra số liệu tổng hợp

Rất nhiều bug liên quan đến số liệu tính toán sai (tổng tiền, số lượng, điểm trung bình…). Các hàm tổng hợp giúp bạn tự verify:

SELECT COUNT(*) FROM orders;

SELECT SUM(total_price) FROM orders WHERE status = 'completed';

SELECT AVG(score) FROM quiz_results WHERE quiz_id = 5;

Tình huống thực tế: Test case “Tổng doanh thu hiển thị trên Dashboard Admin phải khớp với tổng các đơn hàng completed”:

SELECT SUM(total_price) AS total_revenue
FROM orders
WHERE status = 'completed';

So sánh kết quả này với số hiển thị trên UI — lệch là có bug ngay.


6. INSERT, UPDATE, DELETE — Dùng khi cần chuẩn bị dữ liệu test

Không chỉ đọc dữ liệu, đôi khi Tester cần tự tạo dữ liệu test thay vì thao tác qua UI (nhanh hơn nhiều, đặc biệt khi cần data đặc biệt như “user đã hết hạn khóa học”, “đơn hàng bị timeout thanh toán”…).

INSERT INTO users (username, email, status)
VALUES ('test_user_01', 'testuser01@example.com', 'active');

UPDATE enrollments
SET expired_at = '2025-01-01'
WHERE user_id = 100 AND course_id = 5;

DELETE FROM users WHERE username = 'test_user_01';

⚠️ Lưu ý an toàn: Luôn kèm WHERE khi dùng UPDATE hoặc DELETE. Quên WHERE nghĩa là bạn sửa/xóa toàn bộ bảng — đây là một trong những sự cố “kinh điển” mà cả Tester lẫn Dev đều từng mắc phải ít nhất một lần trong đời. Nên test trên môi trường Staging/Local, tuyệt đối tránh chạy tay trên Production nếu không chắc chắn 100%.


7. Một vài mẹo thực chiến khi test bằng câu lệnh

Luôn SELECT trước khi UPDATE/DELETE Trước khi sửa hoặc xóa, hãy chạy thử bằng SELECT với đúng điều kiện WHERE đó trước, để chắc chắn nó chỉ trả về đúng những dòng bạn muốn:

SELECT * FROM orders WHERE status = 'pending' AND created_at < '2026-01-01';

Nếu đúng số dòng mong muốn, mới chạy UPDATE/DELETE với cùng điều kiện.

Dùng LIMIT khi thử nghiệm trên bảng lớn Tránh query cả triệu dòng khi bạn chỉ cần kiểm tra vài dòng mẫu.

Đặt alias (AS) cho câu query dài — giúp kết quả dễ đọc hơn khi chụp màn hình đính kèm vào bug report.


Tổng kết

SQL không phải là công cụ để Tester thay thế Dev viết code, mà là công cụ giúp bạn:

  • Tự verify dữ liệu thay vì đoán mò
  • Viết bug report có bằng chứng cụ thể (kèm query + kết quả)
  • Chuẩn bị dữ liệu test nhanh mà không cần thao tác lặp lại qua UI

Nắm vững SELECT, WHERE, JOIN, và các hàm tổng hợp là đủ để bạn xử lý 90% tình huống thường gặp trong công việc test hàng ngày. Phần còn lại (Stored Procedure, View, Transaction, CTE…) sẽ cần thiết hơn khi bạn tiến sâu vào Testing chuyên biệt hoặc muốn build data test phức tạp.


Nếu bạn muốn học bài bản từ cơ bản đến nâng cao dành riêng cho công việc Testing — với database thực hành, bài tập tình huống thật, và hướng dẫn chi tiết từng bước — hãy tham khảo khóa học SQL tại Đức Giang Tester Education.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *