26년 인턴준비 SQL
1. 면접관이 말한 “SQL을 1주일 공부해 오라”의 의미
기업이 요구한 것은 SQLD 시험을 다시 공부하라는 의미보다는, 실제 데이터베이스에서 데이터를 조회하고 검증할 수 있을 정도로 SQL을 직접 작성해 보라는 의미입니다.
따라서 면접관이 기대하는 수준은 다음과 같습니다.
“SQL 문법을 알고 있는가?”가 아니라
“테이블 구조를 보고 필요한 데이터를 추출하고, 이상 여부를 확인하며, 결과가 맞는지 검증할 수 있는가?”
2. 공부해야 할 내용의 우선순위
1순위. 기본 조회문을 자유롭게 작성하기
SQLD 자격증이 있다면 개념은 이미 알고 있을 가능성이 높습니다. 다만 면접에서는 문법 설명보다 직접 작성 능력이 중요합니다.
반드시 익혀야 하는 내용은 다음과 같습니다.
SELECT
FROM
WHERE
ORDER BY
LIMIT
DISTINCT
다음 조건을 바로 작성할 수 있어야 합니다.
SELECT user_id, product_id, score
FROM recommendations
WHERE score >= 0.8
ORDER BY score DESC
LIMIT 100;
공부 포인트는 다음과 같습니다.
- 필요한 열만 선택하기
- 여러 조건을 AND, OR, IN, BETWEEN으로 표현하기
- 날짜 범위로 데이터 조회하기
- 중복값 제거하기
- 상위 또는 하위 데이터 추출하기
2순위. JOIN
실무 SQL에서 가장 중요합니다. 인텔리시스처럼 사용자, 상품, 추천 결과, 콘텐츠 등의 데이터를 다루는 회사에서는 여러 테이블을 결합하는 작업이 빈번할 가능성이 높습니다.
반드시 구분해야 합니다.
INNER JOIN
LEFT JOIN
예시는 다음과 같습니다.
SELECT
r.user_id,
u.gender,
r.product_id,
p.category,
r.score
FROM recommendations r
JOIN users u
ON r.user_id = u.user_id
JOIN products p
ON r.product_id = p.product_id;
특히 다음 질문에 답할 수 있어야 합니다.
- INNER JOIN과 LEFT JOIN의 차이
- JOIN 이후 행 수가 증가하는 이유
- 중복 키가 있을 때 데이터가 왜 불어나는지
- 매칭되지 않은 데이터를 어떻게 찾는지
매칭되지 않은 데이터는 다음처럼 확인합니다.
SELECT r.*
FROM recommendations r
LEFT JOIN products p
ON r.product_id = p.product_id
WHERE p.product_id IS NULL;
이러한 쿼리는 추천 결과에 존재하지만 상품 DB에는 없는 상품 ID를 찾는 검증 작업에 사용할 수 있습니다.
3순위. 집계와 GROUP BY
AI 모델이나 추천 시스템의 결과를 검증할 때는 개별 데이터를 보는 것뿐 아니라 그룹별 통계를 계산해야 합니다.
필수 함수는 다음과 같습니다.
COUNT()
SUM()
AVG()
MIN()
MAX()
GROUP BY
HAVING
예시는 다음과 같습니다.
SELECT
category,
COUNT(*) AS recommendation_count,
AVG(score) AS average_score
FROM recommendations
GROUP BY category
HAVING COUNT(*) >= 100;
다음 작업을 할 수 있어야 합니다.
- 사용자별 추천 개수
- 상품 카테고리별 추천 수
- 날짜별 생성 데이터 수
- 평균 추천 점수
- 중복 데이터 개수
- 특정 기준보다 데이터가 적은 그룹 확인
4순위. NULL, 중복값 및 데이터 이상 검증
면접에서 “검증 업무”를 언급했다면 가장 중요하게 볼 가능성이 높은 부분입니다.
NULL 확인
SELECT COUNT(*)
FROM products
WHERE category IS NULL;
중복 키 확인
SELECT
product_id,
COUNT(*) AS duplicate_count
FROM products
GROUP BY product_id
HAVING COUNT(*) > 1;
값의 범위 확인
SELECT *
FROM recommendations
WHERE score < 0
OR score > 1;
참조 무결성 확인
SELECT r.*
FROM recommendations r
LEFT JOIN users u
ON r.user_id = u.user_id
WHERE u.user_id IS NULL;
날짜 논리 오류 확인
SELECT *
FROM user_events
WHERE created_at > updated_at;
이 부분은 단순 SQL 문법보다 중요합니다. 면접에서는 다음과 같은 질문이 나올 수 있습니다.
추천 점수가 0에서 1 사이여야 하는데 일부 값이 범위를 벗어났다. 어떻게 찾겠는가?
상품 테이블에 존재하지 않는 상품 ID가 추천 결과에 포함되었는지 어떻게 확인하겠는가?
사용자별 추천 결과가 정확히 10개씩 생성되었는지 어떻게 확인하겠는가?
5순위. CASE WHEN
데이터를 조건별로 분류하거나 검증 결과를 표시할 때 사용합니다.
SELECT
user_id,
score,
CASE
WHEN score >= 0.8 THEN 'high'
WHEN score >= 0.5 THEN 'medium'
ELSE 'low'
END AS score_level
FROM recommendations;
검증용으로는 다음과 같이 사용할 수 있습니다.
SELECT
product_id,
price,
CASE
WHEN price IS NULL THEN 'NULL 오류'
WHEN price < 0 THEN '음수 오류'
ELSE '정상'
END AS validation_result
FROM products;
6순위. 서브쿼리와 CTE
복잡한 쿼리를 단계별로 구성할 수 있어야 합니다.
CTE는 WITH를 사용하는 방식입니다.
WITH user_counts AS (
SELECT
user_id,
COUNT(*) AS recommendation_count
FROM recommendations
GROUP BY user_id
)
SELECT *
FROM user_counts
WHERE recommendation_count <> 10;
이 쿼리는 사용자별 추천 개수가 정확히 10개인지 검증합니다.
1주일 준비라면 복잡한 상관 서브쿼리까지 공부할 필요는 없지만, 다음은 알아야 합니다.
- 서브쿼리의 기본 구조
- IN, EXISTS
- WITH를 사용한 CTE
- 복잡한 쿼리를 단계별로 나누는 방법
7순위. 윈도우 함수
시간이 허용된다면 반드시 공부하는 것이 좋습니다. SQLD 기본 수준과 실무 SQL을 구분하는 대표적인 영역입니다.
필수 함수는 다음과 같습니다.
ROW_NUMBER()
RANK()
DENSE_RANK()
LAG()
LEAD()
SUM() OVER()
AVG() OVER()
사용자별 추천 순위를 계산하는 예시는 다음과 같습니다.
SELECT
user_id,
product_id,
score,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY score DESC
) AS recommendation_rank
FROM recommendations;
사용자별 상위 5개 추천만 가져오려면 다음과 같이 작성합니다.
WITH ranked AS (
SELECT
user_id,
product_id,
score,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY score DESC
) AS rn
FROM recommendations
)
SELECT *
FROM ranked
WHERE rn <= 5;
추천 시스템이나 데이터 검증 업무에서는 매우 유용합니다.
3. 실제로 나올 가능성이 높은 SQL 업무
해당 기업은 AI, 빅데이터, 추천 시스템, 기업용 데이터 분석 및 RAG 기반 솔루션을 개발하고 있습니다. 따라서 인턴 SQL 업무는 전통적인 회계 데이터 조회보다는 사용자, 상품, 문서, 추천 결과 및 모델 출력 데이터를 다루는 방향일 가능성이 높습니다.
예상 업무는 다음과 같습니다.
데이터 수집 결과 검증
- 수집된 상품 데이터 개수 확인
- 중복 상품 확인
- 누락된 필드 확인
- 비정상 가격 또는 카테고리 확인
- 수집 날짜별 데이터 증가량 확인
추천 결과 검증
- 사용자별 추천 개수 확인
- 동일 상품 중복 추천 확인
- 존재하지 않는 상품 추천 여부 확인
- 추천 점수 범위 확인
- 카테고리 편향 확인
- 특정 상품만 과도하게 추천되는지 확인
AI 또는 RAG 결과 검증
- 질문별 검색 문서 개수 확인
- 동일 문서 중복 검색 여부 확인
- 검색 점수 범위 확인
- 답변과 연결된 출처 문서 확인
- 데이터 생성 전후 결과 비교
- 모델 버전별 결과 차이 집계
데이터셋 생성 및 정제
- 학습용 데이터 추출
- 특정 기간 또는 조건의 데이터 필터링
- 사용자 및 상품 정보를 결합
- 학습, 검증, 테스트 데이터 분리
- 라벨별 데이터 개수 및 분포 확인
4. SQLD 보유자인 경우 부족할 가능성이 높은 부분
SQLD가 있다면 다음 내용은 이미 알고 있을 가능성이 높습니다.
- 관계형 데이터베이스 기본 개념
- 엔터티, 속성, 관계
- 정규화
- 기본 SQL 문법
- JOIN과 서브쿼리의 개념
- 트랜잭션 및 인덱스 개념
그러나 실무에서는 다음 역량이 별도로 필요합니다.
첫째, 빈 화면에서 직접 쿼리를 작성하는 능력
선택지를 고르는 것과 직접 쿼리를 작성하는 것은 다릅니다. 문제를 읽고 바로 SELECT부터 작성하는 연습이 필요합니다.
둘째, 테이블 관계를 파악하는 능력
다음 구조를 보고 어떤 키로 JOIN해야 하는지 판단해야 합니다.
users
- user_id
- age
- gender
products
- product_id
- category
- price
recommendations
- user_id
- product_id
- score
- created_at
셋째, 결과가 맞는지 검증하는 능력
쿼리가 실행된다고 정답은 아닙니다.
예를 들어 JOIN 전 데이터가 1,000행인데 JOIN 후 50,000행이 나왔다면 다음을 의심해야 합니다.
- JOIN 키가 잘못되었는가
- 한쪽 테이블에 중복 키가 있는가
- 다대다 관계가 발생했는가
- JOIN 조건이 누락되었는가
넷째, 데이터 이상을 찾는 능력
실무에서는 정상 데이터를 조회하는 것보다 비정상 데이터를 찾는 SQL이 중요합니다.
WHERE column IS NULL
HAVING COUNT(*) > 1
WHERE score NOT BETWEEN 0 AND 1
LEFT JOIN ... WHERE joined_key IS NULL
이 패턴을 집중적으로 연습해야 합니다.
5. 1주일 학습 계획
1일 차: 기본 조회와 조건문
학습 내용:
- SELECT, FROM, WHERE
- AND, OR, NOT
- IN, BETWEEN, LIKE
- ORDER BY, LIMIT
- DISTINCT
- NULL 처리
목표:
하나의 테이블에서 필요한 데이터를 자유롭게 필터링할 수 있음
2일 차: GROUP BY와 집계함수
학습 내용:
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY
- HAVING
- 날짜별, 사용자별, 카테고리별 집계
목표:
데이터 분포와 이상치를 집계 쿼리로 확인할 수 있음
3일 차: JOIN 집중 연습
학습 내용:
- INNER JOIN
- LEFT JOIN
- 2개 및 3개 테이블 JOIN
- 미매칭 데이터 찾기
- JOIN으로 행이 증가하는 원인
목표:
사용자, 상품 및 추천 결과 테이블을 결합할 수 있음
4일 차: 데이터 검증 SQL
학습 내용:
- NULL 검사
- 중복값 검사
- 범위 오류 검사
- 참조 무결성 검사
- 레코드 개수 비교
- 데이터 전후 비교
목표:
정상 데이터를 조회하는 것이 아니라 오류 데이터를 찾아낼 수 있음
5일 차: CASE WHEN, 서브쿼리 및 CTE
학습 내용:
- CASE WHEN
- 스칼라 및 일반 서브쿼리
- IN, EXISTS
- WITH CTE
목표:
복잡한 검증 조건을 단계별 SQL로 구성할 수 있음
6일 차: 윈도우 함수
학습 내용:
- ROW_NUMBER
- RANK
- PARTITION BY
- LAG, LEAD
- 사용자별 Top-N 추출
목표:
사용자별 추천 순위와 시점별 변화량을 계산할 수 있음
7일 차: 모의 과제 수행
다음과 같은 작은 프로젝트를 수행하는 것이 가장 좋습니다.
테이블:
users
products
recommendations
user_events
검증 항목:
- 사용자별 추천 개수가 10개인지 확인
- 동일 사용자에게 동일 상품이 중복 추천되었는지 확인
- 상품 테이블에 없는 상품이 추천되었는지 확인
- 추천 점수가 0에서 1을 벗어났는지 확인
- 카테고리별 평균 추천 점수 계산
- 사용자별 상위 3개 추천 추출
- 날짜별 추천 생성 건수 계산
- 전날 대비 추천 생성량 변화 계산
6. 실무 전에 반드시 풀어봐야 할 문제
문제 1
각 사용자별 추천 상품 개수를 구하십시오.
SELECT
user_id,
COUNT(*) AS recommendation_count
FROM recommendations
GROUP BY user_id;
문제 2
추천 상품이 10개가 아닌 사용자를 찾으십시오.
SELECT
user_id,
COUNT(*) AS recommendation_count
FROM recommendations
GROUP BY user_id
HAVING COUNT(*) <> 10;
문제 3
동일 사용자에게 동일 상품이 중복 추천된 경우를 찾으십시오.
SELECT
user_id,
product_id,
COUNT(*) AS duplicate_count
FROM recommendations
GROUP BY user_id, product_id
HAVING COUNT(*) > 1;
문제 4
상품 테이블에 존재하지 않는 추천 상품을 찾으십시오.
SELECT r.*
FROM recommendations r
LEFT JOIN products p
ON r.product_id = p.product_id
WHERE p.product_id IS NULL;
문제 5
사용자별 추천 점수 상위 3개 상품을 추출하십시오.
WITH ranked AS (
SELECT
user_id,
product_id,
score,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY score DESC
) AS rn
FROM recommendations
)
SELECT *
FROM ranked
WHERE rn <= 3;
인덱스가 무엇이며, 인덱스가 조회 속도를 높이지만 쓰기 비용과 저장 공간을 증가시킨다는 정도는 설명할 수 있어야 합니다.
결론
현재 SQLD가 있다면 이론을 다시 처음부터 공부할 필요는 없습니다. 다음 세 가지에 집중하는 것이 가장 효율적입니다.
- JOIN, GROUP BY 및 윈도우 함수를 직접 작성하는 연습
- NULL, 중복, 범위 오류 및 미매칭 데이터를 찾는 검증 SQL
- 사용자, 상품 및 추천 결과로 구성된 작은 데이터베이스를 직접 조회하는 실습
면접관이 기대한 핵심은 고급 데이터베이스 전문가 수준이 아니라, 회사 데이터 구조를 이해하고 SQL로 데이터를 추출·정제·검증할 수 있는 기본 실무 역량으로 판단됩니다.