티스토리 뷰

SQL

[Programmers] NULL 정리

오탱 2023. 8. 16. 17:10

프로그래머스 IS NULL PART 완료~

ISNULL, IFNULL 등의 NULL관련 함수들만 쓰면 쉽게 풀 수 있는 문제들이지만,

함수를 까먹을 수 있기에 정리하고 넘어가도록 하겠습니다! 

NULL 관련 문법 정리

1. IF NULL : 해당 column이 NULL일 경우 다른 값을 반환

SELECT IFNULL(Column명, "Null일 경우 대체 값") FROM 테이블명;

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

FOOD_WAREHOUSE
 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, 'N') AS FREEZER_YN FROM FOOD_WAREHOUSE
WHERE LEFT(ADDRESS,3) = '경기도'
ORDER BY WAREHOUSE_ID;

💡 IF NULL 은 IF문과 IS NULL을 함께 이용함으로써 대체될 수 있다! 

→ 위 문제에서 IFNULL 대신, IF(ISNULL( column명), True일때 반환값, False일 때 반환값)) 으로 대체 가능!

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IF(ISNULL(FREEZER_YN), 'N', FREEZER_YN) AS FREEZER_YN FROM FOOD_WAREHOUSE
WHERE LEFT(ADDRESS,3) = '경기도'
ORDER BY WAREHOUSE_ID;

 

2. WHERE문 IS NULL / IS NOT NULL: NULL 값 / NOT NULL값 확인

WHERE문에 IS NULL / IS NOT NULL 을 써줌으로써, NULL 값 여부를 확인할 수 있음!

EX) 

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

💡 IS NULL과 COUNT를 함께 쓰는 경우! 

USER_INFO 테이블에서 나이 정보가 없는 회원이 몇 명인지 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 USERS로 지정해주세요.
SELECT COUNT(*) AS USERS FROM USER_INFO
WHERE AGE IS NULL;

#SELECT COUNT(IF(AGE IS NULL, USER_ID, NULL)) USERS
#FROM USER_INFO;

💡 참고로 MySQL에서는 ISNULL 함수는 존재x, ISNULL 대신 IFNULL 존재!

 

3. COALESCE : NULL이 아닌 값을 만나면, 그 값을 리턴하는 함수

COALESCE(column1, column2,...)

- 첫번째 인자부터 차례대로 확인해서, 처음으로 NULL이 아닌 값을 만나면 그 값을 리턴

ex) COALESCE(coupon, 0) : coupon이 null값이면, 0을 출력


예제) 

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

 

SELECT ANIMAL_TYPE, COALESCE(NAME, "No name") AS NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

- NAME에 NULL값이 있으면, No name을 출력!

 

💡 IF NULL을 이용한 풀이도 가능!

SELECT ANIMAL_TYPE, IFNULL(NAME, "No name") AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
ORDER BY ANIMAL_ID;