SQL 쿼리문을 실행하는데 순서가 존재한다. 알고 있는데 자꾸 깜빡해서 정리를 한다.
SELECT 쿼리문은 FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY 총 6단계를 거친다.
아래는 각 단계의 동작을 정리한 것이다.
쿼리의 첫번째 실행 순서는 FROM절이다. FROM 절에서는 조회하는 테이블 전체를 가져온다. INDEX를 사용하지 않는다는 가정에서 WHERE절이나 SELECT절에서 일부 행이나 열을 제거하여 출력한다고 해도 가장 처음에 테이블의 모든 데이터를 가져온다.
WHERE 절에서는 FROM절에서 읽어온 테이블에서 조건에 맞는 결과만 갖도록 데이터를 필터링한다.
GROUP BY 절에서는 선택한 칼럼으로 그룹핑한다.
HAVING 절은 그룹핑 후에 각 그룹에 사용되는 조건 절이다. HAVING 절의 조건을 WHERE 절에도 사용할 수 있는 경우라면 WHERE절에 사용하는 것이 바람직하다. HAVING 절은 각 그룹에 조건을 걸기 때문에 퍼포먼스가 떨어지게 된다.
예를 들어 MONEY > 10000은 모든 레코드에 MONEY가 10000이 넘어야 한다는 조건이다. 이는 각 그룹에 따로 거는 것보다는 WHERE절로 한번에 거는 것이 좋다. (현재는 내부적으로 Optimize 해준다.)
반면, AVG(MONEY) > 10000처럼 집계함수의 경우에는 각 그룹별로 평균을 구하는 것과 전체 평균을 구하는 것은 다르게 동작하기 때문에 HAVING절을 사용해야 한다.
SELECT 절은 여러 조건들을 처리한 후 남은 데이터에서 어떤 열을 출력해줄지 선택한다.
어떤 열까지 출력할지 정했다면 행의 순서를 어떻게 보여줄지 정렬해주는 절이 ORDER BY이다.