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

boomboom·2021년 7월 27일
0
post-thumbnail

안녕하세요. 붐붐입니다.

이번 포스팅에서는 제가 풀어본 프로그래머스 SQL 고득점 Kit - String, Date 문제들의 풀이를 공유해보고자 합니다.


출처: 프로그래머스 코딩테스트 연습 - SQL 고득점 Kit

https://programmers.co.kr/learn/challenges?tab=sql_practice_kit


사용되는 테이블

ANIMAL_INS

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE
  • ANIMAL_ID: 동물의 아이디
  • ANIMAL_TYPE: 생물 종
  • DATETIME: 보호 시작일
  • INTAKE_CONDITION: 보호 시작 시 상태
  • NAME: 이름
  • SEX_UPON_INTAKE: 성별 및 중성화 여부

ANIMAL_OUTS

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_OUTCOMEVARCHAR(N)FALSE
  • ANIMAL_ID: 동물의 아이디
  • ANIMAL_TYPE: 생물 종
  • DATETIME: 입양일
  • NAME: 이름
  • SEX_UPON_OUTCOME: 성별 및 중성화 여부

[1번] 루시와 엘라 찾기

동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.
이때 결과는 아이디 순으로 조회해주세요. 예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A373219Cat2014-07-29 11:43:00NormalEllaSpayed Female
A377750Dog2017-10-25 17:17:00NormalLucySpayed Female
A353259Dog2016-05-08 12:57:00InjuredBjNeutered Male
A354540Cat2014-12-11 11:48:00NormalTuxNeutered Male
A354597Cat2014-05-02 12:16:00NormalArielSpayed Female

SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_IDNAMESEX_UPON_INTAKE
A373219EllaSpayed Female
A377750LucySpayed Female

풀이 1: IN을 사용하는 경우

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID ASC;

풀이 2: LIKE를 사용하는 경우

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME LIKE 'Lucy' OR NAME LIKE 'Ella' OR NAME LIKE 'Pickle' OR NAME LIKE 'Rogan' OR NAME LIKE 'Sabrina' OR NAME LIKE 'Mitty'
ORDER BY ANIMAL_ID ASC;

풀이 3: 정규식을 사용하는 경우

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP ('^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$')
ORDER BY ANIMAL_ID ASC;

[2번] 이름에 el이 들어가는 동물 찾기

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

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A355753Dog2015-09-10 13:14:00NormalElijahNeutered Male
A352872Dog2015-07-09 17:51:00AgedPeanutbutterNeutered Male
A353259Dog2016-05-08 12:57:00InjuredBjNeutered Male
A373219Cat2014-07-29 11:43:00NormalEllaSpayed Female
A382192Dog2015-03-13 13:14:00NormalMaxwell 2Intact Male
  • 이름에 'el'이 들어가는 동물은 Elijah, Ella, Maxwell 2입니다.
  • 이 중, 개는 Elijah, Maxwell 2입니다.

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_IDNAME
A355753Elijah
A382192Maxwell 2

풀이

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME REGEXP('el') AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME ASC;

[3번] 중성화 여부 파악하기

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

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A355753Dog2015-09-10 13:14:00NormalElijahNeutered Male
A373219Cat2014-07-29 11:43:00NormalEllaSpayed Female
A382192Dog2015-03-13 13:14:00NormalMaxwell 2Intact Male
  • 중성화한 동물: Elijah, Ella
  • 중성화하지 않은 동물: Maxwell 2

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_IDNAME중성화
A355753ElijahO
A373219EllaO
A382192Maxwell 2X

풀이

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

[4번] 오랜 기간 보호한 동물(2)

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.
예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A354597Cat2014-05-02 12:16:00NormalArielSpayed Female
A362707Dog2016-01-27 12:27:00SickGirly GirlSpayed Female
A370507Cat2014-10-27 14:43:00NormalEmilySpayed Female
A414513Dog2016-06-07 09:17:00NormalRockyNeutered Male

ANIMAL_OUTS

ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME
A354597Cat2014-06-03 12:30:00ArielSpayed Female
A362707Dog2017-01-10 10:44:00Girly GirlSpayed Female
A370507Cat2015-08-15 09:24:00EmilySpayed Female
  • Cookie는 보호소에 들어올 당시에 이미 중성화되어있었습니다.
  • Maxwell 2는 보호소에 들어온 후 중성화되었습니다.
  • Kaila는 보호소에 들어올 당시에 이미 중성화되어있었습니다.
  • Chewy는 보호소에 들어온 후 중성화되었습니다.

SQL문을 실행하면 다음과 같이 나와야 합니다.
|ANIMAL_ID|NAME|
|---------|----|
|A362707|Girly Girl|
|A370507|Emily|


풀이

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS AS A
JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY (B.DATETIME - A.DATETIME) DESC
LIMIT 2;

[5번] DATETIME에서 DATE로 형 변환

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

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A349996Cat2018-01-22 14:32:00NormalSugarNeutered Male
A350276Cat2017-08-13 13:50:00NormalJewelSpayed Female
A350375Cat2017-03-06 15:01:00NormalMeoNeutered Male
A352555Dog2014-08-08 04:20:00NormalHarleySpayed Female
A352713Cat2017-04-13 16:29:00NormalGiaSpayed Female

SQL문을 실행하면 다음과 같이 나와야 합니다.

ANIMAL_IDNAME날짜
A349996Sugar2018-01-22
A350276Jewel2017-08-13

풀이

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS '날짜'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;

profile
오늘도 붐붐

0개의 댓글