정말 기본적인 문제지만 가끔 헷갈릴만한, 짚고 넘어가야할 문제인거 같아서 들고 왔어요
문제에서 요구하는 조건은
중복되지 않고 NULL이 아닌 이름의 갯수
너무 간단하잖아 ?
중복 안되니까 DISTINCT 갯수니까 COUNT 함수 사용해서 그냥 대충
SELECT DISTINCT COUNT(NAME)
FROM ANIMAL_INS
하면-- 땡 !
위 코드처럼 작성해서 틀리고 질문하시는 분들이 많았는데요,
왜 오답일까요?
문제에서는 서로 다른 이름 이라는 조건이 있었으니
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
과 같이 SQL문이 작성돼야해요(ALIAS는 생략하도록 할게요)
끝
이라고 하기엔 뭔가 찝찝하지 않나요?
저는 이 찝찝함에 대해 글을 쓰고자 해요
찝찝스들 목록
1. 왜 WHERE NAME IS NOT NULL 조건문은 쓰지 않는가?
2. 왜 1번 조건문을 쓰지 않았는데 정답 처리가 되는가? DISTINCT가 NULL값은 제외하나?
위 찝찝스들을 해결하기 위해서 SQL문을 바꿔가며 직접 데이터를 보면서 얘기해봅시다
SELECT COUNT(*)
FROM ANIMAL_INS
결과 : 100
SELECT DISTINCT NVL(NAME, '!!!!!여기 NULL값 있어유!!!!!!')
FROM ANIMAL_INS
위 결과를 보면 먼저 DISTINCT 는 중복되는 값을 제거하지만 NULL 값은 포함함을 알 수 있어요
따라서 2번의 DISTINCT가 NULL값을 제거한다는 가설은 거짓 !
다음으로,
SELECT COUNT(NAME)
FROM ANIMAL_INS
결과 : 99
위 결과는 COUNT(*)과 1개 데이터가 차이나는데 이 값이 바로 NULL 값임을 유추할 수 있죠(있던 값이 사라지지는 않을테니까요?)
이를 통해
COUNT() 함수 내 컬럼을 쓰면 NULL 값은 제외하고 계산한다
는 결론을 내릴 수 있어요
다시
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
위 SQL문을 보면
- DISTINCT로 중복된 이름을 제거하고,
- COUNT내에 컬럼명이 위치함으로써 NULL값을 제외하고 계산하기에
WHERE 조건에 NAME IS NOT NULL을 사용하지 않아도 된다는 결론이 나와요
이제 진짜 안 헷갈리겠죠?!
진짜 끝