Jay의 개발블로그

적다보면 언젠가 늘어있을 내 실력

Programming/SQL

프로그래머스 SQL 레벨 1 - 경기도에 위치한 식품창고 목록 출력하기

Jay_on_Day 2025. 7. 22. 00:28
반응형

 

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제의 출처는 위의 링크이다.

 

문제 설명


다음은 식품창고의 정보를 담은 FOOD_WAREHOUSE 테이블입니다. FOOD_WAREHOUSE 테이블은 다음과 같으며 WAREHOUSE_IDWAREHOUSE_NAMEADDRESSTLNOFREEZER_YN는 창고 ID, 창고 이름, 창고 주소, 전화번호, 냉동시설 여부를 의미합니다.

Column name Type Nullable
WAREHOUSE_ID VARCHAR(10) FALSE
WAREHOUSE_NAME VARCHAR(20) FALSE
ADDRESS VARCHAR(100) TRUE
TLNO VARCHAR(20) TRUE
FREEZER_YN VARCHAR(1) TRUE

 

문제


FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.

 

예시


 FOOD_WAREHOUSE 테이블이 다음과 같을 때

WAREHOUSE_ID WAREHOUSE_NAME ADDRESS TLNO FREEZER_YN
WH0001 창고_경기1 경기도 안산시 상록구
용담로 141
031-152-1332 Y
WH0002 창고_충북1 충청북도 진천군 진천읍 씨제이로 110 043-623-9900 Y
WH0003 창고_경기2 경기도 이천시 마장면 덕평로 811 031-221-7241 NULL
WH0004 창고_경기3 경기도 김포시 대곶면 율생중앙로205번길 031-671-1900 N
WH0005 창고_충남1 충청남도 천안시 동남구 광덕면 신덕리1길 9 041-876-5421 Y

 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

WAREHOUSE_ID WAREHOUSE_NAME ADDRESS TLNO FREEZER_YN
WH0001 창고_경기1 경기도 안산시 상록구 용담로 141 031-152-1332 Y
WH0003 창고_경기2 경기도 이천시 마장면 덕평로 811 031-221-7241 NULL
WH0004 창고_경기3 경기도 김포시 대곶면 율생중앙로205번길 031-671-1900 N

 

내가 작성한 코드


SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, coalesce(FREEZER_YN,'N')
FROM FOOD_WAREHOUSE 
WHERE ADDRESS like "경기도%"
order by WAREHOUSE_ID asc

이렇게 풀어낸 과정과 이유


우리가 이 문제를 풀면서 다음 3가지 경우들을 생각했었다.

 

1. 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부들 조회

2. NULL로 저장되어있던 테이블 값을 다른 값으로 대체할 방법 모색

3. 창고의 ID를 기준으로 오름차순 정렬

 

하나씩 이야기해보자.

 

1. 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부들 조회

 

지금 테이블 구성을 보면 'ADDRESS' 컬럼(열)을 보면 경기도, 충청북도, 충청남도 등 이렇게 각 도들을 시작으로 하는 값들이 테이블에 저장되어있다는 것을 확인했었다. 이를 통해 SQLD를 공부하면서 습득한 where 내에 like "경기도%"를 통해 경기도로 시작하는 주소들을 조회할 수 있었다. 문제에서는 별다른 언급 없이 경기도에 위치한 곳이라 했으니 아래처럼 코드를 수정할 수도 있겠다.

 

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, coalesce(FREEZER_YN,'N')
FROM FOOD_WAREHOUSE 
WHERE WAREHOUSE_NAME like "%경기%"
order by WAREHOUSE_ID asc

 

위의 방법은 WAREHOUSE_NAME에 창고_OO(도)1 이렇게 되어있는 것을 활용하여 "%경기%" 이는 즉, WAREHOUSE_NAME내에 '경기' 라는 단어가 들어갈 경우들을 조회할 수 있도록 할 수 있다.

 

2. NULL로 저장되어있던 테이블 값을 다른 값으로 대체할 방법 모색

 

COALESCE는 대학교 수업에서도 잠깐 찍먹정도 하고 지나가서 기억을 하지 못했었다.

그래서 SQL 서적을 뒤져보면서 다시 기억할 수 있었다.

 

COALESCE는 간단히 설명하자면 해당 컬럼에 NULL값이 있을 경우 다른 값으로 대체할 수 있도록 하는 코드이다.

형식은 아래와 같다.

COALESCE(해당하는컬럼,대체할 값[숫자면 숫자그대로, 문자나 문자열이면 " " 을 포함한다.])
COALESCE(FREEZER_YN,'N') # 이는 FREEZER_YN 컬럼 내에 있는 NULL값을 문자 N 으로 대체한다. 라는 의미이다.

 

이를 통해 FREEZER_YN 내에 있는 NULL값을 N으로 변환할 수 있었다.

 

3. 창고의 ID를 기준으로 오름차순 정렬

 

정렬하는 것은 SQL 쿼리 작성에 있어서 기본적인 SELECT문의 요소 중 하나로 언급하지 않으려다가, 초심자의 마음으로 다시한번만 언급을 하고 넘어가보려한다.

 

SELECT문은 보통 다들 대학교 전공시간에 셀프웨구해오 라고 많이 외웠던 경험들이 있었을 것이다.

쿼리의 순서는 이렇지만, 쿼리의 실행 순서는 엄연히 다르다.

 

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT ->  ORDER BY 순이다.

이 순서만 알고 있어도 쿼리를 조금이나마 쉽게 풀어낼 수 있다는 느낌이 많이 받곤 한다.

 

아무튼 정렬은 두가지이다. 오름차순(ASC)과 내림차순(DESC)

쿼리를 짜면서 ORDER BY절의 기본형은 다음과 같다.

 

ORDER BY (컬럼) (정렬형태인데 빈칸일 경우 자동으로 ASC로 간주하고 실행된다.)

 

그리하여 나는 ORDER BY WAREHOUSE_ID ASC로 작성하였다. ASC는 생략해도 무방하다.

 

결과


 

반응형