SQL Interview Prep · 강의

전체 모의 면접 문제 세트

면접 환경에서 조인, 윈도, CTE를 결합한 문제를 제한 시간 안에 처음부터 끝까지 풀어봅니다.

레슨 4/413개 단계

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

SQL 면접 단계 진행 방식

이 종합 과정에서는 면접 상황에서 조인, 윈도 함수, CTE를 결합하는 전체 모의 문제를 풀어 봅니다. 먼저 면접 자리에서 어떻게 대응할지 알아보겠습니다.

  • 문제를 다시 말하고 스키마를 확인하십시오.
  • 코딩하기 전에 경계 사례(NULL, 동률, 중복)를 명확히 하십시오.
  • 접근 방식을 설명한 다음 쿼리를 작성하십시오.
  • 머릿속에서 작은 표본을 대상으로 테스트하십시오.

면접관은 최종 쿼리만큼이나 여러분의 진행 방식도 평가합니다.

공통 스키마

아래의 모든 문제는 이 작은 전자 상거래 스키마를 사용합니다. 각 쿼리를 이해할 수 있도록 한 번 읽어 보십시오.

  • customers(id, name, country)
  • orders(id, customer_id, order_date, status, amount)
  • order_items(order_id, product_id, quantity)
  • products(id, name, category, price)

이 내용을 기억해 두십시오. 이후 수업에서는 이 테이블을 참조합니다.

-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currency

문제 1: 지출액 기준 상위 고객

"총 결제 금액이 높은 상위 3명의 고객과 이름 및 총액을 반환하십시오."

방법: 결제 완료 주문만 필터링하고, 고객별로 집계한 다음 정렬하고 LIMIT를 적용하십시오. 면접관이 심어 둔 경계 사례인 취소 및 대기 중 주문을 제외한다고 명시하십시오.

SELECT c.name,
       SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;

문제 2: 한 번도 주문하지 않은 고객

"주문을 한 번도 생성하지 않은 고객을 나열하십시오." 이는 안티 조인 패턴입니다. 깔끔한 해결 방법은 두 가지입니다. LEFT JOIN과 IS NULL을 사용하거나 NOT EXISTS를 사용하면 됩니다.

NOT IN과 달리 NULL에 안전하므로 NOT EXISTS를 선호하십시오. 이 차이를 언급하십시오. 면접관이 정확히 확인하려는 부분입니다.

-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.id
);

문제 3: 두 번째로 높은 주문 금액

"서로 다른 주문 금액 중 두 번째로 높은 금액을 찾으십시오." 가장 깔끔하고 동률에도 안전한 해결 방법은 DENSE_RANK를 사용하는 것입니다. 중복된 금액은 같은 순위를 공유합니다.

언급할 경계 사례는 다음과 같습니다. 서로 다른 두 번째 값이 없다면 행을 반환하지 않습니다. 이는 허용될 수도 있고, 요구 사항에 따라 COALESCE 래퍼가 필요할 수도 있습니다.

SELECT amount
FROM (
  SELECT amount,
         DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
  FROM orders
) ranked
WHERE rnk = 2;

문제 4: 고객별 최신 주문

"각 고객의 가장 최근 주문을 반환하십시오." 이는 키별 최신 행만 남기는 패턴이며, 고객을 기준으로 분할하고 날짜 내림차순으로 정렬한 ROW_NUMBER로 해결합니다.

두 주문의 날짜가 같을 때도 결과가 결정적이 되도록 동률 해결 기준(주문 식별자)을 추가하십시오. 이는 뛰어난 지원자들이 포함하는 세부 사항입니다.

SELECT customer_id, id AS order_id, order_date, amount
FROM (
  SELECT o.*,
         ROW_NUMBER() OVER (
           PARTITION BY customer_id
           ORDER BY order_date DESC, id DESC
         ) AS rn
  FROM orders o
) t
WHERE rn = 1;

문제 5: 전월 대비 성장률

"월별 결제 완료 매출과 이전 달 대비 백분율 변화를 계산하십시오." 이는 CTE에서 집계한 뒤 LAG를 결합하는 문제입니다.

첫 단계에서는 월별로 집계하고, 두 번째 단계에서는 LAG를 사용하여 각 달을 이전 달과 비교합니다. 이전 달이 없는 첫 달에서 오류가 발생하지 않도록 나눗셈을 안전하게 처리하십시오.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  WHERE status = 'paid'
  GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
       revenue,
       LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
       ROUND(
         100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
         / NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
       ) AS pct_change
FROM monthly
ORDER BY mth;

문제 6: 범주별 상위 상품

"각 범주에서 총 수량 기준으로 가장 많이 판매된 상품을 반환하십시오." 이는 그룹별 상위 N개 패턴입니다. 집계하고, 분할 내에서 순위를 매긴 다음, 순위가 1인 행만 필터링합니다.

