[프로그래머스/MySQL] SQL 고득점 Kit 총정리 - IS NULL

박찬병·2024년 10월 31일

Problem Solving

목록 보기
21/48

너무 간단한 문제는 제외하고 작성하려고 했는데, 문제 수가 적기도 해서 오랜만에 복습하는 느낌으로 다 적어보았다.


경기도에 위치한 식품창고 목록 출력하기

테이블에는 주소, 냉동시설 여부를 포함한 창고의 정보가 주어진다.
경기도에 위치한 창고의 정보를 구하여라.
이때 냉동시설 여부가 NULL이라면 'N'으로 출력하고, 창고 ID의 오름차순으로 정렬하여 나타낸다.

select WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, ifnull(FREEZER_YN, 'N') as FREEZER_YN
from FOOD_WAREHOUSE
where ADDRESS like '경기%'
order by WAREHOUSE_ID asc
  • 값이 NULL일 때 다른 값으로 출력하고자 한다면 ifnull(열, 출력할 값)을 사용하면 된다.
  • 문자열을 비교할 때는 like를 사용한다. 이때 %를 사용하면 임의 길이의 문자열을 대체하는 효과를 얻는다.

이름이 없는 동물의 아이디

테이블에는 동물의 ID, 이름이 포함된 정보가 주어진다.
이름이 없는 동물의 ID를 구하여라.
이때 ID의 오름차순으로 정렬하여 나타낸다.

select ANIMAL_ID
from ANIMAL_INS
where NAME is null
order by ANIMAL_ID asc
  • NULL인 값을 찾을 때는 is null을 사용한다.

이름이 있는 동물의 아이디

테이블에는 동물의 ID, 이름이 포함된 정보가 주어진다.
이름이 있는 동물의 ID를 구하여라.
이때 ID의 오름차순으로 정렬하여 나타낸다.

select ANIMAL_ID
from ANIMAL_INS
where NAME is not null
order by ANIMAL_ID asc
  • NULL이 아닌 값을 찾을 때는 is not null을 사용한다.

NULL 처리하기

테이블에는 동물의 이름이 포함된 정보가 주어진다.
이름이 NULL인 경우에는 "No name"으로 나타내도록 설정하여 동물의 정보를 구하여라.
ID 순서로 정렬하여 나타낸다.

select ANIMAL_TYPE, ifnull(NAME, "No name") as NAME, SEX_UPON_INTAKE
from ANIMAL_INS
order by ANIMAL_ID
  • ifnull(열, 출력할 값)을 사용하는 또 다른 문제다. select에서 이런 함수를 사용할 때는 alias를 꼭 해야한다는 점을 기억해야 한다.

나이 정보가 없는 회원 수 구하기

테이블에는 나이를 포함한 쇼핑몰 회원 정보가 주어진다.
나이 정보가 없는 회원의 수를 구하여라.

select count(*) as USERS
from USER_INFO
where AGE is null
  • count(*)를 사용하면 튜플의 수를 얻을 수 있다. NULL도 포함해서 숫자를 센다는 특징이 있는데, 여기서는 다른 열도 있기 때문에 이 예시에 해당되지는 않는다.

ROOT 아이템 구하기

아이템의 정보를 담은 테이블과 아이템 간의 부모 자식 관계를 담은 테이블이 주어진다.
부모 아이템이 없는 ROOT 아이템을 구하여라.
아이템 ID의 오름차순으로 정렬하여 나타낸다.

select ITEM_ID, ITEM_NAME
from ITEM_INFO join ITEM_TREE using(ITEM_ID)
where PARENT_ITEM_ID is null
order by ITEM_ID asc
  • 문제 이해가 중요한 문제로, 부모 아이템이 없는 ROOT 아이템은 아이템 관계 테이블에서 부모 아이템 ID가 NULL이 된다는 점을 파악하면 문제를 해결할 수 있다.

업그레이드 할 수 없는 아이템 구하기

아이템의 정보를 담은 테이블과 아이템 간의 부모 자식 관계를 담은 테이블이 주어진다.
더 이상 업그레이드 할 수 없는 아이템을 구하여라.
아이템 ID의 내림차순으로 정렬하여 나타낸다.

select ITEM_ID, ITEM_NAME, RARITY
from ITEM_INFO join ITEM_TREE using(ITEM_ID)
where ITEM_ID not in (select PARENT_ITEM_ID
                      from ITEM_TREE
                      where PARENT_ITEM_ID is not null)
order by ITEM_ID desc
  • 먼저 문제 이해가 필요하다. 더 이상 업그레이드 할 수 없는 아이템은 자식 아이템이 없다는 것을 뜻한다.
  • 자식 아이템이 없다는 것은 자신을 부모 아이템으로 지정한 아이템이 없다는 뜻이므로, 부모 아이템의 리스트에 포함되지 않는 아이템을 찾는 방식으로 문제를 해결할 수 있다.

잡은 물고기의 평균 길이 구하기

테이블에는 길이를 포함한 물고기의 정보가 주어진다.
잡은 물고기의 평균 길이를 구하여라.
이때 평균 길이는 소수점 셋째자리에서 반올림하며, 10cm 이하의 물고기는 10cm로 취급해서 평균을 구한다.

select round(avg(LENGTH), 2) as AVERAGE_LENGTH
from (select ifnull(LENGTH, 10) as LENGTH
      from FISH_INFO) A
  • 이 문제에서 10cm 이하의 물고기는 길이가 NULL로 설정되어 있으므로 ifnull을 사용해서 값을 대체할 수 있다.
  • 평균은 avg를 이용해 얻을 수 있으며, 반올림은 round(값, 나타낼 소수점 수)를 이용하여 수행할 수 있다.

0개의 댓글