Thứ tự thực hiện truy vấn
Trong SQL, nó không được thực hiện theo thứ tự từ trên xuống dưới mà nó thực thi truy vấn theo một thứ tự khác biệt. Dưới đây là thứ tự thực thi.
Thứ tự thực thi | Từ khóa SQL | Chức năng |
1 | FROM / JOIN | Xác định bảng nguồn và kết hợp bảng (join) |
2 | WHERE | Lọc các hàng dữ liệu |
3 | GROUP BY | Nhóm dữ liệu theo một hoặc nhiều cột |
4 | HAVING | Lọc dữ liệu sau khi nhóm |
5 | SELECT | Chọn các cột cần hiển thị |
6 | DISTINCT | Loại bỏ các dòng trùng lặp |
7 | ORDER BY | Sắp xếp dữ liệu |
8 | LIMIT / OFFSET | Giới hạn số dòng kết quả |
Lưu ý:
Dữ liệu luôn được lọc (WHERE) trước khi nhóm (GROUP BY).
Không thể dùng bí danh (AS) trong WHERE vì WHERE thực thi trước SELECT.
Ví dụ minh họa thực tế
Truy vấn SQL mẫu
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 3000
GROUP BY department
HAVING avg_salary > 4000
ORDER BY avg_salary DESC
LIMIT 5;
Phân tích thứ tự thực thi
- FROM / JOIN
Xác định bảng dữ liệu (employees).
Nếu có JOIN, thì các bảng được kết hợp ngay lúc này.
- WHERE
Lọc ra các dòng có salary > 3000.
Các dòng không thỏa mãn điều kiện bị loại bỏ trước khi nhóm (GROUP BY).
- GROUP BY
Nhóm dữ liệu theo cột department.
Tính toán trung bình AVG(salary) cho từng nhóm.
- HAVING
Lọc các nhóm có avg_salary > 4000.
Khác với WHERE (lọc trước khi nhóm), HAVING lọc sau khi nhóm.
- SELECT
Chọn ra các cột department và avg_salary.
Đây là lúc hệ thống xử lý các bí danh (AS avg_salary).
- ORDER BY
- Sắp xếp kết quả theo avg_salary giảm dần (DESC).
- LIMIT
- Lấy 5 dòng đầu tiên của kết quả.
Một số điểm chính
WHERE lọc trước GROUP BY, trong khi HAVING lọc sau GROUP BY.
Không thể dùng bí danh (AS) trong WHERE, nhưng có thể dùng trong HAVING và ORDER BY.
Biết rõ thứ tự thực thi giúp tối ưu hiệu suất truy vấn.