동률을 고려해야 한다면 ROW_NUMBER 대신 RANK로 바꾸어 공동 선두인 모든 상품을 표시하십시오. 이 선택을 설명하면 두 함수의 차이를 이해하고 있다는 것을 보여 줄 수 있습니다.

WITH sales AS (
  SELECT p.category,
         p.name AS product,
         SUM(oi.quantity) AS qty
  FROM order_items oi
  JOIN products p ON p.id = oi.product_id
  GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
  SELECT s.*,
         ROW_NUMBER() OVER (
           PARTITION BY category ORDER BY qty DESC
         ) AS rn
  FROM sales s
) r
WHERE rn = 1;

문제 7: 매출 누적 합계

"일별 결제 완료 매출의 누적 합계를 표시하십시오." 정렬된 프레임을 사용하는 윈도 SUM으로 자기 조인 없이 누적 합계를 계산할 수 있습니다.

실제 행 단위 누적을 위해 ROWS 프레임을 사용한다고 언급하십시오. 기본 RANGE 프레임은 같은 날짜가 있을 때 예상과 다르게 동작할 수 있습니다.

SELECT order_date,
       SUM(daily) OVER (
         ORDER BY order_date
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS running_total
FROM (
  SELECT order_date, SUM(amount) AS daily
  FROM orders
  WHERE status = 'paid'
  GROUP BY order_date
) d
ORDER BY order_date;

문제 8: 연속된 활성 날짜

"결제 완료 주문이 있는 날이 3일 이상 연속되는 사용자를 찾으십시오." 이는 행 번호 차이 기법을 사용하는 간격과 구간 문제의 변형입니다.

사용자별 행 번호에서 날짜를 빼면 연속 구간 내에서 일정한 값이 나오므로, 그 값으로 그룹화하고 개수를 셉니다. 이는 선임 수준의 역량을 보여 주는 신호입니다.

WITH days AS (
  SELECT DISTINCT customer_id, order_date
  FROM orders WHERE status = 'paid'
),
grp AS (
  SELECT customer_id, order_date,
         order_date - (ROW_NUMBER() OVER (
           PARTITION BY customer_id ORDER BY order_date
         ) * INTERVAL '1 day') AS island
  FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;

성능과 흔한 함정

올바른 쿼리를 작성한 뒤 면접관은 "어떻게 더 빠르게 만들겠습니까?"라고 질문하며 흔한 함정에 빠지지 않는지 확인합니다. 다음 점검 목록을 준비해 두십시오.

  • 조인 및 필터링 열에 인덱스를 생성하십시오(예: orders(customer_id, status)). WHERE에서 인덱스가 있는 열에 함수를 적용하지 마십시오.
  • 대규모 안티 조인에는 IN보다 EXISTS를 선호하십시오. NULL이 포함된 NOT IN은 아무것도 반환하지 않고 조용히 종료됩니다.
  • 외부 조인한 열을 WHERE에서 필터링하면 조용히 내부 조인이 됩니다.
  • 상위 N개 결과가 결정적이 되도록 항상 동률 해결 기준을 추가하십시오.
  • 큰 테이블에서 순차 스캔이 발생하는지 EXPLAIN 실행 계획을 확인하십시오.

빠른 확인

각 고객의 가장 최근 주문 하나만 필요하며, 두 주문의 날짜가 같을 수 있습니다.

복습: 전체 모의 면접 세트

빈도가 가장 높은 면접 문제를 처음부터 끝까지 풀어 보았습니다.

  • 상위 N개 지출액을 구하기 위한 집계 + LIMIT
  • NOT EXISTS를 사용한 안티 조인(NULL에 안전)
  • N번째로 높은 값을 구할 때는 DENSE_RANK, 키별 최신 행과 그룹별 상위 항목에는 ROW_NUMBER
  • 전월 대비 계산에는 LAG, 누적 합계에는 SUM OVER
  • 연속 구간을 찾는 간격과 구간의 행 번호 기법
  • 모든 답변을 인덱스, EXPLAIN, 흔한 함정에 대한 논의로 마무리
무료로 시작

AI 튜터와 함께 SQL을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“전체 모의 면접 문제 세트” 강의는 무료인가요?

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

“전체 모의 면접 문제 세트”에서 뭘 배우나요?

면접 환경에서 조인, 윈도, CTE를 결합한 문제를 제한 시간 안에 처음부터 끝까지 풀어봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“전체 모의 면접 문제 세트” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 3NF까지 정규화하기
  2. ER 모델링과 관계 카디널리티
  3. 스타 스키마와 데이터 웨어하우스 설계
  4. 전체 모의 면접 문제 세트
← SQL Interview Prep(으)로 돌아가기