문제
두 테이블의 데이터가 아래와 같을 때 결과 값(반환된 행의 COL2 합)으로 옳은 것은?
| COL1 | COL2 |
|---|---|
| A | 10 |
| B | 20 |
| C | 30 |
| COL1 | COL2 |
|---|---|
| A | 20 |
| B | 20 |
| C | NULL |
① 0 ② 10 ③ 20 ④ 40
정답
2번
해설
다중 컬럼 NOT IN은 후보 행과의 행 단위 동등 비교의 OR를 부정한 것으로, 단일 컬럼과 동작이 다르다.
(A, 10): (C,NULL)과 비교 시 첫 컬럼 A=C가 FALSE이므로 'FALSE AND UNKNOWN = FALSE'로 확정 → 세 비교 모두 FALSE → NOT IN이 TRUE → 반환 (B, 20): (B,20)과 정확히 일치 → IN이 TRUE → 제외 (C, 30): (C,NULL)과 비교 시 C=C가 TRUE라서 'TRUE AND UNKNOWN = UNKNOWN' → NOT IN이 UNKNOWN → 제외
따라서 결과는 (A, 10) 한 건뿐이고 COL2 합은 10이다. 'NULL이 있으면 NOT IN은 무조건 0건'이라는 함정은 첫 컬럼이 일치하는 행에만 적용된다. 오답 풀이
①: 0은 '단일 컬럼 NOT IN + NULL은 항상 0건'이라는 함정을 다중 컬럼에 잘못 적용한 오답. 첫 컬럼이 불일치하는 (A,10)은 정상 반환된다. ③: 20은 (B,20)이 반환된다는 잘못된 가정의 값. (B,20)은 일치하여 제외된다. ④: 40은 (A,10)+(C,30) 두 행이 모두 반환된다는 가정의 값이나, (C,30)은 UNKNOWN으로 제외된다.