책 내용 질문하기
문제 4번에 1번에 왜 not in (select ~) 구문에 where 대여일자 가 들어가는지 질문드립니다.
도서
2026 시나공 컴퓨터활용능력1급 실기 기본서
페이지
928
조회수
57
작성일
2026-09-21
작성자
조*린
첨부파일

문제에서는 도서 대여가 없는 고객에 "★관리대상고객"으로 변경할 것을 명시하였는데


not in (select 고객코드 from 도서대여)까지는 이해가 됩니다. 왜냐하면 <고객> 테이블에 없는 고객코드라고 말씀하셨으니까요.

그런데 왜 그 뒤에 where 대여일자 between #2023-05-01# and #2023-06-30#)이 들어가는지 모르겠습니다.

between #2023-05-01# and #2023-06-30#의 not in이면 이 사이가 기간이 아닌 다른 기간이 출력되지 않나요?

답변
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#

가 들어가야 문제에서 말한 ‘최근에 도서 대여가 없는 고객’을 정확하게 찾을 수 있습니다.

즐거운 하루 되세요.

  • 관리자
    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#

    가 들어가야 문제에서 말한 ‘최근에 도서 대여가 없는 고객’을 정확하게 찾을 수 있습니다.

    즐거운 하루 되세요.

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.