부록 — 코딩 테스트, 6 원칙으로 정복하기
부록 — 코딩 테스트, 6 원칙으로 정복하기
SQL 문제를 보는 순간 막막하다면, 순서가 없어서입니다.
김민서 사원
팀장님, SQL 코딩 테스트 문제를 풀어보려고 하는데 문제를 보면 뭐부터 시작해야 할지 모르겠어요.
박지수 팀장
코딩 테스트도 결국 같아요. 결과를 먼저 그리고, 거기까지 가는 순서를 하나씩 쌓는 거예요. 저한테 5가지 팁이 있어요.
이 챕터에서는 SQL 코딩 테스트 문제를 푸는 5가지 접근법을 배웁니다. 실제 문제를 함께 풀어보면서 어떻게 적용하는지 확인합니다.
5가지 접근법 미리 보기
- 문제를 꼼꼼히 읽고 주석으로 분석한다
- 테이블 이름과 컬럼명을 먼저 파악한다
- SELECT *로 테이블 전체를 먼저 출력해본다
- 예상 결과물을 보고 주석을 정리한다
- 코드를 조건 하나씩 추가하며 구현한다
말로만 보면 추상적입니다. 문제를 보면서 따라해봅니다.
연습 문제
문제 — 이름이 등록된 도서의 ISBN
BOOK_INFO 테이블은 도서관에 등록된 도서 정보를 담고 있습니다.
| NAME | TYPE | NULLABLE |
|---|---|---|
| BOOK_ID | VARCHAR(N) | FALSE |
| GENRE | VARCHAR(N) | FALSE |
| REG_DATE | DATETIME | FALSE |
| CONDITION | VARCHAR(N) | FALSE |
| TITLE | VARCHAR(N) | TRUE |
| AVAILABILITY | VARCHAR(N) | FALSE |
도서관에 등록된 도서 중, 제목이 등록된 도서의 BOOK_ID를 조회하는 SQL 문을 작성해주세요. 단, BOOK_ID는 오름차순 정렬되어야 합니다.
예시 데이터
| BOOK_ID | GENRE | REG_DATE | CONDITION | TITLE | AVAILABILITY |
|---|---|---|---|---|---|
| B100234 | 소설 | 20210310 | Normal | NULL | Available |
| B200341 | 과학 | 20201115 | Worn | NULL | Borrowed |
| B300892 | 역사 | 20220108 | Normal | 사피엔스 | Available |
| B400127 | 소설 | 20190722 | Damaged | 채식주의자 | Available |
예상 출력 결과
| BOOK_ID |
|---|
| B300892 |
| B400127 |
제목이 있는 도서의 BOOK_ID가 오름차순으로 출력됩니다.
팁 1 — 문제를 꼼꼼히 읽고 주석으로 분석한다
문제를 처음 보면 바로 코드를 치고 싶어집니다. 참아야 합니다.
먼저 문제에서 핵심 조건을 뽑아 주석으로 적어둡니다.
-- [문제 분석]
-- 목표: 제목(TITLE)이 등록된 도서의 BOOK_ID를 조회
-- 조건 1: TITLE이 NULL이 아닌 것만 → IS NOT NULL
-- 조건 2: BOOK_ID 오름차순 정렬 → ORDER BY BOOK_ID ASC
-- 필요한 열: BOOK_ID 하나만
주석으로 정리하면 두 가지 효과가 있습니다.
- 조건을 빠뜨리지 않습니다.
- 막혀도 주석을 보면서 다시 시작할 수 있습니다.
팁 2 — 테이블 이름과 컬럼명을 먼저 파악한다
문제에서 테이블 구조를 줍니다. 이 표를 꼼꼼히 봅니다.
BOOK_INFO 테이블
BOOK_IDVARCHAR(N) NULLABLE: FALSE ← 기본키, 항상 있음GENREVARCHAR(N) NULLABLE: FALSEREG_DATEDATETIME NULLABLE: FALSECONDITIONVARCHAR(N) NULLABLE: FALSETITLEVARCHAR(N) NULLABLE: TRUE ← NULL이 있을 수 있음! 핵심AVAILABILITYVARCHAR(N) NULLABLE: FALSE
NULLABLE이 TRUE인 열을 눈여겨봅니다. 이 문제에서 TITLE이 NULLABLE TRUE입니다. 제목이 없는 도서가 있다는 뜻입니다.
그리고 문제가 "제목이 있는 것만" 달라고 합니다. 여기서 IS NOT NULL이 필요하다는 것을 알 수 있습니다.
-- [테이블 파악]
-- 테이블명: BOOK_INFO
-- 핵심 컬럼: BOOK_ID (출력할 것), TITLE (NULL 여부로 필터링)
-- TITLE이 NULLABLE → IS NOT NULL 조건 필요
팁 3 — SELECT *로 테이블 전체를 먼저 출력해본다
실제 코딩 테스트 환경에서는 보통 에디터에서 코드를 실행해볼 수 있습니다. 조건을 바로 넣기 전에, 먼저 전체 테이블을 출력해봅니다.
SELECT *
FROM BOOK_INFO;
출력 결과를 보면 실제로 NULL이 어떻게 생겼는지, 데이터가 몇 건인지 확인할 수 있습니다.
이 단계에서 확인하는 것들입니다.
- 실제로 NULL이 어떻게 생겼는지 눈으로 확인
- 데이터가 몇 건인지
- 컬럼 값의 형태(문자인지, 숫자인지, 날짜인지)
- 예상 결과와 비교했을 때 어떤 행이 남아야 하는지
B100234, B200341은 TITLE이 NULL입니다. B300892, B400127은 TITLE이 있습니다. 예상 출력 결과와 일치합니다.
팁 4 — 예상 결과물을 보고 주석을 정리한다
문제에서 주는 예상 출력 결과를 다시 봅니다.
예상 출력
| BOOK_ID |
|---|
| B300892 |
| B400127 |
여기서 확인할 것들입니다.
- 출력되는 열이 몇 개인가? → BOOK_ID 하나
- 어떤 순서로 정렬됐는가? → B300892 → B400127 (오름차순)
- 전체 데이터 중 몇 행인가? → 4행 중 2행 → 조건으로 절반 필터링
이것을 주석에 추가합니다.
-- [문제 분석]
-- 목표: 제목(TITLE)이 등록된 도서의 BOOK_ID를 조회
-- 조건 1: TITLE이 NULL이 아닌 것만 → WHERE TITLE IS NOT NULL
-- 조건 2: BOOK_ID 오름차순 정렬 → ORDER BY BOOK_ID ASC
-- 필요한 열: BOOK_ID 하나만 → SELECT BOOK_ID
-- [예상 결과 확인]
-- B100234 → TITLE이 NULL → 제외
-- B200341 → TITLE이 NULL → 제외
-- B300892 → TITLE 있음 → 포함
-- B400127 → TITLE 있음 → 포함
-- 정렬: B300892 < B400127 (오름차순 맞음)
주석이 완성되면 코드는 이 주석을 SQL로 번역한 것에 불과합니다.
팁 5 — 코드를 조건 하나씩 추가하며 구현한다
주석이 완성됐으면 이제 코드를 씁니다. 한 번에 다 쓰지 않습니다. 조건을 하나씩 추가하면서 결과를 확인합니다.
단계 1 — FROM만 쓰고 확인
SELECT *
FROM BOOK_INFO;
전체 4행이 나오는지 확인합니다.
단계 2 — WHERE 조건 추가
SELECT *
FROM BOOK_INFO
WHERE TITLE IS NOT NULL;
실행 결과에서 TITLE이 NULL인 행이 제외되는지 확인합니다.
단계 3 — SELECT로 필요한 열만
SELECT BOOK_ID
FROM BOOK_INFO
WHERE TITLE IS NOT NULL;
열이 하나만 남습니다.
단계 4 — ORDER BY로 정렬 추가
SELECT BOOK_ID
FROM BOOK_INFO
WHERE TITLE IS NOT NULL
ORDER BY BOOK_ID ASC;
정렬된 결과가 예상 출력과 일치하는지 확인합니다.
최종 코드
-- [문제 분석]
-- 목표: 제목(TITLE)이 등록된 도서의 BOOK_ID를 조회
-- 조건 1: TITLE이 NULL이 아닌 것만 → WHERE TITLE IS NOT NULL
-- 조건 2: BOOK_ID 오름차순 정렬 → ORDER BY BOOK_ID ASC
-- 필요한 열: BOOK_ID 하나만 → SELECT BOOK_ID
SELECT BOOK_ID
FROM BOOK_INFO
WHERE TITLE IS NOT NULL
ORDER BY BOOK_ID ASC;
5가지 팁 요약
- 팁 1: 문제를 읽으며 핵심 조건을 주석으로 적는다
- 팁 2: 테이블 구조를 보고 NULLABLE 열을 눈여겨본다
- 팁 3: SELECT *로 실제 데이터를 먼저 확인한다
- 팁 4: 예상 결과물과 비교해 어떤 행이 포함/제외되는지 주석에 정리한다
- 팁 5: 조건을 하나씩 추가하며 단계별로 구현한다
같은 방식으로 풀어보는 문제 2
문제 — 대출 가능한 과학 도서 목록
BOOK_INFO 테이블에서 장르가 과학이고 현재 대출 가능(Available)한 도서의 BOOK_ID와 TITLE을 조회하세요. 단, REG_DATE 기준 오름차순 정렬하세요.
혼자 풀어보기 — 주석 먼저 작성
-- [문제 분석]
-- 목표:
-- 조건 1:
-- 조건 2:
-- 정렬:
-- 필요한 열:
빈칸을 채운 뒤 코드를 작성해보세요.
정답
-- [문제 분석]
-- 목표: 과학 장르이고 대출 가능한 도서 조회
-- 조건 1: GENRE = '과학'
-- 조건 2: AVAILABILITY = 'Available'
-- 정렬: REG_DATE 오름차순
-- 필요한 열: BOOK_ID, TITLE
SELECT BOOK_ID, TITLE
FROM BOOK_INFO
WHERE GENRE = '과학'
AND AVAILABILITY = 'Available'
ORDER BY REG_DATE ASC;
실행 결과
| BOOK_ID | TITLE |
|---|---|
| (해당 데이터 없음) |
샘플 데이터에서 과학 장르(B200341)는 AVAILABILITY가 Borrowed입니다. 두 조건을 동시에 만족하는 행이 없어 결과가 비어 있습니다. 이것도 정상적인 결과입니다.
실무에서도 조건에 맞는 데이터가 없으면 빈 결과가 나옵니다.
코딩 테스트에서 자주 나오는 조합
| 출제 유형 | 핵심 원칙 | 대표 조건 |
|---|---|---|
| 특정 값 조회 | SELECT, WHERE | =, !=, IN |
| NULL 처리 | WHERE | IS NULL / IS NOT NULL |
| 상위 N개 | ORDER BY, LIMIT | DESC + LIMIT |
| 개수 세기 | GROUP BY, COUNT | GROUP BY 열 |
| 합계 구하기 | GROUP BY, SUM | SUM(열) |
| 조건 + 집계 | WHERE, GROUP BY, HAVING | 순서 주의 |
| 날짜 범위 | WHERE | BETWEEN '날짜' AND '날짜' |
| 패턴 검색 | WHERE | LIKE '%키워드%' |
실수하면 안 되는 것 3가지
NULL조건을= NULL로 쓴다
-- ❌ 잘못된 예
WHERE TITLE = NULL
-- ✅ 올바른 예
WHERE TITLE IS NULL
WHERE TITLE IS NOT NULL
ORDER BY방향을 반대로 쓴다
문제에서 "오름차순"이라고 했는데 DESC를 씁니다.
- 오름차순(작은 것부터) →
ASC또는 생략 - 내림차순(큰 것부터) →
DESC(반드시 명시)
문제에서 정렬 방향이 나오면 주석에 먼저 적어둡니다.
- 출력 열을 잘못 선택한다
문제는 BOOK_ID만 달라고 하는데 SELECT *로 제출합니다.
-- ❌ 필요 이상의 열
SELECT *
FROM BOOK_INFO
WHERE TITLE IS NOT NULL;
-- ✅ 요구한 열만 정확히
SELECT BOOK_ID
FROM BOOK_INFO
WHERE TITLE IS NOT NULL;
문제 풀기 전 체크리스트
- 출력해야 할 열이 무엇인가? →
SELECT - 어느 테이블에서 가져오는가? →
FROM - 어떤 조건으로 필터링하는가? →
WHERE -
NULL조건이 있는가? →IS NULL / IS NOT NULL - 정렬 기준과 방향이 있는가? →
ORDER BY + ASC/DESC - 개수 제한이 있는가? →
LIMIT - 묶어서 집계해야 하는가? →
GROUP BY - 집계 후 조건이 있는가? →
HAVING
이 체크리스트를 보면서 주석을 채우고, 주석을 SQL로 번역하면 코딩 테스트 문제는 대부분 풀립니다.
김민서 사원 : 팀장님, 이렇게 하나씩 주석 쓰고 단계별로 코드 짜니까 훨씬 실수가 줄어드는 것 같아요.
박지수 팀장 : 맞아요. 실력이 있는 사람도 막히는 이유는 대부분 순서가 없어서예요. 문제 읽기 → 주석 → SELECT * 확인 → 조건 하나씩. 이 순서만 지켜도 웬만한 문제는 풀려요. 나머지는 연습이에요.
-- 마지막으로
SELECT 자신감
FROM 연습
WHERE 포기 = FALSE
ORDER BY 성장 DESC;