0Pricing
Coding Interview Prep · 강의

첫 번째 CTE 작성하기

기본 WITH 구문과 하위 쿼리보다 CTE가 가독성을 높이는 경우를 알아봅니다.

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

CTE란 실제로 무엇인가

공통 테이블 식(CTE)은 WITH 키워드로 정의하는 이름이 지정된 임시 결과 집합이며, 단일 쿼리가 실행되는 동안에만 존재합니다. 면접관은 CTE를 통해 논리를 명확하게 구성할 수 있는지 확인할 수 있기 때문에 CTE를 좋아합니다.

CTE를 서브쿼리에 이름을 붙여 뒤따르는 주 문에서 테이블처럼 참조할 수 있게 하는 기능이라고 생각하십시오. 영구 객체를 만들지 않으며 쿼리가 끝나는 즉시 사라집니다.

기본 WITH 구문

모든 CTE는 WITH, 이름, AS 키워드, 괄호로 묶인 쿼리로 시작합니다. 닫는 괄호 뒤에는 CTE를 이름으로 사용하는 일반 문을 작성합니다.

  • WITH cte_name AS ( ... )은 블록을 정의합니다.
  • 괄호 바로 다음에 오는 쿼리가 주 쿼리입니다.
  • CTE 이름은 SELECT할 수 있는 테이블처럼 동작합니다.
WITH recent_orders AS (
    SELECT *
    FROM orders
    WHERE order_date >= '2024-01-01'
)
SELECT *
FROM recent_orders;

왜 그냥 서브쿼리를 사용하지 않을까요

동일한 논리를 FROM 절의 서브쿼리로 직접 작성할 수도 있습니다. 그렇다면 면접관은 왜 CTE에 관해 질문할까요?

  • 가독성: 이름이 지정된 단계는 요리법처럼 위에서 아래로 읽힙니다.
  • 재사용: 서브쿼리를 반복하는 대신 동일한 CTE를 여러 번 참조할 수 있습니다.
  • 확인 용이성: CTE만 SELECT하여 내용을 검사할 수 있습니다.

면접에서 보통 적절한 답은 다음과 같습니다. 쿼리를 더 읽기 쉽고 유지 관리하기 쉽게 만들 때 CTE를 사용합니다.

풀이 예제: 필터링 후 집계하기

질문이 올해 주문된 주문의 총수익을 구하라고 가정해 보겠습니다. CTE를 사용하면 필터링 단계를 분리한 다음 이름이 지정된 결과를 집계할 수 있습니다.

주 쿼리에서는 recent_orders를 실제 테이블처럼 다루므로 집계가 깔끔하고 명확해집니다.

WITH recent_orders AS (
    SELECT amount
    FROM orders
    WHERE order_date >= '2024-01-01'
)
SELECT SUM(amount) AS total_revenue
FROM recent_orders;

결과 열 이름 지정하기

CTE 이름 바로 뒤에 열 목록을 작성하여 CTE가 제공하는 열의 이름을 바꿀 수 있습니다. 내부 쿼리가 표현식을 생성하거나 이후 단계에서 더 명확한 이름이 필요할 때 유용합니다.

열 목록을 지정한다면 내부 쿼리가 반환하는 열의 개수와 일치해야 합니다. 그렇지 않으면 데이터베이스가 오류를 발생시킵니다.

WITH revenue (region, total) AS (
    SELECT region, SUM(amount)
    FROM orders
    GROUP BY region
)
SELECT region, total
FROM revenue
ORDER BY total DESC;

CTE는 이름이 지정된 쿼리일 뿐입니다

면접관에게 깊은 인상을 줄 수 있는 사고방식이 하나 있습니다. CTE는 논리적으로 정의를 인라인으로 치환하는 것과 같습니다. 데이터베이스는 CTE를 인라인 처리하거나 구체화할 수 있지만, 의미상으로는 서브쿼리를 그대로 붙여 넣은 경우와 결과가 같습니다.

따라서 일반 SELECT에서 사용할 수 있는 것은 무엇이든 CTE 안에서도 사용할 수 있습니다. 조인, GROUP BY, WHERE, 윈도 함수 등이 그 예입니다.

심화 예제: 조인이 포함된 CTE

조인의 한쪽을 미리 구성해야 할 때 CTE가 특히 유용합니다. 여기서는 먼저 고객별 주문 개수를 만든 다음 고객 테이블에 다시 조인하여 각 고객 행에 총 주문 개수가 포함되도록 합니다.

