Vì WHERE được đánh giá trước SELECT, còn ORDER BY được đánh giá sau.
Khi WHERE chạy, alias chưa được tạo ra.
sql
-- error: column "total" does not exist
SELECT price * qty AS total
FROM order_items
WHERE total > 100;
-- ok: ORDER BY chạy sau SELECT
SELECT price * qty AS total
FROM order_items
ORDER BY total DESC;Ba cách sửa cho WHERE:
sql
-- 1. lặp lại biểu thức
SELECT price * qty AS total FROM order_items WHERE price * qty > 100;
-- 2. bọc bằng subquery / CTE
SELECT * FROM (
SELECT price * qty AS total FROM order_items
) t WHERE t.total > 100;
-- 3. LATERAL (PostgreSQL) để tính một lần
SELECT c.total FROM order_items i
CROSS JOIN LATERAL (SELECT i.price * i.qty AS total) c
WHERE c.total > 100;Lặp lại biểu thức không làm chậm truy vấn: optimizer chỉ tính một lần. GROUP BY nằm giữa nên tuỳ hệ: MySQL và PostgreSQL cho phép alias trong GROUP BY, nhưng đó là phần mở rộng ngoài chuẩn.