FresherKỹ thuậtSQL
Một câu SELECT được thực thi theo thứ tự logic nào?
Thử trả lời trước
Đáp án mẫu
SQL được viết theo một thứ tự nhưng được tính theo thứ tự khác. Thứ tự logic là:
FROMvàJOIN: dựng tập dòng làm việc.WHERE: lọc dòng.GROUP BY: tạo nhóm.- Aggregate, rồi
HAVING: lọc nhóm. - Window function.
SELECT: tính biểu thức và alias.DISTINCT.ORDER BY.LIMIT/OFFSET.
SELECT price * qty AS line_total
FROM order_items
WHERE line_total > 100; -- error: alias does not exist yet
Alias được tạo ở bước 6, nhưng WHERE chạy ở bước 2. Hãy lặp lại biểu thức trong WHERE, hoặc bọc query trong subquery hay CTE. ORDER BY chạy muộn hơn nên dùng được alias. Một số engine như MySQL thoáng hơn ở GROUP BY và HAVING.
Cùng lý do đó giải thích vì sao không lọc theo window function trong WHERE được: hãy dùng subquery.
Đây là mô hình logic. Optimizer có thể đổi thứ tự vật lý, ví dụ lọc sớm hơn, miễn là kết quả không đổi.
Hiểu thứ tự này giải thích được hầu hết lỗi "vì sao alias không dùng được".
Ý chính
- FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT
- Alias được định nghĩa ở SELECT, sau WHERE
- ORDER BY dùng được alias, WHERE thì không
- Optimizer có thể đổi thứ tự vật lý
Câu hỏi nối tiếp thường gặp
- Vì sao không lọc trực tiếp theo ROW_NUMBER() trong WHERE?
Lỗi thường gặp
- Dùng alias của SELECT trong WHERE
- Nghĩ rằng thứ tự viết chính là thứ tự thực thi