Thứ tự thực thi SQL: FROM→JOIN→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT — alias trong SELECT không dùng được trong WHERE vì SELECT chưa chạy; SELECT * trong production là anti-pattern.
- Thứ tự thực thi SQL (quan trọng để hiểu tại sao không dùng alias trong WHERE): FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFFSET.
- Câu query thực tế:
SELECT u.name, COUNT(o.id) AS order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE u.created_at > '2024-01-01' GROUP BY u.id, u.name HAVING COUNT(o.id) > 5 ORDER BY order_count DESC LIMIT 20. - Aliasing:
SELECT price * 0.9 AS discounted_price— alias trong SELECT không dùng được trong WHERE (chưa được tính), nhưng dùng được trong ORDER BY (PostgreSQL cho phép). - DISTINCT:
SELECT DISTINCT city FROM usersloại trùng lặp — có sorting overhead, dùng GROUP BY khi cần performance tốt hơn. - SELECT *: không dùng production — lấy data thừa, break khi thêm column, không dùng được covering index.
Pitfall: LIMIT không có ORDER BY → kết quả non-deterministic, mỗi query trả về rows khác nhau.