DB, SQL

[프로그래머스] SQL NULL 처리하기

RuBPCase 2022. 2. 4. 11:13
728x90

원본 링크

https://programmers.co.kr/learn/courses/30/parts/17045

Intro

이번 포스트에선 SQL에서 NULL을 다루는 방법을 배우려 한다.
총 3개의 대표 문제가 있으며, 세 문제 모두 그렇게 까다롭지는 않다.
약간의 메소드만 배우면 충분히 구현할 수 있을 수준의 난이도이다.

공통 조건

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

문제 1 (이름이 없는 동물의 아이디)

동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A368930 Dog 2014-06-08 13:20:00 Normal NULL Spayed Female
A524634 Dog 2015-01-02 18:54:00 Normal *Belle Intact Female
A465637 Dog 2017-06-04 08:17:00 Injured *Commander Neutered Male

이름이 없는 채로 들어온 동물의 ID는 A368930입니다. 따라서 SQL을 실행하면 다음과 같이 출력되어야 합니다.

ANIMAL_ID
A368930

나만의 풀이 1

주어진 테이블에서 ANIMAL_ID를 출력하면 된다.
이때, NAMENULL인 경우만을 선택하면 된다.
따라서 WHERE절에 NAME IS NULL을 추가해주면 된다.

고로 최종 코드는 다음과 같다.

SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID

문제 2 (이름이 있는 동물의 아이디)

동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A434523 Cat 2015-11-20 14:18:00 Normal NULL Spayed Female
A562649 Dog 2014-03-20 18:06:00 Sick NULL Spayed Female
A524634 Dog 2015-01-02 18:54:00 Normal *Belle Intact Female
A465637 Dog 2017-06-04 08:17:00 Injured *Commander Neutered Male

이름이 있는 동물의 ID는 A524634와 A465637입니다. 따라서 SQL을 실행하면 다음과 같이 출력되어야 합니다.

ANIMAL_ID
A465637
A524634

나만의 풀이 2

앞선 문제 1과 아주 유사하나, NULL이 아닌 경우로 바꿔주기만 하면 된다.
따라서 IS NULL 대신 IS NOT NULL로 코드를 추가하면 된다.

SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID

문제 3 (NULL 처리하기)

입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A350276 Cat 2017-08-13 13:50:00 Normal Jewel Spayed Female
A350375 Cat 2017-03-06 15:01:00 Normal Meo Neutered Male
A368930 Dog 2014-06-08 13:20:00 Normal NULL Spayed Female

마지막 줄의 개는 이름이 없기 때문에, 이 개의 이름은 "No name"으로 표시합니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_TYPE NAME SEX_UPON_INTAKE
Cat Jewel Spayed Female
Cat Meo Neutered Male
Dog No name Spayed Female

나만의 풀이 3

이 문제는 앞선 문제와는 달리 WHERE절에서 NULL을 처리하지 않는다는 차이가 있다.
따라서 속성을 SELECT할 때, NAME 속성을 조정하는 형태로 코드를 짜야 한다.
이때, 필요한 키워드가 바로 IFNULL()이다.
IFNULL()은 특정 속성에서 NULL값이 있는지를 판별하는 역할을 한다.
형태는 IFNULL(속성명, NULL일 경우 표시할 값)의 형태로 쓴다.

주어진 문제에선 NAME 속성이 널값인 경우 'No name'을 출력하도록 조건이 되어있다.
따라서 SELECT ... NAME ... 대신, SELECT ... IFNULL(NAME, 'No name') ...을 쓰면 된다.

최종 코드는 아래와 같다.

SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name'), SEX_UPON_INTAKE FROM ANIMAL_INS
ORDER BY ANIMAL_ID

문제에서 컬럼명을 일치할 필요가 없다고 해서 그냥 IFNULL... 그대로 사용했다.
하지만 만일 문제처럼 만들고 싶다면 그 옆에 AS 'NAME'이라고 추가만 해주면 된다.

마치면서

이번 챕터에서 나온 문제들은 쉬운 편에 속했다.
기본적인 SELECT ~ WHERE ~ ORDER BY ~ 구문만 알면 금방 응용해서 풀 수 있는 수준이었다.
이제 다음 챕터에서 다룰 내용이 바로 JOIN인데, 여기가 가장 큰 고비라고 보면 된다.
이와 관련된 내용 정리는 차후 포스트에서 할 예정이다.

728x90