핵심 포인트

SQL은 보이는 순서대로 읽지 않고, 결과를 만든 뒤 마지막에 정렬하고 자릅니다

`ORDER BY`와 `LIMIT`이 뒤에서 동작하는 이유는 간단합니다. DB는 먼저 `FROM`부터 행과 그룹을 만들고, `SELECT`에서 결과 컬럼과 별칭을 확정한 다음, 그 완성된 결과에 정렬과 개수 제한을 적용합니다.

쿼리에 적는 순서

문장은 위에서 아래로 읽히지만, 실행 순서는 다릅니다.

1
SELECT
2
FROM
3
WHERE
4
GROUP BY
5
HAVING
6
ORDER BY
7
LIMIT
겉으로는 SELECT가 먼저 보이지만, 실제로는 `FROM`부터 처리해야 어떤 행과 그룹을 다룰지 정할 수 있습니다.

DB가 실제로 처리하는 순서

중요한 상태 변화만 남기면, 왜 별칭과 정렬이 뒤에 오는지 바로 보입니다.

1-4
입력 행과 그룹 준비 `FROM`으로 시작 집합을 만들고 `WHERE`, `GROUP BY`, `HAVING`으로 필요한 행과 그룹만 남깁니다.
FROM WHERE GROUP BY HAVING
이 시점에는 아직 결과 컬럼이 없습니다. 따라서 `avg_price` 같은 별칭도 아직 존재하지 않습니다.
5
결과 컬럼과 별칭 확정 `SELECT`가 어떤 값을 보여줄지 정하고, `AVG(price) AS avg_price`처럼 결과 이름을 붙입니다.
SELECT
별칭은 여기서 생성됩니다. 표준 순서의 6번 `DISTINCT`가 있다면 이 다음에 중복 제거가 이어집니다.
7-8
완성된 결과를 소비 이제 결과 컬럼이 준비됐으므로 `ORDER BY`가 별칭으로 정렬하고, `LIMIT`이 정렬된 결과에서 일부만 남깁니다.
ORDER BY LIMIT
상위 5개 같은 표현은 정렬이 끝난 뒤에만 의미가 있습니다. 그래서 `LIMIT`은 항상 마지막에 가깝게 적용됩니다.
아직 불가
WHERE avg_price > 10000

이유: `WHERE`는 `SELECT`보다 먼저 실행됩니다. 평균값 별칭 `avg_price`는 아직 만들어지지 않았습니다.

이제 가능
ORDER BY avg_price DESC LIMIT 5

이유: `SELECT`가 끝나 `avg_price`가 생긴 뒤이므로 정렬할 수 있고, 그 정렬 결과에서 상위 5개만 남길 수 있습니다.