[프로그래머스] MySQL LEVEL 3 문제 풀이

1. 없어진 기록 찾기

  • 천재 지변으로 인해 일부 데이터가 유실되었다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID순으로 조회하는 SQL문을 작성하라
  • 이 문제에는 ANIMAL_INS와 ANIMAL_OUTS 두개의 테이블을 JOIN을 이용해 합치는 문제이다.
  • 먼저 JOIN에 대해 알아보자.

99219C345BE91A7E32

  • 위에서 살펴 볼 수 있듯이 LEFT JOIN을 하면 A를 기준으로 A의 특정 키 컬럼을 포함하는 데이터를 함께 보여준다.
  • 반면 RIGHT JOIN을 하면 B를 기준으로 특정 키 컬럼을 포함하는 A의 데이터를 함께 보여준다.
  • INNER JOIN은 교집합을 보여준다. MySQL에는 FULL OUTER JOIN이 없다. 따라서 모든 데이터를 합쳐주려면 UNION을 사용하면 된다. Is NULL을 사용하면 NULL값을 포함한 데이터를 불러온다. NULL 값이 포함되지 않길 원하면 Is NOT NULL을 작성하면 된다.
SELECT outs.ANIMAL_ID, outs.NAME FROM ANIMAL_OUTS outs
LEFT OUTER JOIN ANIMAL_INS ins
ON outs.ANIMAL_ID = ins.ANIMAL_ID
WHERE ins.ANIMAL_ID is NULL
ORDER BY outs.ANIMAL_ID; 
  • 코드를 살펴보면 다음과 같다. ANIMAL_OUTS를 기준으로 ANIMAL_INS를 조인한다. 여기서 조건은 ANIMAL_ID가 서로 일치하는 값들을 포함하고 ANIMAL_ID에 NULL값을 포함하는 데이터만을 불러온다. 이를 ORDER BY를 이용해 정렬한다.

2. 있었는데요 없었습니다.

  • 관리자의 실수로 일부 동물의 입양일이 잘못 입력되었다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성하라. 이때 결과는 보호 시작일이 빠른 순으로 조회해야 한다.

  • 마찬가지로 JOIN을 이용하면 된다.

    SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME FROM ANIMAL_INS 
    LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID 
    WHERE ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME 
    ORDER BY ANIMAL_INS.DATETIME;
    

3. 오랜 기간 보호한 동물(1)

  • 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성하라. 이 때 결과는 보호 시작일 순으로 조회해야 한다.

  • 마찬가지로 JOIN을 이용하되, 입양되지 않은 동물이기 떄문에 ANIMAL_OUTS에 NULL값이 포함된 데이터만 찾아달라고 WHERE을 이용한다. 그리고 LIMIT을 이용해 3마리만 조회하면 된다.

    SELECT INS.NAME, INS.DATETIME
    FROM ANIMAL_INS INS
    LEFT JOIN ANIMAL_OUTS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
    WHERE OUTS.DATETIME is NULL
    ORDER BY INS.DATETIME
    LIMIT 3;
    

4. 보호소에서 중성화한 동물

  • 보호소에서 중성화 수술을 거친 동물 정보를 알아보려 한다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 아이디 순으로 조회하는 SQL문을 작성하라.
  • 마찬가지로 JOIN을 사용하면된다. 입양당시에는 중성화가 안된 친구지만 입양이후에 중성화가 진행되었기 떄문에 이를 염두해두고 풀이를 진행하면 된다.
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME FROM ANIMAL_INS INS
LEFT JOIN ANIMAL_OUTS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE != OUTS.SEX_UPON_OUTCOME
ORDER BY INS.ANIMAL_ID;

Categories:

Updated:

Leave a comment