주 쿼리가 영어 문장처럼 거의 그대로 읽히는 점에 주목하십시오. 고객에서 시작하여 해당 고객의 주문 개수를 조인합니다.

WITH order_counts AS (
    SELECT customer_id, COUNT(*) AS num_orders
    FROM orders
    GROUP BY customer_id
)
SELECT c.name, oc.num_orders
FROM customers c
JOIN order_counts oc
    ON oc.customer_id = c.id;

쿼리에서 CTE가 적용되는 범위

WITH 블록은 이를 사용하는 문 앞에 와야 합니다. CTE는 정의 바로 뒤에 오는 단일 문에서만 표시됩니다.

  • 나중에 실행하는 별도의 쿼리에서는 CTE를 참조할 수 없습니다.
  • SELECT를 위해 정의한 CTE를 이후에 실행하는 다른 SELECT에서 재사용할 수 없습니다.
  • 범위는 문을 끝내는 세미콜론에서 종료됩니다.

CTE와 INSERT, UPDATE, DELETE

자주 이어지는 질문은 다음과 같습니다. CTE는 SELECT에만 제한되지 않습니다. 대부분의 최신 데이터베이스에서는 데이터 변경 문에도 WITH 절을 연결할 수 있습니다.

이를 통해 한 번 행 집합을 계산한 다음 해당 행에 작업을 수행할 수 있으므로, WHERE 절 안에 중첩 서브쿼리를 작성하는 것보다 훨씬 명확하게 읽힙니다.

WITH stale AS (
    SELECT id
    FROM sessions
    WHERE last_seen < NOW() - INTERVAL '30 days'
)
DELETE FROM sessions
WHERE id IN (SELECT id FROM stale);

초보자가 흔히 하는 실수

면접관은 다음과 같은 실수를 확인합니다.

  • CTE 뒤에 주 쿼리를 빠뜨리는 경우. WITH 블록만으로는 완전한 문이 아닙니다.
  • CTE와 주 쿼리 사이에 세미콜론을 넣는 경우
  • CTE가 여러 문에 걸쳐 유지될 것이라고 생각하는 경우
  • 선택적 열 이름 목록과 내부 쿼리의 열 개수가 일치하지 않는 경우

면접에서 CTE에 대해 말하는 방법

복잡한 서브쿼리를 다시 구성하라는 요청을 받으면 다음과 같이 사고 과정을 설명하십시오. 이 필터링 서브쿼리를 최근 주문이라는 이름의 CTE로 끌어올려 집계가 깔끔하게 읽히도록 하겠습니다.

무조건 CTE를 사용하는 것이 아니라 명확성과 재사용성을 위해 선택한다는 점을 보여 주면 중급 개발자다운 숙련도를 드러낼 수 있습니다. CTE가 본질적으로 쿼리를 더 빠르게 만드는 것은 아니며, 주된 가치는 가독성에 있다고 언급하십시오.

빠른 확인

기본 CTE 구문과 범위에 대한 이해도를 확인해 보세요.

복습: 첫 번째 CTE

CTE는 WITH name AS ( ... )를 사용해 임시 결과 집합에 이름을 지정한 다음, 이어지는 문에서 테이블처럼 참조한다는 것을 배웠습니다.

  • CTE는 인라인 하위 쿼리보다 가독성, 재사용성, 디버깅 용이성을 높여 줍니다.
  • 범위는 하나의 문으로 제한되며, 그 뒤에는 사라집니다.
  • SELECT와 INSERT/UPDATE/DELETE에 사용할 수 있습니다.
  • 본질적으로 성능을 향상시키지는 않습니다.

다음: 여러 CTE를 하나의 파이프라인으로 연결하기

자주 묻는 질문

“첫 번째 CTE 작성하기” 강의는 무료인가요?

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

“첫 번째 CTE 작성하기”에서 뭘 배우나요?

기본 WITH 구문과 하위 쿼리보다 CTE가 가독성을 높이는 경우를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“첫 번째 CTE 작성하기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 첫 번째 CTE 작성하기
  2. 여러 CTE 연결하기
  3. CTE, 하위 쿼리와 임시 표 비교하기
  4. 중첩 쿼리를 CTE로 리팩터링하기
← Coding Interview Prep(으)로 돌아가기