본문 바로가기
SQL 문제 풀기/2. SQLD 기출 : 2024.3.01~2024.4.25

<SQLD 40> 서브쿼리에 대한 기출문제

by HYEHYE_SON 2024. 4. 9.
728x90

매일 SQLD 기출 문제 풀기 챌린지


 


문제 40.

아래의 테이블들에 대해서 SQL문을 수행하였을 때의 결과 값은?  

 

[ TEST40_1 ]

COL
1
2
3
4

 

[ TEST40_2 ]

COL
2
NULL

 

[ SQL ]

SELECT COUNT(*)
    FROM TEST40_1 A
    WHERE A.COL NOT IN (SELECT COL FROM TEST40_2);

 
①   0
②   1
③   3
④   6


해설해보기

제시된 쿼리는 TEST40_1 테이블에서, TEST40_2 테이블의 COL 컬럼에 없는 COL 값을 가진 행의 수를 세는 쿼리입니다.
■ NOT IN
주어진 리스트에 없는 값을 찾습니다. 

 

주의깊게 봐야할 것은 

TEST40_2 테이블의 COL 컬럼에 NULL 값이 존재한다는 점 입니다. 

 

NULL은 비교연산을 수행할 때 "알 수 없는 값"으로 처리 됩니다.

 

따라서 제시된 쿼리는 어떠한 값도 COUNT 할 수 없게 됩니다.

왜냐하면 TEST40_2 테이블에 NULL 값이 포함되어 있어 

NOT IN 조건을 만족하는지 확실하게 판단할 수 없기 때문입니다.

 

 

일반적으로 COUNT() 함수를 Asterisk(*) 와 함께 사용하면,

모든 행을 카운트하기 때문에 NULL도 세게 됩니다. 

그러나 이런 경우에는 아예 COUNT 할 수 없습니다.

 

단, COUNT 함수의 특징으로 이런 경우에도 에러를 반환하지 않고 무조건 결과를 출력합니다.

그래서 0을 반환하는 것 입니다. 


직접 실행해보기

SELECT COUNT(*)
    FROM TEST40_1 A
    WHERE A.COL NOT IN (SELECT COL FROM TEST40_2);


관련 스크립트

# TEST40_1 테이블

CREATE TABLE TEST40_1 (
    COL NUMBER
);


INSERT INTO TEST40_1 (COL) VALUES (1);
INSERT INTO TEST40_1 (COL) VALUES (2);
INSERT INTO TEST40_1 (COL) VALUES (3);
INSERT INTO TEST40_1 (COL) VALUES (4);


# TEST40_1 테이블

CREATE TABLE TEST40_2 (
    COL NUMBER
);

INSERT INTO TEST40_2 (COL) VALUES (2);
INSERT INTO TEST40_2 (COL) VALUES (NULL);

 
 
 
 

반응형