본문 바로가기
카테고리 없음

[SQL] 논리적 쿼리 실행 순서

by hbIncoding 2024. 10. 2.

1. 논리적 쿼리 실행 순서

  1. FROM 절
  2. WHERE 절
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
  7. 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

  1. FROM: 두 테이블의 카테시안 조인: T1 * T2 -> VT1
  2. ON: VT1에 대해 ON 절의 조건으로 필터링: VT1 >> VT2
  3. OUTER JOIN: 조인이 Inner Join이 아니었을 경우 VT2에 추가적으로 레코드를 삽입 VT2 + r -> VT3
  4. WHERE: VT3에 where 절의 필터가 적용됨 VT3 >> VT4
  5. GROUP BY: VT4의 레코드들을 group by에 의해 그룹핑 됨 VT4 -> VT5
  6. CUBE | ROLLUP: VT5에 CUBE 또는 ROLLUP에 의해 추가적인 정보 생성 VT5 + s -> VT6
  7. HAVING: VT6에 HAVING 조건에 의해 필터링 적용 VT6 >> VT7
  8. SELECT: VT7에 select에서 지정한 컬럼이 선택됨 VT7 => VT8
  9. DISTINCT: VT8의 레코드에서 중복을 제거함 VT8 > VT9
  10. ORDER BY: VT9르 order by에 지정된 컬럼으로 정렬 수행 VT9 -> VT10
  11. TOP: VC10에서 TOP에 의해 지정된 건수만큼의 레코드 선택 VT10 >> VT11

 

 

4. 참조

1)논리적 실행 및 예시 : https://jaehoney.tistory.com/191