n번째 값이 없을 때 NULL 반환하기
면접관이 좋아하는 예외 상황인 행이 너무 적을 때의 우아한 처리를 알아봅니다.
n번째 값이 없을 때 NULL 반환하기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관이 좋아하는 예외 상황
N번째로 높은 값을 구하는 쿼리를 완성하면 면접관은 다음과 같이 추가로 묻습니다. "테이블에 서로 다른 급여가 N개보다 적으면 어떻게 하시겠습니까? 빈 결과가 아니라 NULL 하나를 반환하고 싶습니다."
이 질문은 쿼리를 암기한 지원자와 결과 집합의 동작을 이해하는 지원자를 가르는 질문입니다. 많은 해법이 NULL을 포함한 한 행 대신 행이 0개인 결과를 조용히 반환합니다.
이 레슨에서는 정확히 한 개의 출력 행을 강제하고, N번째 값이 없을 때 그 값이 NULL이 되도록 하는 방법을 모두 다룹니다.
DENSE_RANK만 사용하면 행이 반환되지 않는 이유
표준 N번째로 높은 값 조회를 떠올려 보십시오. 서로 다른 급여가 두 개뿐인데 세 번째 값을 요청하면 WHERE rnk = 3과 일치하는 행이 없으므로 쿼리는 빈 집합인 행 0개를 반환합니다.
빈 집합은 NULL을 포함한 행과 다릅니다. 명세에서 "NULL을 반환하라"고 했다면 기본 로직이 올바르더라도 빈 결과는 테스트를 통과하지 못합니다.
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = 3; -- returns NO rows if fewer than 3 distinct salaries해결 방법 1: 외부 SELECT로 감싸기
가장 간단하고 확실한 해결 방법은 N번째로 높은 값 조회 전체를 하나의 SELECT 안에 스칼라 서브쿼리로 넣는 것입니다. 일치하는 행이 없는 스칼라 서브쿼리는 NULL로 평가되고, 외부 SELECT는 항상 정확히 한 행을 생성합니다.
이는 LeetCode 방식의 "NULL 반환" 변형 문제에 대한 대표적인 답이며 모든 데이터베이스 문법에서 작동합니다.
SELECT (
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2 -- N = 3
) AS third_highest;스칼라 서브쿼리 기법이 작동하는 이유
원하는 동작은 다음 두 규칙이 결합되어 만들어집니다.
- 스칼라 서브쿼리는 최대 하나의 값을 반환해야 합니다. 행을 반환하지 않으면 SQL이
NULL을 대신 사용합니다. FROM이 없거나 한 행을 제공하는 원본을 사용하는 외부 SELECT는 항상 정확히 한 행을 출력합니다.
따라서 내부 쿼리가 N번째 값을 찾으면 그 값을 얻고, 아무것도 찾지 못하면 NULL을 담은 한 행을 얻습니다. 면접관이 제시한 요구 사항과 정확히 일치합니다.
DENSE_RANK 방식에 해결 방법 1 적용하기
윈도 함수 해법에도 같은 래퍼를 사용할 수 있습니다. 순위를 매긴 쿼리를 스칼라 서브쿼리 안에 넣으십시오. 순위가 N인 행이 없으면 서브쿼리는 NULL을 반환하고 외부 SELECT는 여전히 한 행을 반환합니다.
SELECT (
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = 3
) AS third_highest;해결 방법 2: MAX는 자동으로 NULL을 반환합니다
레슨 1에서 배운 MAX 아래 MAX 방식을 떠올려 보십시오. 행이 0개인 대상에 집계 함수를 적용하면 NULL을 반환하면서도 한 행을 생성합니다. 두 번째로 높은 값을 구하는 경우에는 이미 NULL 요구 사항을 충족하는 깔끔한 한 줄 쿼리입니다.
단점은 순수한 MAX 중첩을 임의의 N까지 확장하면 복잡해진다는 것입니다. 따라서 이 방식은 특히 두 번째로 높은 값을 구할 때 적합합니다.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);해결 방법 3: 대체값과 함께 COALESCE 사용하기
실행 환경에서 한 행이 보장되지만 다른 이유로 값이 없을 수 있다면, 결과를 COALESCE로 감싸 명시적인 기본값을 제공할 수 있습니다.
주의하십시오. COALESCE는 행이 이미 존재할 때만 도움이 됩니다. 빈 결과 집합을 행으로 바꾸지는 않습니다. 따라서 행을 보장하는 스칼라 서브쿼리 래퍼와 함께 사용한 다음, NULL 대신 0과 같은 값을 원할 때 값에 COALESCE를 적용하십시오.
SELECT COALESCE((
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;해결하지 못하는 방법
올바르게 보이지만 실패하는 방법을 주의하십시오.
- 행을 0개 반환하는 쿼리 바로 바깥에
COALESCE를 추가해도 아무 효과가 없습니다.COALESCE가 처리할 행 자체가 없기 때문입니다. IFNULL과ISNULL도COALESCE와 같은 한계가 있습니다.LIMIT 1을 추가해도 조건을 만족하는 행이 없을 때 행을 만들어 내지는 않습니다.
행 수 문제는 NULL 대체 함수만으로 해결할 수 없으며, 스칼라 서브쿼리 래퍼나 집계 함수를 사용해야 합니다.
예제: 두 개뿐인 값에서 세 번째 값 요청하기
급여는 500, 500, 300입니다. 서로 다른 급여는 500과 300뿐이므로 세 번째로 높은 값은 없습니다.
- WHERE rnk = 3을 사용한 일반 DENSE_RANK: 행을 0개 반환합니다. 명세를 충족하지 못합니다.
- 스칼라 서브쿼리 래퍼: 내부 쿼리가 아무것도 찾지 못하므로 외부 SELECT가
NULL을 포함한 한 행을 반환합니다. 통과합니다. - COALESCE(..., 0): 숫자 기본값이 요청된 경우
0을 포함한 한 행을 반환합니다.
면접에서 풀이 과정을 설명하는 방법
다음과 같이 설명하면 좋은 평가를 받을 수 있습니다.
- "단순한 쿼리는 NULL이 아니라 빈 집합을 반환하므로, 한 행을 보장하도록 스칼라 서브쿼리로 감싸겠습니다."
- "일치하는 행이 없는 스칼라 서브쿼리는 NULL로 평가되며, 이는 요구 사항과 정확히 일치합니다."
- "NULL 대신 0과 같은 기본값을 원하신다면 서브쿼리 주위에 COALESCE를 추가하겠습니다."
행 수의 의미와 값의 의미를 구분하여 이해하고 있음을 보여 주는 것이 이 질문의 핵심입니다.
전체 내용 종합하기
견고하고 매개변수화할 수 있는 N번째로 높은 값 또는 NULL 해법은 서로 다른 급여에 순위를 매기고, 스칼라 서브쿼리 안에서 순위 N을 필터링한 다음, 외부 SELECT가 한 행을 보장하도록 하는 방식입니다.
이 하나의 쿼리는 중복을 처리하고(DENSE_RANK 사용), 어떤 N에도 적용할 수 있으며, N이 서로 다른 급여의 개수를 초과할 때 NULL을 자연스럽게 반환합니다.
SELECT (
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) t
WHERE rnk = :n
LIMIT 1
) AS nth_highest;빠른 확인
행 수와 NULL 값의 차이를 생각해 보십시오.
복습
N이 사용 가능한 서로 다른 급여의 개수를 초과하면 일반 순위 쿼리는 NULL이 아니라 빈 집합을 반환합니다.
- N번째로 높은 값 조회를 외부 SELECT 안의 스칼라 서브쿼리로 감싸 항상 한 행이 생성되도록 하십시오. 일치하는 값이 없으면
NULL이 반환됩니다. - MAX 아래 MAX 방식은 두 번째로 높은 값을 구하는 경우 별도의 처리 없이
NULL을 반환합니다. - COALESCE는 행이 존재할 때만 값을 대체하며, 행 0개를 한 행으로 바꿀 수는 없습니다.
면접관이 자연스러운 NULL 처리를 요구할 때는 항상 행 수와 값을 구분하십시오.
자주 묻는 질문
“n번째 값이 없을 때 NULL 반환하기” 강의는 무료인가요?
네 — “n번째 값이 없을 때 NULL 반환하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“n번째 값이 없을 때 NULL 반환하기”에서 뭘 배우나요?
면접관이 좋아하는 예외 상황인 행이 너무 적을 때의 우아한 처리를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“n번째 값이 없을 때 NULL 반환하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 두 번째로 높은 급여를 찾는 다섯 가지 방법
- DENSE_RANK로 n번째로 높은 값 찾기
- 부서별 최고 연봉자
- n번째 값이 없을 때 NULL 반환하기