2026 SQLD 필기 1과목 2장 4~5절 | NULL·본질식별자·인조식별자 — 핵심 이론
데이터위자드 ·
필기 · 핵심 이론
NULL은 빈 문자열이나 숫자 0과 같은 값이 아닙니다. 아직 모르거나 적용할 수 없는 값을 나타내며 비교와 집계에서 별도 규칙을 따릅니다. 식별자 역시 자동증가 번호만 붙인다고 업무 중복이 모두 해결되는 것은 아닙니다.
NULL과 3값 논리 · 집계 함수의 NULL 처리 · NOT IN과 NULL 함정 · 본질식별자와 인조식별자 · 키 선택과 이력 보존
1. NULL과 3값 논리
SQL의 조건은 TRUE·FALSE·UNKNOWN으로 판단됩니다. 값이 NULL이면 =10이나 <>10의 결과가 보통 UNKNOWN입니다. WHERE는 TRUE인 행만 통과시키므로 둘 다 NULL 행을 선택하지 않습니다. NULL 여부는 IS NULL 또는 IS NOT NULL로 검사합니다.
NULL= NULL도 참이 아닙니다. 두 값이 모두 알려지지 않았다는 사실만으로 동일한 값이라고 확정할 수 없기 때문입니다. NULL이 섞인 조건에서 NOT을 붙여도 UNKNOWN이 TRUE로 바뀌지 않는다는 점을 기억하세요.
NULL 비교는 = NULL 대신 IS NULL을 사용한다.
예제로 적용하기
점수 값이 NULL인 행에 WHERE 점수 <> 60을 적용하면?
풀이와 판단 과정
결론: 그 행은 선택되지 않는다.
NULL과의 일반 비교는 UNKNOWN이므로 WHERE를 통과하지 않습니다.
2. 집계 함수의 NULL 처리
COUNT(*)는 행 수를 세고 COUNT(컬럼)은 해당 값이 NULL이 아닌 행 수를 셉니다. SUM·AVG도 일반적으로 NULL을 제외합니다. 평균에서 NULL을 제외하는 것과 0으로 치환한 뒤 평균을 내는 것은 분모가 달라 결과가 다릅니다.
점수 10,NULL,20이면 AVG(점수)=15이고 AVG(COALESCE(점수,0))=10입니다. 결측을 실제 0점으로 볼 수 있는지 업무 의미를 먼저 정해야 합니다. 보기에서 합계는 같아도 평균이 달라지는 함정을 자주 만납니다.
AVG는 NULL을 제외한 값의 개수로 나눈다.
예제로 적용하기
금액이 10,NULL,20인 3행에서 COUNT(*), COUNT(금액), AVG(금액)은?
풀이와 판단 과정
결론: 3, 2, 15
전체 행은 3개, 금액이 존재하는 행은 2개이며 평균은 (10+20)/2=15입니다.
3. NOT IN과 NULL 함정
NOT IN의 비교 목록에 NULL이 있으면 예상과 다른 결과가 나올 수 있습니다. x NOT IN (1,NULL)은 x<>1 AND x<>NULL과 연결되어 UNKNOWN이 남습니다. 2를 넣어도 TRUE AND UNKNOWN이므로 WHERE를 통과하지 않습니다.
제외 대상에 결측이 존재할 수 있으면 NOT EXISTS로 상관 조건을 명확히 쓰거나 서브쿼리에서 NULL을 제외하는 방법을 검토합니다. NULL 때문에 생긴 문제를 단순히 DISTINCT로 해결할 수는 없습니다.
NOT IN의 비교 집합에 NULL이 있으면 UNKNOWN으로 인해 행이 제외될 수 있다.
예제로 적용하기
WHERE 2 NOT IN (1, NULL)의 판정은?
풀이와 판단 과정
결론: UNKNOWN이므로 선택되지 않는다.
2<>1은 TRUE지만 2<>NULL은 UNKNOWN입니다. AND 결과가 UNKNOWN이므로 WHERE에서 제외됩니다.
4. 본질식별자와 인조식별자
본질식별자는 업무상 본래 의미를 가진 식별자이고 인조식별자는 시스템이 식별을 위해 부여한 번호입니다. 주문번호의 성격은 업무에서 원래 쓰던 번호인지 설계에서 만든 번호인지에 따라 판단해야 합니다. 단순히 숫자냐 문자열이냐로 구분하지 않습니다.
인조키는 참조를 간단히 하고 긴 복합키 전파를 줄일 수 있지만 업무 중복 검증을 대신하지 않습니다. 수강신청 ID가 각각 달라도 같은 학생이 같은 학기에 같은 과목을 두 번 신청하는 것이 금지라면 별도 UNIQUE가 필요합니다.
인조키를 두어도 업무상 유일성 제약을 별도로 정의할 수 있다.
예제로 적용하기
수강신청에 자동 ID를 추가했다. 동일 학생·과목·학기 중복을 막으려면?
풀이와 판단 과정
결론: 학생번호·과목번호·학기의 UNIQUE 제약을 추가한다.
자동 ID는 각 행을 구분하지만 업무상 중복 조합까지 차단하지는 않습니다.
5. 키 선택과 이력 보존
업무키가 바뀔 수 있거나 길면 인조키의 장점이 커집니다. 반대로 인조키만 보고 업무 의미를 알기 어려워 추가 조인이 늘어날 수도 있습니다. 키 안정성·업무 유일성·참조 비용을 함께 비교해야 합니다.
삭제 후 재등록을 새 행으로 관리하는지, 같은 대상의 상태 변경으로 보는지도 모델에 영향을 줍니다. 이전 이력을 참조하는 데이터가 있다면 표시 이름이나 변경 가능한 코드만을 연결 기준으로 삼지 않도록 주의합니다.
키를 고를 때 값의 안정성과 업무 중복 규칙을 함께 고려한다.
예제로 적용하기
거래처의 표시 이름은 자주 바뀌고 동명이인도 있다. 안정적인 참조 기준은?
풀이와 판단 과정
결론: 변하지 않는 거래처 식별자
안정적인 식별자로 참조하고 표시 이름은 속성으로 관리해야 이름 변경과 중복을 처리하기 쉽습니다.
한눈에 비교하기
| 표현 | 의미 | 주의점 |
|---|---|---|
| COUNT(*) | 전체 행 수 | NULL 컬럼이 있어도 행을 센다 |
| COUNT(x) | x가 존재하는 행 수 | NULL 제외 |
| AVG(x) | NULL 제외 평균 | 0 치환 시 분모 변화 |
| 인조키 | 시스템 식별 번호 | 업무 UNIQUE를 별도로 검토 |
순서대로 풀어 보는 예제
금액 10,NULL,20을 저장한 거래 3건을 집계합니다. COUNT(*)=3, COUNT(금액)=2, SUM(금액)=30, AVG(금액)=15입니다. NULL을 미입력으로 이해하면 15가 자연스럽고, 미입력을 실제 0원으로 처리한다는 업무 규칙이 있으면 COALESCE 후 평균 10을 얻습니다.
거래 ID가 모두 다르다는 사실과 동일 주문 중복 결제가 없다는 사실은 다릅니다. 업무 고유 주문번호에 대한 중복 제약과 안정적인 거래 식별자를 함께 설계하는 이유입니다.
헷갈리는 문장 바로잡기
NULL과 3값 논리
잘못된 판단 NULL = NULL은 항상 TRUE다.
올바른 판단: NULL 비교는 = NULL 대신 IS NULL을 사용한다.
집계 함수의 NULL 처리
잘못된 판단 COUNT(*)는 NULL이 있는 행을 모두 제외한다.
올바른 판단: AVG는 NULL을 제외한 값의 개수로 나눈다.
NOT IN과 NULL 함정
잘못된 판단 NOT IN은 NULL을 언제나 자동 무시한다.
올바른 판단: NOT IN의 비교 집합에 NULL이 있으면 UNKNOWN으로 인해 행이 제외될 수 있다.
본질식별자와 인조식별자
잘못된 판단 인조키가 있으면 업무 중복은 자동으로 모두 차단된다.
올바른 판단: 인조키를 두어도 업무상 유일성 제약을 별도로 정의할 수 있다.
키 선택과 이력 보존
잘못된 판단 짧은 키면 업무 의미와 무관하게 언제나 최선이다.
올바른 판단: 키를 고를 때 값의 안정성과 업무 중복 규칙을 함께 고려한다.
이론을 정리했다면 같은 절의 객관식 문제에서 조건과 예외를 확인하세요. 정답을 고른 뒤에는 틀린 선택지가 왜 성립하지 않는지도 설명해 보세요.
핵심 개념 확인 — 객관식 5문제
설명을 읽은 뒤 아래 다섯 문항을 풀어 보세요. 정답을 고르고 틀린 선택지의 오류도 설명할 수 있으면 이 단원의 기준을 이해한 것입니다.
문제 1
NULL·본질식별자·인조식별자에서 NULL과 3값 논리에 대한 설명으로 옳은 것은?
- ① NULL = NULL은 항상 TRUE다.
- ② NULL 비교는 = NULL 대신 IS NULL을 사용한다.
- ③ NOT UNKNOWN은 TRUE다.
- ④ NULL은 언제나 숫자 0이다.
정답과 해설 보기
정답 ②
SQL의 조건은 TRUE·FALSE·UNKNOWN으로 판단됩니다. 값이 NULL이면 =10이나 <>10의 결과가 보통 UNKNOWN입니다. WHERE는 TRUE인 행만 통과시키므로 둘 다 NULL 행을 선택하지 않습니다. NULL 여부는 IS NULL 또는 IS NOT NULL로 검사합니다. NULL= NULL도 참이 아닙니다. 두 값이 모두 알려지지 않았다는 사실만으로 동일한 값이라고 확정할 수 없기 때문입니다. NULL이 섞인 조건에서 NOT을 붙여도 UNKNOWN이 TRUE로 바뀌지 않는다는 점을 기억하세요.
NULL 비교는 = NULL 대신 IS NULL을 사용한다.
문제 2
NULL·본질식별자·인조식별자에서 집계 함수의 NULL 처리에 대한 설명으로 옳은 것은?
- ① AVG는 NULL을 제외한 값의 개수로 나눈다.
- ② COUNT(컬럼)은 항상 COUNT(*)와 같다.
- ③ AVG는 NULL을 항상 0으로 넣는다.
- ④ COUNT(*)는 NULL이 있는 행을 모두 제외한다.
정답과 해설 보기
정답 ①
COUNT(*)는 행 수를 세고 COUNT(컬럼)은 해당 값이 NULL이 아닌 행 수를 셉니다. SUM·AVG도 일반적으로 NULL을 제외합니다. 평균에서 NULL을 제외하는 것과 0으로 치환한 뒤 평균을 내는 것은 분모가 달라 결과가 다릅니다. 점수 10,NULL,20이면 AVG(점수)=15이고 AVG(COALESCE(점수,0))=10입니다. 결측을 실제 0점으로 볼 수 있는지 업무 의미를 먼저 정해야 합니다. 보기에서 합계는 같아도 평균이 달라지는 함정을 자주 만납니다.
AVG는 NULL을 제외한 값의 개수로 나눈다.
문제 3
NULL·본질식별자·인조식별자에서 NOT IN과 NULL 함정에 대한 설명으로 옳은 것은?
- ① DISTINCT를 쓰면 모든 NULL 비교가 TRUE가 된다.
- ② NOT IN의 비교 집합에 NULL이 있으면 UNKNOWN으로 인해 행이 제외될 수 있다.
- ③ NOT IN은 NULL을 언제나 자동 무시한다.
- ④ NOT EXISTS는 반드시 NULL과 같은 결과다.
정답과 해설 보기
정답 ②
NOT IN의 비교 목록에 NULL이 있으면 예상과 다른 결과가 나올 수 있습니다. x NOT IN (1,NULL)은 x<>1 AND x<>NULL과 연결되어 UNKNOWN이 남습니다. 2를 넣어도 TRUE AND UNKNOWN이므로 WHERE를 통과하지 않습니다. 제외 대상에 결측이 존재할 수 있으면 NOT EXISTS로 상관 조건을 명확히 쓰거나 서브쿼리에서 NULL을 제외하는 방법을 검토합니다. NULL 때문에 생긴 문제를 단순히 DISTINCT로 해결할 수는 없습니다.
NOT IN의 비교 집합에 NULL이 있으면 UNKNOWN으로 인해 행이 제외될 수 있다.
문제 4
NULL·본질식별자·인조식별자에서 본질식별자와 인조식별자에 대한 설명으로 옳은 것은?
- ① 인조키를 두어도 업무상 유일성 제약을 별도로 정의할 수 있다.
- ② 문자열은 인조식별자가 될 수 없다.
- ③ 인조키가 있으면 업무 중복은 자동으로 모두 차단된다.
- ④ 본질식별자는 항상 단일 숫자다.
정답과 해설 보기
정답 ①
본질식별자는 업무상 본래 의미를 가진 식별자이고 인조식별자는 시스템이 식별을 위해 부여한 번호입니다. 주문번호의 성격은 업무에서 원래 쓰던 번호인지 설계에서 만든 번호인지에 따라 판단해야 합니다. 단순히 숫자냐 문자열이냐로 구분하지 않습니다. 인조키는 참조를 간단히 하고 긴 복합키 전파를 줄일 수 있지만 업무 중복 검증을 대신하지 않습니다. 수강신청 ID가 각각 달라도 같은 학생이 같은 학기에 같은 과목을 두 번 신청하는 것이 금지라면 별도 UNIQUE가 필요합니다.
인조키를 두어도 업무상 유일성 제약을 별도로 정의할 수 있다.
문제 5
NULL·본질식별자·인조식별자에서 키 선택과 이력 보존에 대한 설명으로 옳은 것은?
- ① 짧은 키면 업무 의미와 무관하게 언제나 최선이다.
- ② 키를 고를 때 값의 안정성과 업무 중복 규칙을 함께 고려한다.
- ③ 업무키를 바꾸면 이전 이력은 항상 자동 복원된다.
- ④ 식별자 변경은 참조 데이터에 영향이 없다.
정답과 해설 보기
정답 ②
업무키가 바뀔 수 있거나 길면 인조키의 장점이 커집니다. 반대로 인조키만 보고 업무 의미를 알기 어려워 추가 조인이 늘어날 수도 있습니다. 키 안정성·업무 유일성·참조 비용을 함께 비교해야 합니다. 삭제 후 재등록을 새 행으로 관리하는지, 같은 대상의 상태 변경으로 보는지도 모델에 영향을 줍니다. 이전 이력을 참조하는 데이터가 있다면 표시 이름이나 변경 가능한 코드만을 연결 기준으로 삼지 않도록 주의합니다.
키를 고를 때 값의 안정성과 업무 중복 규칙을 함께 고려한다.
범위 확인
2026년 학습 범위를 기준으로 구성했습니다. 시험 시행기관의 자격 안내·출제 기준에서 과목과 변경 공지를 확인할 수 있습니다.
SQLD 전체 목차
과목별 이론
- 1과목 · 1장 1~3절 · 데이터 모델·엔터티·속성
- 1과목 · 1장 4~5절 · 관계·식별자와 카디널리티
- 1과목 · 2장 1~3절 · 정규화·조인·트랜잭션 모델
- 1과목 · 2장 4~5절 · NULL·본질식별자·인조식별자
- 2과목 · 1장 1~2절 · 관계형 DB와 SELECT·DISTINCT
- 2과목 · 1장 3절 · 문자·숫자 함수와 CASE
- 2과목 · 1장 4절 · WHERE·날짜 범위·연산자 우선순위
- 2과목 · 1장 5~6절 · 집계·GROUP BY·HAVING·ORDER BY
- 2과목 · 1장 7~8절 · INNER·OUTER·표준 조인
- 2과목 · 2장 1절 · 서브쿼리·EXISTS·스칼라 서브쿼리
- 2과목 · 2장 2~3절 · 집합 연산·ROLLUP·CUBE·GROUPING
- 2과목 · 2장 4~5절 · 윈도우 함수·순위·Top N
- 2과목 · 2장 6~8절 · 계층형 질의·셀프 조인·PIVOT·정규표현식
- 2과목 · 3장 1~2절 · DML·TCL과 트랜잭션
- 2과목 · 3장 3~4절 · DDL·DCL·제약조건·권한
단원별 객관식
- 1과목 · 1장 1~3절 · 데이터 모델·엔터티·속성
- 1과목 · 1장 4~5절 · 관계·식별자와 카디널리티
- 1과목 · 2장 1~3절 · 정규화·조인·트랜잭션 모델
- 1과목 · 2장 4~5절 · NULL·본질식별자·인조식별자
- 2과목 · 1장 1~2절 · 관계형 DB와 SELECT·DISTINCT
- 2과목 · 1장 3절 · 문자·숫자 함수와 CASE
- 2과목 · 1장 4절 · WHERE·날짜 범위·연산자 우선순위
- 2과목 · 1장 5~6절 · 집계·GROUP BY·HAVING·ORDER BY
- 2과목 · 1장 7~8절 · INNER·OUTER·표준 조인
- 2과목 · 2장 1절 · 서브쿼리·EXISTS·스칼라 서브쿼리
- 2과목 · 2장 2~3절 · 집합 연산·ROLLUP·CUBE·GROUPING
- 2과목 · 2장 4~5절 · 윈도우 함수·순위·Top N
- 2과목 · 2장 6~8절 · 계층형 질의·셀프 조인·PIVOT·정규표현식
- 2과목 · 3장 1~2절 · DML·TCL과 트랜잭션
- 2과목 · 3장 3~4절 · DDL·DCL·제약조건·권한
실습
- SQL 학습 실습 1 · 6작업 · SELECT·조건·정렬
- SQL 학습 실습 2 · 6작업 · NULL·COUNT·평균
- SQL 학습 실습 3 · 6작업 · 날짜 범위·문자 조건
- SQL 학습 실습 4 · 6작업 · GROUP BY·HAVING·조건부 합계
- SQL 학습 실습 5 · 6작업 · 조인·행 수·미주문 고객
- SQL 학습 실습 6 · 6작업 · 서브쿼리·EXISTS·NOT EXISTS
- SQL 학습 실습 7 · 6작업 · 순위·동률·고객별 Top N
- SQL 학습 실습 8 · 6작업 · 집합 연산·조건부 피벗·전체 검산