[프로그래머스] SQL 고득점 Kit - JOIN편

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

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


출처: 프로그래머스 코딩테스트 연습 - 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번] 없어진 기록 찾기

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A352713Cat2017-04-13 16:29:00NormalGiaSpayed Female
A350375Cat2017-03-06 15:01:00NormalMeoNeutered Male

ANIMAL_OUTS

ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME
A349733Dog2017-09-27 19:09:00AllieSpayed Female
A352713Cat2017-04-25 12:25:00GiaSpayed Female
A349990Cat2018-02-02 14:18:00SpiceSpayed Female

ANIMAL_OUTS 테이블에서

  • Allie의 ID는 ANIMAL_INS에 없으므로, Allie의 데이터는 유실되었습니다.
  • Gia의 ID는 ANIMAL_INS에 있으므로, Gia의 데이터는 유실되지 않았습니다.
  • Spice의 ID는 ANIMAL_INS에 없으므로, Spice의 데이터는 유실되었습니다.

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

ANIMAL_IDNAME
A349733Allie
A349990Spice

풀이

SELECT IF(ISNULL(A.ANIMAL_ID), B.ANIMAL_ID, A.ANIMAL_ID) AS ANIMAL_ID, B.NAME
FROM ANIMAL_INS AS A
RIGHT OUTER JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE ISNULL(A.DATETIME)
ORDER BY A.ANIMAL_ID ASC;

[2번] 있었는데요 없었습니다

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.
예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A350276Cat2017-08-13 13:50:00NormalJewelSpayed Female
A381217Dog2017-07-08 09:41:00SickCherokeeNeutered Male

ANIMAL_OUTS

ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME
A350276Cat2018-01-28 17:51:00JewelSpayed Female
A381217Dog2017-06-09 18:51:00CherokeeNeutered Male

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

ANIMAL_IDNAME
A381217Cherokee

풀이

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS AS A
JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID AND A.DATETIME > B.DATETIME
ORDER BY A.DATETIME ASC;

[3번] 오랜 기간 보호한 동물(1)

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A354597Cat2014-05-02 12:16:00NormalArielSpayed Female
A373687Dog2014-03-20 12:31:00NormalRosieSpayed Female
A412697Dog2016-01-03 16:25:00NormalJackieNeutered Male
A413789Dog2016-04-19 13:28:00NormalBenjiSpayed Female
A414198Dog2015-01-29 15:01:00NormalShellySpayed Female
A368930Dog2014-06-08 13:20:00NormalSpayed Female

ANIMAL_OUTS

ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME
A354597Cat2014-05-02 12:16:00ArielSpayed Female
A373687Dog2014-03-20 12:31:00RosieSpayed Female
A368930Dog2014-06-13 15:52:00Spayed Female

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

NAMEDATETIME
Shelly2015-01-29 15:01:00
Jackie2016-01-03 16:25:00
Benji2016-04-19 13:28:00

풀이

SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS AS A
LEFT JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE ISNULL(B.DATETIME)
ORDER BY A.DATETIME ASC 
LIMIT 3;

[4번] 보호소에서 중성화한 동물

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

ANIMAL_INS

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A367438Dog2015-09-10 16:01:00NormalCookieSpayed Female
A382192Dog2015-03-13 13:14:00NormalMaxwell 2Intact Male
A405494Dog2014-05-16 14:17:00NormalKailaSpayed Female
A410330Dog2016-09-11 14:09:00SickChewyIntact Female

ANIMAL_OUTS

ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME
A367438Dog2015-09-12 13:30:00CookieSpayed Female
A382192Dog2015-03-16 13:46:00Maxwell 2Neutered Male
A405494Dog2014-05-20 11:44:00KailaSpayed Female
A410330Dog2016-09-13 13:46:00ChewySpayed Female
  • Cookie는 보호소에 들어올 당시에 이미 중성화되어있었습니다.
  • Maxwell 2는 보호소에 들어온 후 중성화되었습니다.
  • Kaila는 보호소에 들어올 당시에 이미 중성화되어있었습니다.
  • Chewy는 보호소에 들어온 후 중성화되었습니다.

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

ANIMAL_IDANIMAL_TYPENAME
A382192DogMaxwell 2
A410330DogChewy

풀이

SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS AS A
JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE <> B.SEX_UPON_OUTCOME
ORDER BY A.ANIMAL_ID ASC;

좋은 웹페이지 즐겨찾기