0Pricing
SQL Interview Prep · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 두 번째로 높은 급여를 찾는 다섯 가지 방법
  2. DENSE_RANK로 n번째로 높은 값 찾기
  3. 부서별 최고 연봉자
  4. n번째 값이 없을 때 NULL 반환하기
← SQL Interview Prep(으)로 돌아가기