Câu SELECT được viết theo thứ tự SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY, nhưng được hiểu theo logic gần như ngược lại:
1. FROM + JOIN — dựng tập dòng nguồn.
2. WHERE — lọc từng dòng thô.
3. GROUP BY — gom dòng thành nhóm.
4. HAVING — lọc trên nhóm (được dùng hàm tổng hợp).
5. SELECT — tính biểu thức, đặt alias.
6. DISTINCT.
7. ORDER BY — sắp xếp kết quả.
8. LIMIT / OFFSET — cắt lấy phần cần.
Đây là mô hình ngữ nghĩa, không phải kế hoạch thực thi vật lý: optimizer được phép đảo thứ tự, đẩy filter xuống dưới join, miễn kết quả không đổi.
Hai hệ quả hay bị hỏi tiếp:
- Alias đặt ở SELECT chưa tồn tại khi WHERE chạy, nhưng đã có khi ORDER BY chạy.
- WHERE không dùng được SUM()/COUNT() vì lúc đó nhóm chưa hình thành — phải dùng HAVING.