0Pricing
Coding Interview Prep · 강의

논리적 쿼리 실행 순서

FROM이 SELECT보다 먼저 실행되는 이유와 실제 실행 순서를 알면 까다로운 질문 여러 개에 답할 수 있는 방법을 알아봅니다.

논리적 쿼리 실행 순서은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

수많은 다른 질문으로 이어지는 질문

면접관이 “쿼리는 실제로 어떤 순서로 실행되나요?”라고 묻는 이유는 이 질문이 많은 내용을 설명해 주기 때문입니다. SELECT 별칭이 WHERE에서 작동하지 않는 이유, WHERE가 집계 결과를 필터링할 수 없는 이유 등을 설명할 수 있습니다.

작성 순서와 논리적 순서

쿼리는 SELECT로 작성하지만, 실행 엔진은 FROM부터 실행합니다. SELECT가 거의 마지막에 평가된다는 이 불일치 때문에 대부분의 혼란이 생깁니다.

전체 논리적 순서

전체 논리적 순서는 다음과 같습니다. FROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, 마지막으로 LIMIT입니다. 아래의 모든 함정은 이 목록에서 자연스럽게 설명됩니다.

FROM이 먼저 실행되는 이유

FROM이 먼저 실행되는 이유는 실행 엔진이 다른 작업을 하기 전에 처리할 행이 필요하기 때문입니다. 먼저 원본 행을 만들고, 그다음에야 WHERE가 유지할 행을 결정할 수 있습니다.

SELECT e.name, d.name AS dept
FROM employees e
JOIN departments d ON d.id = e.department_id
WHERE e.salary > 50000;

함정: WHERE에서는 별칭을 사용할 수 없습니다

가장 자주 묻는 결과는 다음과 같습니다. WHERE는 SELECT보다 먼저 실행되므로 SELECT 별칭을 WHERE에서 사용할 수 없습니다. 아래 코드는 오류와 해결 방법을 보여 줍니다. 해결 방법은 표현식을 다시 작성하는 것입니다.

-- FAILS: alias 'annual' unknown in WHERE
SELECT salary * 12 AS annual
FROM employees
WHERE annual > 600000;

-- FIX: repeat the expression
SELECT salary * 12 AS annual
FROM employees
WHERE salary * 12 > 600000;

함정: WHERE에서는 집계 결과를 볼 수 없습니다

WHERE는 그룹화보다 먼저 실행되므로 COUNT() 같은 집계 결과를 볼 수 없습니다. 이때 사용하는 것이 HAVING입니다. WHERE는 행을 필터링하고 HAVING은 집계가 끝난 뒤 그룹을 필터링합니다.

-- WHERE cannot use COUNT(*)
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

ORDER BY에서 별칭을 사용할 수 있는 이유

반대의 경우도 살펴보겠습니다. ORDER BY는 SELECT 이후에 실행되므로 SELECT 별칭을 사용할 수 있습니다. 같은 별칭이라도 실행 시점이 다르기 때문에 여기서는 작동하고 WHERE에서는 작동하지 않습니다.

SELECT name, salary * 12 AS annual
FROM employees
ORDER BY annual DESC;

DISTINCT의 위치

DISTINCT는 SELECT 이후, ORDER BY 이전에 실행됩니다. 출력 열을 기준으로 중복을 제거하므로, SELECT 목록에 남아 있는 항목으로만 정렬할 수 있습니다.

-- ERROR in many engines:
-- ORDER BY column not in the DISTINCT select list
SELECT DISTINCT department
FROM employees
ORDER BY hire_date;

전체 쿼리의 실행 과정 추적

실제 쿼리가 각 단계를 거치는 과정을 추적해 보겠습니다. FROM은 행을 읽고, WHERE는 필터링하고, GROUP BY는 묶고, HAVING은 그룹을 남기고, SELECT는 계산하고, ORDER BY는 정렬하고, LIMIT는 일부를 잘라 냅니다.

SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(amount) > 1000
ORDER BY total DESC
LIMIT 10;

논리적 실행과 물리적 실행

알아 두면 인상적인 세부 사항이 있습니다. 지금까지 살펴본 순서는 올바른 결과를 정의하는 논리적 순서입니다. 최적화기가 세우는 물리적 실행 계획은 달라도 되며, 같은 행을 결과로 내기만 하면 됩니다.

순서를 기억하는 방법

기억법을 하나 소개하겠습니다. 행이 처리 파이프라인을 따라 흐르고, 각 단계가 더 작은 집합을 다음 단계로 넘긴다고 생각해 보세요. 문제가 발생하면 앞 단계가 현재 단계에 필요한 결과를 만들었는지 확인하세요.

빠른 확인

실행 순서를 적용해 오류를 찾아보세요.

복습

복습: 논리적 순서는 FROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT입니다. WHERE는 SELECT보다 먼저 실행되므로 별칭을 사용할 수 없고, ORDER BY는 그 이후에 실행되므로 별칭이 작동합니다.

자주 묻는 질문

“논리적 쿼리 실행 순서” 강의는 무료인가요?

네 — “논리적 쿼리 실행 순서” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“논리적 쿼리 실행 순서”에서 뭘 배우나요?

FROM이 SELECT보다 먼저 실행되는 이유와 실제 실행 순서를 알면 까다로운 질문 여러 개에 답할 수 있는 방법을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“논리적 쿼리 실행 순서” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. SQL이란 무엇이며 면접관은 왜 질문할까요
  2. 논리적 쿼리 실행 순서
  3. 기본 키, 외래 키와 제약 조건
  4. 압박감 속에서 스키마 읽기
← Coding Interview Prep(으)로 돌아가기