[프로그래머스] SQL LEVEL2

nRecode·2021년 3월 3일
0

SQL

목록 보기
2/4

공통 테이블

ANIMAL_INS 테이블

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

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

ANIMAL_OUTS 테이블

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

중복 제거하기

프로그래머스 | 중복 제거하기

동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.

출력 예

count
2

풀이

COUNT를 사용하는데 중복을 제거하므로 COUNT안에 DISTINCT를 사용한다. 또 NULL인 경우 카운트를 하지 않기 위해 IS NOT NULL을 사용한다.

SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL;

고양이와 개는 몇 마리 있을까

프로그래머스 | 고양이와 개는 몇 마리 있을까

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

출력 예

ANIMAL_TYPEcount
Cat2
Dog1

풀이

ANIMAL_TYPE이라는 그룹별로 수를 세야하기 때문에 GROUP BY를 사용해서 COUNT한다.

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count FROM ANIMAL_INS 
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;

NULL 처리하기

프로그래머스 | NULL 처리하기

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

출력 예

ANIMAL_TYPENAMESEX_UPON_INTAKE
CatJewelSpayed Female
CatMeoNeutered Male
DogNo nameSpayed Female

풀이

IFNULL이라는 sql function을 사용하여 NULL인 경우 NO name으로 변경할 수 있도록 한다.

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

동명 동물 수 찾기

프로그래머스 | 동명 동물 수 찾기

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

출력 예

ANIMAL_TYPENAMESEX_UPON_INTAKE
CatJewelSpayed Female
CatMeoNeutered Male
DogNo nameSpayed Female

풀이

NAME의 count가 1 초과하는 동물의 이름과 그 수를 보여야하기 때문에 HAVING절을 이용한다.

SELECT NAME, COUNT(NAME) AS COUNT FROM ANIMAL_INS 
WHERE NAME IS NOT NULL 
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME;

입양 시각 구하기(1)

프로그래머스 | 입양 시각 구하기(1)

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

출력 예

HOURCOUNT
91
102
1113
1210
1314
149
157
1610
1712
1816
192

풀이

DATETIME에 HOUR sql function을 사용하면 시간만 나타낸다. 또한 9시와 20시 사이에 입양된 동물을 보여줘야 하므로 HAVING절을 이용한다.

SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT 
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR BETWEEN 9 AND 20
ORDER BY HOUR;

중성화 여부 파악하기

프로그래머스 | 중성화 여부 파악하기

보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

출력 예

ANIMAL_IDNAME중성화
A355753ElijahO
A373219EllaO
A382192Maxwell 2X

풀이

이 문제는 IF와 Case를 이용하여 풀이하였다.

if 사용
SEX_UPON_INTAKE LIKE가 Neutered 또는 Spayed로 시작한다면 중성화가 됐다는 것을 의미하므로 if(LIKE절,"O","X")를 사용하여 해결

SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE LIKE "Neutered%" OR SEX_UPON_INTAKE LIKE "Spayed%", "O", "X") AS 중성화 FROM ANIMAL_INS;

CASE 사용
CASE는 WHEN ~ THEN~을 사용하여 나타낼 수 있다.

SELECT ANIMAL_ID, NAME, 
CASE
    WHEN SEX_UPON_INTAKE LIKE "Neutered%" THEN "O"
    WHEN SEX_UPON_INTAKE LIKE "Spayed%" THEN "O"
    ELSE "X"
END AS 중성화
FROM ANIMAL_INS;
profile
안정성, 확장성 있는 서버를 구축하고 가꾸는 개발자를 목표로 공부하고 있습니다. 🤔🤔🤔🤔 부족하기에 맞지 않는 내용이 있을 수 있습니다. 가감없이 피드백 해주시면 정말 감사하겠습니다..🙏

0개의 댓글