문제에서는 도서 대여가 없는 고객에 "★관리대상고객"으로 변경할 것을 명시하였는데
not in (select 고객코드 from 도서대여)까지는 이해가 됩니다. 왜냐하면 <고객> 테이블에 없는 고객코드라고 말씀하셨으니까요.
그런데 왜 그 뒤에 where 대여일자 between #2023-05-01# and #2023-06-30#)이 들어가는지 모르겠습니다.
between #2023-05-01# and #2023-06-30#의 not in이면 이 사이가 기간이 아닌 다른 기간이 출력되지 않나요?
안녕하세요.
핵심은 NOT IN이 날짜를 부정하는 것이 아니라, 하위 쿼리가 만들어 낸 ‘고객코드 목록’을 부정한다는 점입니다.
하위 쿼리를 먼저 따로 보면 이해가 쉽습니다.
SELECT 고객코드
FROM 도서대여
WHERE 대여일자 Between #2023-05-01# And #2023-06-30#이 쿼리는
2023년 5월 1일~6월 30일 사이에 도서를 대여한 고객코드 목록
을 만듭니다.
예를 들어 결과가
C001
C003
C005라면, 바깥쪽에서
고객코드 Not In
(
SELECT 고객코드
FROM 도서대여
WHERE 대여일자 Between #2023-05-01# And #2023-06-30#
)이라고 했을 때 의미는
고객 테이블의 고객 중에서
5/1~6/30 사이에 대여한 고객 C001, C003, C005를 제외하라
입니다.
따라서 남는 고객은 바로 그 기간 동안 대여가 없었던 고객입니다.
예를 들어 고객 테이블이
C001
C002
C003
C004
C005이고, 5/1~6/30에 대여한 사람이
C001
C003
C005라면 Not In 결과는
C002
C004가 됩니다.
즉 질문하신 것처럼
“Between 기간의 NOT IN이면 그 기간이 아닌 다른 날짜가 나오는 것 아닌가요?”
가 아닙니다.
NOT IN이 적용되는 대상은 대여일자가 아니라 고객코드입니다.
구조를 나누면 다음과 같습니다.
WHERE 대여일자 Between ...
→ 지정 기간에 대여한 고객코드를 찾는다.
Not In (...)
→ 그 고객코드들을 제외한다.그래서 전체 의미는
지정 기간에 대여한 고객코드 목록
↓
그 목록에 없는 고객
↓
최근 대여가 없는 고객이 됩니다.
오히려 날짜 조건을 빼서
Not In (SELECT 고객코드 FROM 도서대여)만 사용하면 의미가 달라집니다.
이 경우에는 과거 어느 시점이든 한 번이라도 도서를 대여한 고객을 전부 제외해 버립니다. 그러면 “5월 1일~6월 30일에 대여가 없는 고객”이 아니라 지금까지 한 번도 도서를 대여한 적이 없는 고객만 남게 됩니다.
따라서 이 문제에서는 반드시 하위 쿼리 안에
WHERE 대여일자 Between #2023-05-01# And #2023-06-30#가 들어가야 문제에서 말한 ‘최근에 도서 대여가 없는 고객’을 정확하게 찾을 수 있습니다.
즐거운 하루 되세요.
-
관리자2026-09-22 09:10:56
안녕하세요.
핵심은
NOT IN이 날짜를 부정하는 것이 아니라, 하위 쿼리가 만들어 낸 ‘고객코드 목록’을 부정한다는 점입니다.하위 쿼리를 먼저 따로 보면 이해가 쉽습니다.
SELECT 고객코드 FROM 도서대여 WHERE 대여일자 Between #2023-05-01# And #2023-06-30#이 쿼리는
2023년 5월 1일~6월 30일 사이에 도서를 대여한 고객코드 목록
을 만듭니다.
예를 들어 결과가
C001 C003 C005라면, 바깥쪽에서
고객코드 Not In ( SELECT 고객코드 FROM 도서대여 WHERE 대여일자 Between #2023-05-01# And #2023-06-30# )이라고 했을 때 의미는
고객 테이블의 고객 중에서
5/1~6/30 사이에 대여한 고객 C001, C003, C005를 제외하라입니다.
따라서 남는 고객은 바로 그 기간 동안 대여가 없었던 고객입니다.
예를 들어 고객 테이블이
C001 C002 C003 C004 C005이고, 5/1~6/30에 대여한 사람이
C001 C003 C005라면
Not In결과는C002 C004가 됩니다.
즉 질문하신 것처럼
“Between 기간의 NOT IN이면 그 기간이 아닌 다른 날짜가 나오는 것 아닌가요?”
가 아닙니다.
NOT IN이 적용되는 대상은 대여일자가 아니라 고객코드입니다.구조를 나누면 다음과 같습니다.
WHERE 대여일자 Between ... → 지정 기간에 대여한 고객코드를 찾는다. Not In (...) → 그 고객코드들을 제외한다.그래서 전체 의미는
지정 기간에 대여한 고객코드 목록 ↓ 그 목록에 없는 고객 ↓ 최근 대여가 없는 고객이 됩니다.
오히려 날짜 조건을 빼서
Not In (SELECT 고객코드 FROM 도서대여)만 사용하면 의미가 달라집니다.
이 경우에는 과거 어느 시점이든 한 번이라도 도서를 대여한 고객을 전부 제외해 버립니다. 그러면 “5월 1일~6월 30일에 대여가 없는 고객”이 아니라 지금까지 한 번도 도서를 대여한 적이 없는 고객만 남게 됩니다.
따라서 이 문제에서는 반드시 하위 쿼리 안에
WHERE 대여일자 Between #2023-05-01# And #2023-06-30#가 들어가야 문제에서 말한 ‘최근에 도서 대여가 없는 고객’을 정확하게 찾을 수 있습니다.
즐거운 하루 되세요.