Đang tải...

Lửng Lọc Lõi

Đeo kính để soi Bug cho rõ, nhíu mày để nhắc Dev sửa cho kỹ. Với tôi, 'chạy được' thôi là chưa đủ! 🧐💻


0

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)

Lửng Lọc Lõi
Lửng Lọc Lõi

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 orders có 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.

345563 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ì".

-- Lấy tất cả thông tin của user vừa đăng ký
SELECT *
FROM users
WHERE email = '[email protected]';

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:

-- Chỉ lấy tên và trạng thái tài khoản
SELECT username, status, created_at
FROM users
WHERE email = '[email protected]';

345564 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ả:

-- Xem 10 đơn hàng mới nhất
SELECT order_id, customer_email, total_amount, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 10;

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ề.

345565 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:

-- 5 user đăng ký hôm nay, mới nhất lên đầu
SELECT user_id, username, email, created_at
FROM users
WHERE DATE(created_at) = CURDATE()
ORDER BY created_at DESC
LIMIT 5;

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.

-- Đếm tổng số user đang active
SELECT COUNT(*) AS tong_user_active
FROM users
WHERE status = 'active';

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.

345566 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:

-- Đếm số user theo từng trạng thái
SELECT status, COUNT(*) AS so_luong
FROM users
GROUP BY status;

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.

-- Xem đơn hàng kèm thông tin người đặt
SELECT
  o.order_id,
  u.username,
  u.email,
  o.total_amount,
  o.status AS trang_thai_don
FROM orders AS o
INNER JOIN users AS u ON o.user_id = u.user_id
WHERE o.status = 'pending'
ORDER BY o.created_at DESC
LIMIT 20;

345567 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ảng orders, đặt bí danh ngắn là o
  • INNER JOIN users AS u: kết hợp với bảng users, bí danh u
  • ON o.user_id = u.user_id: khớp theo cột user_id củ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.

-- Tìm user chưa có số điện thoại
SELECT user_id, username, email, phone
FROM users
WHERE phone IS NULL;

Không viết WHERE phone = NULL - cách đó không hoạt động trong SQL. Phải dùng IS NULL.

-- Tìm đơn hàng chưa có ngày giao
SELECT order_id, customer_email, status, delivery_date
FROM orders
WHERE delivery_date IS NULL
AND status = 'shipped';

345568 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:

-- Đảm bảo tất cả user đã xác minh email
SELECT COUNT(*) AS chua_xac_minh
FROM users
WHERE verified_at IS NULL
AND created_at < DATE_SUB(NOW(), INTERVAL 7 DAY);

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

Trang web dùng cookie để hoạt động và đo hiệu quả quảng cáo. Xem chính sách bảo mật