1. 논리적 쿼리 실행 순서
- FROM 절
- WHERE 절
- GROUP BY
- HAVING
- SELECT
- ORDER BY
- LIMIT
2. 쿼리 실행의 순서가 중요한 이유
1) 문법
- OrderBy 절에서 Alias 사용
- OrderBy는 select 절 보다 뒤에 실행되기 때문에 SELECT 절의 결과를 사용할 수 있다.
SELECT CONCAT(first_name, last_name) AS full_name
FROM user
ORDER BY full_name;
- Where 절에서 Alias 사용
- Where 절에서는 Select 절 보다 먼저 실행되기 때문에 select 절에서 사용한 AS를 사용할 수 없다.
- 따라서 아래 쿼리는 에러가 발생한다.
SELECT CONCAT(first_name, last_name) AS full_name
FROM user
WHERE full_name = 'VioletBeach';
3. 논리적 쿼리 실행 예시
(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH { CUBE | ROLLUP }
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
입력: 테이블 T1, T2
출력: 쿼리가 적용된 가상테이블 VT11
- FROM: 두 테이블의 카테시안 조인: T1 * T2 -> VT1
- ON: VT1에 대해 ON 절의 조건으로 필터링: VT1 >> VT2
- OUTER JOIN: 조인이 Inner Join이 아니었을 경우 VT2에 추가적으로 레코드를 삽입 VT2 + r -> VT3
- WHERE: VT3에 where 절의 필터가 적용됨 VT3 >> VT4
- GROUP BY: VT4의 레코드들을 group by에 의해 그룹핑 됨 VT4 -> VT5
- CUBE | ROLLUP: VT5에 CUBE 또는 ROLLUP에 의해 추가적인 정보 생성 VT5 + s -> VT6
- HAVING: VT6에 HAVING 조건에 의해 필터링 적용 VT6 >> VT7
- SELECT: VT7에 select에서 지정한 컬럼이 선택됨 VT7 => VT8
- DISTINCT: VT8의 레코드에서 중복을 제거함 VT8 > VT9
- ORDER BY: VT9르 order by에 지정된 컬럼으로 정렬 수행 VT9 -> VT10
- TOP: VC10에서 TOP에 의해 지정된 건수만큼의 레코드 선택 VT10 >> VT11
4. 참조
1)논리적 실행 및 예시 : https://jaehoney.tistory.com/191