KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | SQL CODEKATA
중복 제거하기
🏷 Topic : COUNT DISTINCT SUBQUERY INLINE VIEWS
문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_INS 테이블 구조는 다음과 같으며,ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
| NAME | TYPE | NULLABLE |
|---|---|---|
| ANIMAL_ID | VARCHAR(N) | FALSE |
| ANIMAL_TYPE | VARCHAR(N) | FALSE |
| DATETIME | DATETIME | FALSE |
| INTAKE_CONDITION | VARCHAR(N) | FALSE |
| NAME | VARCHAR(N) | TRUE |
| SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요.
이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
| ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
|---|---|---|---|---|---|
| A562649 | Dog | 2014-03-20 18:06:00 | Sick | NULL | Spayed Female |
| A412626 | Dog | 2016-03-13 11:17:00 | Normal | *Sam | Neutered Male |
| A563492 | Dog | 2014-10-24 14:45:00 | Normal | *Sam | Neutered Male |
| A513956 | Dog | 2017-06-14 11:54:00 | Normal | *Sweetie | Spayed Female |
보호소에 들어온 동물의 이름은 NULL(없음), *Sam, *Sam, *Sweetie입니다.
이 중 NULL과 중복되는 이름을 고려하면, 보호소에 들어온 동물 이름의 수는 2입니다.
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
| count |
|---|
| 2 |
※ 컬럼 이름(위 예제에서는 count)은 일치하지 않아도 됩니다.
본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.
✔ (Oracle & MySQL) Solution with COUNT & DISTINCT
SELECT COUNT(DISTINCT NAME) COUNT
FROM ANIMAL_INS;
실행 결과

✔ Solution with Subqueries(Inline Views)
SELECT COUNT(*)
FROM (SELECT DISTINCT NAME
FROM ANIMAL_INS
WHERE NAME IS NOT NULL);
💥 어떤 문제가 있었고, 나는 어떤 시도를 했는지💦 & 어떻게 해결했는지👍
COUNT함수 사용법 잊어버림.💥
DISTINCT 사용법 잊어버림 : 속성 앞에 쓰는 건지 뒤에 쓰는 건지 기억이 잘 안 났음. 💥
그래서 처음엔 감으로 코드를 씀💦
SELECT COUNT(*)
FROM (SELECT DISTINCT NAME
FROM ANIMAL_INS
WHERE NAME IS NOT NULL);
틀린 부분이 없는 것 같은데 실패라고 뜸.😥
근데 뭔가 복잡해 보이는...
훨씬 간단하게 쓸 수 있을 것만 같은 느낌이 들어서 구글링 시도 🔎
중복 제거, count에 대해 구글링하다가 바로 안나와서 그냥 다시 감으로 써 봄. 💦
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;🎉 드디어 정답!!🎉
그런데 아까 처음에 쓴 코드는 뭐가 틀린걸까? 하는 의문이 듦. 💥
다시 코드를 써서 제출해 봤는데 이것도 정답⁉🎉
정답 코드를 2개나 썼다.😃
-- 2024-06-16 MySQL로 문제 풀이 시도 및 쿼리 수정 --
MySQL 쿼리는 작성을 하지 않았어서 다시 문제를 풀어 보았다.
전에 쓴 코드를 보니 WHERE절에 NULL값을 제외하는 조건을 썼다.
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;
그런데 생각해보니 집계함수는 NULL을 무시하지 않았던가? 하는 생각이 들어서
COUNT와 DISTINCT를 사용한 쿼리에 WHERE절의 조건을 쓰지 않고 쿼리를 실행 해 보았다.
(별칭도 COUNT라고 줌.)
SELECT COUNT(DISTINCT NAME) COUNT
FROM ANIMAL_INS;
제출을 해 보니 정답이라고 뜬다.
집계함수는 NULL을 무시한다.
다시 한번 기억해 두어야 겠다.🤓
이 문제에서는 Oracle 쿼리와 MySQL 쿼리에 차이가 없이 모두 위의 코드로 원하는 결과를 조회할 수 있다.
💬 무엇을 새롭게 알았는지
DISTINCT 속성명COUNT(속성명)또는 COUNT(*)- FROM절 서브쿼리를 inline Views라고도 함.
- 서브 쿼리: 쿼리 안에 또 다른 쿼리가 하나 더 있는 것을 말함.
- (SELECT, WHERE, FROM절 서브쿼리가 가장 자주 쓰임)
- 집계함수는 NULL값을 무시한다.