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

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:
- FROM (Lấy dữ liệu nguồn)
- WHERE (Lọc dữ liệu thô)
- GROUP BY (Nhóm dữ liệu)
- HAVING (Lọc các nhóm)
- SELECT (Chọn cột và tính toán)
- DISTINCT (Loại bỏ trùng lặp)
- ORDER BY (Sắp xếp kết quả)
- 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_id | customer | amount | city |
|---|---|---|---|
| 1 | A | 100 | Pune |
| 2 | B | 200 | Mumbai |
| 3 | A | 150 | Pune |
| 4 | C | 300 | Delhi |
| 5 | B | 250 | Mumbai |
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 city và total_amount (đã tính tổng).
Kết quả tại bước này:
| city | total_amount |
|---|---|
| Mumbai | 450 |
| Delhi | 300 |
Bước 6: ORDER BY
Sắp xếp kết quả giảm dần theo total_amount.
- Mumbai
- 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 liên quan

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026

Công nghệ
Spotify thắng kiện 322 triệu USD từ nhóm pirate Anna's Archive nhưng đối mặt với bài toán thu hồi
16 tháng 4, 2026
