개요

SQL은 어떤 순서로 실행될까?

순서

SQL이 실제로 어떤 순서로 실행되는지 모르겠으니 직접 생각해보자.

우선 나라면 스캔 대상을 효율적으로 줄이는 전략을 사용할 것이다.

예를 들어 하나의 데이터베이스에 1000개의 테이블이 있다고 해보자. 여기서 유효한 데이터를 추릴 수 있는 방법은 대상 테이블을 지정하는 것이다.

실제 SQL도 FROM절을 가장 먼저 해석한다. JOIN도 마찬가지다.

그런 다음엔 결과 테이블에 들어갈 데이터를 제한할 것이다.
그게 WHERE절이다. FROM절 다음에는 너무나 당연하게 WHERE절이 해석된다.

그 다음으론 GROUP BY 와 HAVING절이 해석된다.
마찬가지로 WHERE절로 잘라서 가져온 데이터를 그루핑하고 HAVING 조건으로 잘라내기 때문이다.

그런 다음 SELECT로 어떤 데이터를 가져올 지 선택한다.

이런 식이라면 그 다음 해석될 구문은 LIMIT라고 생각할 수 있다.

그러나 아니다.
ORDER BY를 어떻게 설정하느냐에 따라 결과가 변한다.

예를 들어 다음과 같은 쿼리가 있다고 해보자.

SELECT * FROM USERS ORDER BY USER_ID ASC LIMIT 3

결과는 다음과 같다.

1번 유저
2번 유저
3번 유저

정렬 방향을 반대로 하면 다음과 같은 결과가 나온다.

1000번 유저
999번 유저
998번 유저

따라서 LIMIT절 보다 ORDER BY절이 먼저 해석되어야한다.

이렇게 나라면 어떻게 할지 생각해보고 그 다음 정답을 보면 빠르게 습득할 수 있다.

아무튼 이런 실행 순서를 아는 것이 중요한 이유는 쿼리를 이해하고 응용하는 능력에 있다.

예를 들어 해석 순서를 아는 사람이라면 다음과 같은 쿼리를 당연하게 받아들일 수 있다.

SELECT USER_NM AS '유저 이름'
FROM USERS
ORDER BY '유저 이름'

FROM절 다음 WHERE절, GRUOP BY, HAVING절이 없기 때문에 그 다음에는 SELECT가 실행되고 그 다음으로 ORDER BY가 해석되기 때문에 SELECT에서 별칭으로 정한 ‘유저 이름’을 ORDER BY가 사용할 수 있다.

위의 과정들을 그림으로 나타내보면 다음과 같다.
Image