[프로그래머스 SQL 고득점 Kit] String, Date

페리·2021년 5월 5일
0
post-thumbnail

이전 포스트에 이어서 프로그래머스의 String, Date 파트를 풀어본다.

데이터는 다음과 같다.

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

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


1. 루시와 엘라 찾기
동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요. 결과는 다음과 같이 출력되어야 합니다.

이 문제는 String을 다루는 문제이다. 특정 단어들에 대해 해당되는 이름의 동물들을 출력해주면 된다.

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS WHERE NAME IN ("Lucy","Ella", "Pickle","Rogan", "Sabrina", "Mitty");

2. 이름에 el이 들 어가는 동물 찾기
보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다. 결과는 다음과 같이 출력해주세요.

이 문제는 두 가지 조건으로 데이터를 출력한다. 첫번째는 Nameel이 들어가는 동물, 두번째는 ANIMAL_TYPEDog인 동물이다.
그리고 Name 순서대로 order을 걸어주면 된다.

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE NAME LIKE '%EL%' AND ANIMAL_TYPE = 'Dog' order by NAME;

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

이 문제는 해당 단어가 포함되어있는 데이터를 출력하면 된다. 방법은 두 가지가 있다. 하나는 if문을 사용하는 것이다.

SELECT ANIMAL_ID, NAME, if(SEX_UPON_INTAKE LIKE '%Neutered%' or SEX_UPON_INTAKE LIKE '%Spayed%', 'O', 'X') as 중성화 FROM ANIMAL_INS order by ANIMAL_ID;

두 번째는 CASE 문을 사용하는 것이다.

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;

4. 오랜 기간 보호한 동물(2)
입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다. 결과는 다음과 같이 출력되어야 합니다.

이 문제는 두 개의 테이블에 있는 각 날짜의 차이로 정렬을 하여 2개의 데이터를 뽑아내야 한다.
먼저 INNER JOIN을 통해 두 테이블 모두에 해당되는 동물들로 선별을 한 뒤에, DATEDIFF라는 함수를 사용한다.
DATEDIFFDATEDIFF(A, B) 라고 할 때에 A와 B 사이에 있는 날짜의 차이를 반환하는 함수이다.

그렇기 때문에 다음과 같이 코드를 작성한다.

SELECT A.ANIMAL_ID, A.NAME FROM ANIMAL_INS AS A INNER JOIN ANIMAL_OUTS AS B on A.ANIMAL_ID = B.ANIMAL_ID order by DATEDIFF(A.DATETIME, B.DATETIME) limit 2;

5. DATETIME에서 DATE로 형 변환
ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다. 다음과 같이 출력되어야 합니다.

이 문제는 DATE_FORMAT라는 함수를 사용하여 DATETIME의 형 변환을 해야 한다. 그래서 DATE_FORMAT(DATETIME, '%Y-%m-%d')을 해주면 된다.

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') as 날짜 FROM ANIMAL_INS;

첫 포스트부터 지금 포스트까지 SQL 고득점 Kit 문제를 풀어보았다.


사실 고득점 Kit에는 문제가 그렇게 많지는 않아서 많이 풀었다고 할수는 없지만, 그래도 주로 어떤 방식으로 문제가 출제되는지는 파악할 수 있었다.
좀 더 SQL문에 숙달되기 위해서 더 많은 문제를 풀어볼 예정이다.

0개의 댓글