Sai lầm SQL phổ biến mà ai cũng mắc phải: Thứ tự viết so với thứ tự thực thi

06 tháng 4, 2026·5 phút đọc

Nhiều người lập trình viên thường mắc lỗi khi viết SQL theo thứ tự hiển thị cú pháp thay vì thứ tự thực thi thực tế. Bài viết này sẽ phân tích trình tự xử lý của SQL và lý do tại sao tư duy theo luồng thực thi giúp bạn viết câu truy vấn chính xác và hiệu quả hơn.

Sai lầm SQL phổ biến mà ai cũng mắc phải: Thứ tự viết so với thứ tự thực thi

Khi mới bắt đầu học SQL, cách tiếp cận của tôi rất đơn giản. Tôi sẽ bắt đầu bằng câu lệnh SELECT, liệt kê các cột mình cần, thêm mệnh đề FROM, sau đó điều chỉnh truy vấn dựa trên yêu cầu của bài toán.

Cách này hoạt động tốt với các truy vấn đơn giản. Tuy nhiên, khi vấn đề trở nên phức tạp hơn, tôi liên tục gặp phải một vấn đề giống hệt nhau: tôi phải viết lại toàn bộ truy vấn từ đầu vì những lỗi nhỏ. Điều này làm lãng phí thời gian và làm chậm tiến độ công việc của tôi.

Vấn đề cốt lõi

Vấn đề thực ra rất đơn giản — tôi đang viết SQL theo thứ tự nó hiển thị trên màn hình, không phải theo thứ tự nó thực thi bên trong hệ thống.

Chính vì điều này mà tôi:

  • Áp dụng bộ lọc sai giai đoạn xử lý.
  • Lạm dụng sai các hàm tổng hợp (aggregate functions).
  • Nhận được kết quả không chính xác.
  • Phải viết lại truy vấn nhiều lần.

Bước ngoặt thay đổi

Khi quan sát một lập trình viên giải quyết nhiều bài toán SQL khác nhau, tôi nhận thấy một quy luật:

  • Họ hiếm khi phải viết lại truy vấn.
  • Họ tuân theo một luồng cấu trúc rõ ràng.
  • Họ tư duy dựa trên trình tự thực thi.

Đó là lúc tôi nhận ra:

SQL không được thực thi theo thứ tự mà chúng ta viết nó.

Hiểu được điều này đã thay đổi mọi thứ.

Thứ tự thực thi thực tế của SQL

Thứ tự thực thi thực tế của một câu lệnh SQL như sau:

  1. FROM (Lấy dữ liệu nguồn)
  2. WHERE (Lọc dữ liệu thô)
  3. GROUP BY (Nhóm dữ liệu)
  4. HAVING (Lọc các nhóm)
  5. SELECT (Chọn cột và tính toán)
  6. DISTINCT (Loại bỏ trùng lặp)
  7. ORDER BY (Sắp xếp kết quả)
  8. LIMIT (Giới hạn số lượng dòng)

Mỗi bước sẽ biến đổi dữ liệu trước khi chuyển sang giai đoạn tiếp theo.

Phân tích từng mệnh đề

FROM

Chọn bảng cơ sở và thực hiện các phép nối (joins) để thu thập dữ liệu thô.

WHERE

Lọc các hàng (rows) trước khi thực hiện bất kỳ thao tác nhóm nào. Đây là nơi bạn loại bỏ dữ liệu không cần thiết sớm nhất.

GROUP BY

Nhóm các hàng dựa trên giá trị của các cột cụ thể để chuẩn bị cho tính toán tổng hợp.

HAVING

Lọc dữ liệu sau khi đã được nhóm. Lưu ý: HAVING dùng cho các nhóm, trong khi WHERE dùng cho các hàng riêng lẻ.

SELECT

Chọn các cột cụ thể để hiển thị và áp dụng các phép tính hoặc hàm tổng hợp.

DISTINCT

Loại bỏ các bản sao khỏi bộ kết quả.

ORDER BY

Sắp xếp kết quả cuối cùng theo thứ tự tăng dần hoặc giảm dần.

LIMIT

Giới hạn số lượng hàng được trả về cho người dùng.

Ví dụ minh họa

Bảng dữ liệu: orders (đơn hàng)

order_idcustomeramountcity
1A100Pune
2B200Mumbai
3A150Pune
4C300Delhi
5B250Mumbai

Yêu cầu

Tìm tổng số tiền đơn hàng (total_amount) theo từng thành phố trong đó tổng tiền lớn hơn 200, kết quả sắp xếp giảm dần.

Câu truy vấn SQL

SELECT city, SUM(amount) AS total_amount
FROM orders
WHERE amount > 100
GROUP BY city
HAVING SUM(amount) > 200
ORDER BY total_amount DESC;

Diễn giải quá trình thực thi

Hãy xem cách cơ sở dữ liệu xử lý câu lệnh trên từng bước:

Bước 1: FROM

Tất cả các hàng từ bảng orders được lấy ra.

Bước 2: WHERE

Lọc các hàng có amount > 100. Các hàng còn lại:

  • Mumbai: 200, 250
  • Pune: 150
  • Delhi: 300

Lưu ý: Ở bước này, hàng của Pune có giá trị 100 đã bị loại bỏ.

Bước 3: GROUP BY

Nhóm dữ liệu theo city. Các nhóm được hình thành:

  • Nhóm Mumbai
  • Nhóm Pune
  • Nhóm Delhi

Bước 4: HAVING

Lọc các nhóm dựa trên điều kiện SUM(amount) > 200.

  • Mumbai (Tổng: 200 + 250 = 450) -> Giữ lại.
  • Pune (Tổng: 150) -> Loại bỏ (vì nhỏ hơn 200).
  • Delhi (Tổng: 300) -> Giữ lại.

Bước 5: SELECT

Chọn các cột citytotal_amount (đã tính tổng).

Kết quả tại bước này:

citytotal_amount
Mumbai450
Delhi300

Bước 6: ORDER BY

Sắp xếp kết quả giảm dần theo total_amount.

  1. Mumbai
  2. Delhi

Bài học cốt lõi

Đừng tư duy theo thứ tự viết SQL.

Hãy tư duy theo thứ tự thực thi.

Việc này sẽ giúp bạn:

  • Giảm thiểu lỗi logic.
  • Tăng tốc độ viết truy vấn.
  • Giải quyết dễ dàng các bài toán truy vấn phức tạp.

Kết luận

Việc hiểu rõ thứ tự thực thi của SQL là một kỹ năng nền tảng quan trọng. Một khi bạn bắt đầu suy nghĩ theo các bước thực thi thay vì theo trật tự cú pháp, khả năng viết câu truy vấn hiệu quả và chính xác của bạn sẽ được cải thiện đáng kể.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