회사를 직접적으로 언급할 수는 없지만 데이터베이스 쿼리 실행 순서를 질문받은 적 있습니다.
코딩 테스트 난이도 정도의 쿼리 작성에는 어느 정도 자신이 있었지만 실행 순서는 한 번도 생각해본 적이 없어 당황하다가 면접관님의 도움으로 겨우 풀었던 기억이 나네요.
그래서 오늘은 쿼리 실행 순서를 정리해보고자 합니다.
1. FROM 과 JOIN
데이터 셋의 총양을 결정하기 위해 FROM 절과 JOIN 문이 먼저 실행됩니다.
여기에는 서브쿼리도 포함되며, 서브 쿼리가 실행될 때 모든 행(row)과 열(column)을 포함하는 임시 테이블이 생성될 수 있습니다.
* 서브쿼리(Subquery): 쿼리 내에 있는 쿼리 (WHERE, FROM, SELECT 절 안에 들어가는 쿼리를 통칭하여 서브 쿼리라고 합니다.)
2. WHERE
데이터 셋의 총양을 구한 뒤, 제약조건인 WHERE 절이 각 행(row)에 적용되어 조건을 충족하지 않은 행을 제거합니다.
WHERE 절에서는 ALIAS를 적용할 경우 대부분의 데이터베이스에서 오류가 발생할 것입니다. (자세한 이유는 아래 문장을 참고 바랍니다.)
Aliases in the SELECT part of the query are not accessible in most databases since they may include expressions dependent on parts of the query that have not yet executed.
3. GROUP BY
WHERE 절이 적용된 뒤 남은 행들은 이후 GROUP BY 절에 의해 그룹으로 묶입니다.
4. HAVING
쿼리에 GROUP BY 절이 있다면 그룹으로 묶인 행에 제약조건인 HAVING 절이 각 행에 적용되어 조건을 충족하지 행을 제거합니다.
WHERE 절과 마찬가지로 HAVING 절 또한 ALIAS를 적용할 경우 대부분의 데이터베이스에서 오류가 발생할 것입니다.
5. SELECT
다섯 번째로 SELECT 절이 실행됩니다.
6. DISTINCT
DISTINCT 절에 의해 남아있는 행 중 중복되는 행이 제거됩니다.
7. ORDER BY
ORDER BY 절에 의해 행들은 특정 규칙에 맞게 오름차순 혹은 내림차순으로 정렬됩니다.
여기서는 ALIAS를 적용해도 정상작동합니다.
8. LIMIT / OFFSET
마지막으로 LIMIT과 OFFSET 절에 의해 지정된 범위를 벗어나는 행이 제거됩니다.
[출처] https://sqlbolt.com/lesson/select_queries_order_of_execution
'면접 준비' 카테고리의 다른 글
Call by Value vs Call by Reference (2) | 2020.06.12 |
---|---|
데이터베이스) DBMS 키 정리 (0) | 2020.06.10 |
삽입 정렬(Insertion Sort) 구현 (0) | 2019.10.06 |
선택 정렬(Selection Sort) 구현 (0) | 2019.10.06 |
머지 소트(Merge Sort) STL 없이 구현 (0) | 2019.07.30 |