0Pricing
SQL Interview Prep · 강의

BETWEEN, IN과 포함 경계

경계의 예외 상황과 BETWEEN이 양 끝점을 처리하는 방식을 알아봅니다.

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

경계값에서 지원자들이 감점되는 이유

범위 필터와 집합 필터는 간단해 보이기 때문에 면접관은 경계 사례를 함정으로 활용합니다. BETWEEN은 양쪽 끝점을 모두 포함하고, IN에는 미묘한 NULL 함정이 숨어 있으며, 날짜 범위에서는 ±1 오류가 보고서를 조용히 망칩니다.

이 레슨에서는 BETWEEN이 끝점을 정확히 어떻게 처리하는지, 연결된 OR보다 IN이 더 깔끔한 경우가 언제인지, 그리고 전문가들이 날짜에 사용하는 반열린 범위 패턴을 다룹니다.

BETWEEN은 양쪽 끝을 모두 포함

col BETWEEN a AND b는 col >= a AND col <= b의 줄임 표현입니다. 양쪽 끝점이 모두 포함됩니다.

따라서 price BETWEEN 10 AND 20은 가격이 정확히 10 또는 정확히 20인 행과 그 사이의 모든 행을 반환합니다. 면접에서 가장 흔한 오답은 상한이 제외된다고 말하는 것입니다.

SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20

인수 순서가 중요함

BETWEEN에서는 더 작은 값을 먼저 써야 합니다. col BETWEEN 20 AND 10은 col >= 20 AND col <= 10으로 확장되며, 이는 절대 참이 될 수 없으므로 오류가 아니라 행 0개를 반환합니다.

이는 자주 나오는 함정입니다. 쿼리는 문제없이 실행되고 아무것도 반환하지 않으므로 지원자는 데이터가 비어 있다고 생각하게 됩니다. 항상 더 작은 경계값을 먼저 쓰세요.

SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an error

날짜 범위의 경계 오류

1월 전체를 요청하면 많은 지원자가 order_date BETWEEN '2024-01-01' AND '2024-01-31'을 작성합니다. order_date가 타임스탬프라면 2024-01-31은 2024-01-31 00:00:00을 의미하므로, 이 조건은 31일 자정 이후의 모든 값을 제외합니다.

1월 31일 오후 2시의 주문은 제외됩니다. 순수한 DATE 열에서는 문제가 없지만, 열의 유형을 당연히 알 수 있다고 가정해서는 안 됩니다.

SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestamp

반열린 범위로 해결하기

날짜에 사용하는 전문가 패턴은 반열린 구간입니다. 시작값 이상이면서 다음 기간보다 엄격히 작은 값을 선택하는 방식입니다. 이 방식은 DATE와 TIMESTAMP 모두에서 올바르게 작동하며 열의 시간 해상도를 알 필요가 없습니다.

상한이 1월의 마지막 날이 아니라 2월의 첫날이라는 점에 주목하세요. 이렇게 해야 1월의 모든 시점을 포함할 수 있습니다.

SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2024-02-01';

NOT BETWEEN

col NOT BETWEEN a AND b는 col < a OR col > b로 확장됩니다. 양쪽 끝점과 그 사이의 모든 값을 제외합니다.

주의하세요. col이 NULL이면 NOT BETWEEN은 UNKNOWN으로 평가되므로, 일반적인 BETWEEN과 마찬가지로 NULL 행이 제외됩니다. 어느 방향으로 범위를 검사하든 NULL은 절대 조건을 만족하지 않습니다.

SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20

집합 소속 확인으로서의 IN

col IN (a, b, c)는 col = a OR col = b OR col = c의 줄임 표현입니다. 작은 고정 집합에 속하는지 검사할 때 깔끔한 방법입니다.

OR를 이어 쓰는 것보다 읽기 좋고, 전체 집합 검사가 하나의 조건식이므로 우선순위에 따른 괄호 문제도 완전히 피할 수 있습니다.

SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');

NOT IN의 NULL 함정

이는 IN에 관한 질문 중 가장 까다로운 문제입니다. NOT IN 뒤의 목록이나 서브쿼리에 NULL이 하나라도 포함되면 전체 조건식이 UNKNOWN으로 평가되어 행 0개를 반환할 수 있습니다.

이유는 다음과 같습니다. x NOT IN (1, NULL)은 x <> 1 AND x <> NULL이 되고, x <> NULL은 절대 참이 아니라 UNKNOWN입니다. 따라서 전체 AND가 참이 될 수 없습니다.

SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULL

NOT IN 수정하기

NOT IN의 NULL 함정에 대한 견고한 해결책은 두 가지입니다.

  • WHERE id IS NOT NULL을 사용해 서브쿼리에서 NULL을 제외합니다
  • 더 좋은 방법은 NOT EXISTS로 다시 작성하는 것입니다. NOT EXISTS는 설계상 NULL을 올바르게 처리합니다

면접관은 NOT EXISTS를 숙련자다운 답으로 평가합니다. 이 방식은 함정을 완전히 피하고 실행 계획도 더 나은 경우가 많기 때문입니다.

SELECT e.*
FROM employees e
WHERE NOT EXISTS (
  SELECT 1 FROM managers m WHERE m.id = e.manager_id
);

서브쿼리와 함께 사용하는 IN

IN은 열 하나를 반환하는 서브쿼리를 받을 수 있습니다. WHERE customer_id IN (SELECT customer_id FROM vip)는 고객이 VIP 집합에 속하는 행을 유지합니다.

일반적인 IN은 NOT IN과 달리 서브쿼리에 NULL이 있어도 안전합니다. 목록의 NULL은 단순히 일치하지 않을 뿐, 일치하는 행까지 무효로 만들지는 않습니다. 이 함정은 NOT IN에만 해당합니다.

SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);

행 생성자를 사용한 다중 열 IN

자주 나오는 후속 질문은 두 개 이상의 열을 한 번에 비교하려면 어떻게 하는가입니다. 행 생성자를 사용하여 튜플을 IN에 전달하십시오. 그러면 열을 위치에 따라 비교하므로 OR (a = .. AND b = ..)를 이어 쓰는 것보다 훨씬 깔끔합니다.

  • 읽기 쉽고 긴 허용 목록에도 잘 대응합니다.
  • 각 튜플은 열을 같은 순서로 나열해야 합니다.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));

빠른 확인

BETWEEN이 끝점을 처리하는 방식을 떠올려 보세요.

요약

핵심 내용:

  • BETWEEN a AND b는 양쪽 끝점을 모두 포함하며, 하한이 먼저 와야 합니다. 그렇지 않으면 행 0개를 얻습니다
  • 타임스탬프 범위에는 반열린 구간을 사용하세요. >= start AND < next_period
  • IN은 집합 소속을 깔끔하게 검사하며 NULL에도 안전합니다
  • 목록에 NULL이 하나라도 있는 NOT IN은 아무것도 반환하지 않으므로 NOT EXISTS로 다시 작성하세요

반복되는 핵심 주제는 다음과 같습니다. 필터가 완벽하게 실행되면서도 조용히 잘못된 행을 반환할 수 있습니다.

자주 묻는 질문

“BETWEEN, IN과 포함 경계” 강의는 무료인가요?

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

“BETWEEN, IN과 포함 경계”에서 뭘 배우나요?

경계의 예외 상황과 BETWEEN이 양 끝점을 처리하는 방식을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“BETWEEN, IN과 포함 경계” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. AND와 OR의 우선순위 및 괄호 사용
  2. BETWEEN, IN과 포함 경계
  3. LIKE, 와일드카드와 이스케이프
  4. 계산된 값으로 필터링하기
← SQL Interview Prep(으)로 돌아가기