SQL With 프로그래머스(ISNULL, JOIN, String, Date)

조배·2022년 3월 1일
0

Road to Coding test

목록 보기
19/31
post-thumbnail

프로그래머스 SQL 고득점 Kit

모든 문제의 테이블

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

출처 : 프로그래머스 SQL 고득점 KIT

IS NULL

IS NULL은 크게 어렵지 않으실 것 같다.
보통 CASE 문으로 작성하기에 NULL값을 처리할때 IFNULL를 사용하면 처리하기 편하다는 생각이 들었다.
IFNULL(NAME,'No name')
-> NAME의 값이 NULL이면 'No name'이라는 값을 보내준다.

# 주석을 꼼꼼하게 작성하려 했는데 이제는 TMI가 될 것 같아서 핵심만 심플하게 작성하겠습니다!

# 1. '이름이 없는 동물의 아이디' - IS NULL
SELECT ANIMAL_ID 
FROM ANIMAL_INS 
WHERE NAME IS NULL 
ORDER BY ANIMAL_ID 

# 2. '이름이 있는 동물의 아이디' - IS NOT NULL
SELECT ANIMAL_ID 
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL 
ORDER BY ANIMAL_ID 

IFNULL (칼럼에 NULL값을 대체하여 보내주는 방법)

# 3.'NULL 처리하기'
# IFNULL('칼럼', 'NULL값이 있다면 대신해서 보내주고 싶은 값')
SELECT ANIMAL_TYPE, IFNULL(NAME,'No name'), SEX_UPON_INTAKE 
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID

JOIN

JOIN은 크게 INNER, RIGHT(LEFT), FULL 등이 있다.

출처 : 구글 이미지

그림으로 쉽게(?) 알아 볼 수 있다.
프로그래머스의 JOIN 문제는 기준이 되는 테이블을 잘 잡고 적절하게 본인이 좋아하는 방식으로 사용하면 되는 것 같다.

조인을 위해 추가된 테이블

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_IDANIMAL_INSANIMAL_ID의 외래 키입니다.
출처 : 프로그래머스 SQL 고득점 KIT

# 1. '없어진 기록' - RIGHT(LEFT) OUTER JOIN
SELECT OUTS.ANIMAL_ID, OUTS.NAME # ANIMAL_OUTS에만 있는 값
# 쉽게 말해서 INS와 OUTS의 교집합과 OUTS의 포함한 상태다.
FROM ANIMAL_INS INS RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID 
# 여기서 교집합부분을 빼준 OUTS의 값만을 나타내준다.
WHERE INS.ANIMAL_ID IS NULL
ORDER BY OUTS.ANIMAL_ID

# 2. '있었는데요 없었습니다' - RIGHT(LEFT) OUTER JOIN
SELECT OUTS.ANIMAL_ID, OUTS.NAME 
FROM ANIMAL_INS INS RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
# 위 문제와 비슷하다. 현재까지 INS와 OUTS의 교집합을 구성하고 있다.
# 교집합 중에 입양날짜가 보호시작일보다 빠른 경우를 찾아낸다. 
WHERE INS.DATETIME > OUTS.DATETIME
ORDER BY INS.DATETIME

# 3. '오랜 기간 보호한 동물(1)
SELECT INS.NAME, INS.DATETIME 
FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS 
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
# 이번 문제는 아직 입양가지 못한 동물을 찾는 거라서 INS 기준으로 작성했다.
# INS 테이블에서 OUTS와 교집합하는 부분을 빼준다.
WHERE OUTS.ANIMAL_ID IS NULL
ORDER BY INS.DATETIME
# ** 3개까지 출력 **
LIMIT 3

# 4. '보호소에서 중성화한 동물'
SELECT OUTS.ANIMAL_ID, OUTS.ANIMAL_TYPE, OUTS.NAME 
FROM ANIMAL_INS INS RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
# 1,2번 문제와 같은 조건이지만 그 중 한 칼럼의 값이 다른 것을 찾는다.
WHERE INS.SEX_UPON_INTAKE != OUTS.SEX_UPON_OUTCOME
ORDER BY OUTS.ANIMAL_ID

String, Date

String

WHERE 문의 여러가지 사용법에 대해 요구 했던 것 같다.
1. WHERE '칼럼' IN ('ONE' , 'TWO')
-> 포함한 값을 찾을때 사용하는데 파이썬과 흡사하다.
2. WHERE NAME LIKE '%EL%'
-> NAME에 'EL'을 포함하는 값을 찾을때 사용한다.
-> 'EL%' 이렇게하면 EL로 시작하는 경우고, '%EL'은 반대의 경우다.
3. 출력해줄 칼럼을 바꿔주는 CASE 함수도 있는데 아래에서 주석으로 설명하는게 나을듯 싶다.

Date

SQL에는 다양한 함수가 있는 것 같다. 특히 날짜에 관련된 함수가 많다.
DATE_FORMAT(DATETIME, '%Y-%m-%d')의 경우에는
2018-01-22 14:32:00 -> 2018-01-22 로 슬라이싱 해준다.
20180122 -> 2018-01-22 도 마찬가지다.

# 1. '루시와 엘라' - WHERE '칼럼' in (리스트)
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS
WHERE NAME in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID

# 2. '이름에 el이 들어가는 동물 찾기'
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS 
# WHERE 칼럼 LIKE '%포함할단어%' -> '시작하는단어%','%끝나는단어'
WHERE NAME LIKE '%EL%' and ANIMAL_TYPE = 'DOG'
ORDER BY NAME

# 3. '중성화 여부 파악하기'
SELECT ANIMAL_ID, NAME,
# 출력해줄 칼럼중 바꿔서 표현해줄 칼럼을 case 처리해준다.
CASE 
	# WHEN 조건 THEN True일 경우 ELSE false일 경우 end 칼럼
    WHEN SEX_UPON_INTAKE LIKE '%Neutered%' or SEX_UPON_INTAKE LIKE '%Spayed%'
    THEN 'O' 
    ELSE 'X' 
    END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

# 4. ' 오랜기간 보호한 동물(2)
SELECT OUTS.ANIMAL_ID, OUTS.NAME 
FROM ANIMAL_INS INS RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
# 문제에서 오랜기간 있었던 동물을 찾는것이였는데 저렇게 빼도 되더라...
ORDER BY OUTS.DATETIME - INS.DATETIME DESC
# 2개 출력 조건
LIMIT 2

# 5. 'DATETIME에서 DATE로 형 변환"
# DATE_FORMAT(DATETIME, '%Y-%m-%d') -> 2018-01-22 14:32:00 -> 2018-01-22
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS '날짜'
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID

END

역시 프로그래머스의 문제는 맛있는 것 같다는 생각이 듭니다.
단계별로 딱 적절한(?) 문제여서 진도 나가는 맛이 있었습니다.

profile
깃허브로 이전했습니다 -> https://chobae.github.io/

0개의 댓글