[SQL] 프로그래머스 JOIN 문제

오도원공육사·2021년 10월 15일
0

SQL

목록 보기
10/15

문제 출처. [프로그래머스] JOIN 문제

1. 없어진 기록 찾기

문제

  • 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름 조회
  • ID 순으로 조회

풀이

  • 입양 간 기록 중심이므로 ANIMAL_OUTS을 중심으로 LEFT JOIN을 한 뒤에 ANIAML_ID가 일치하는 것을 가져온다.
  • 이때 ANIMAL_ID 일치만 체크하면 ANIMAL_INS의 값이 있는 것들도 다 들고온다.
  • 따라서 ANIMAL_INS의 ANIMAL_ID가 NULL인지 체크한다.
SELECT `OUT`.ANIMAL_ID, `OUT`.NAME
FROM ANIMAL_OUTS AS `OUT`
LEFT JOIN ANIMAL_INS AS `IN`
ON `OUT`.ANIMAL_ID = `IN`.ANIMAL_ID
WHERE `IN`.ANIMAL_ID IS NULL
ORDER BY `OUT`.ANIMAL_ID;
-- JOIN을 사용하지 않는 경우
SELECT `OUT`.ANIMAL_ID, `OUT`.NAME FROM ANIMAL_OUTS AS `OUT`
WHERE `OUT`.ANIMAL_ID NOT IN (
    SELECT `IN`.ANIMAL_ID FROM ANIMAL_INS AS `IN`
) ORDER BY `OUT`.ANIMAL_ID;

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

문제

  • 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회
  • 보호 시작일이 빠른 순으로 정렬

풀이

  • ANIMAL_ID가 같은 ANIMAL_OUTS와 ANIMAL_INS의 레코드에 대해서 비교
  • 보호 시작일과 입양일을 비교해야하므로 INNER JOIN
  • 보호 시작일보다 입양일이 더 빠르면 조회
SELECT `IN`.ANIMAL_ID, `IN`.NAME 
FROM ANIMAL_INS AS `IN`
INNER JOIN ANIMAL_OUTS AS `OUT`
ON `IN`.ANIMAL_ID = `OUT`.ANIMAL_ID
WHERE `IN`.DATETIME > `OUT`.DATETIME
ORDER BY `IN`.DATETIME;

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

문제

  • 아직 입양을 못 간 동물 중
  • 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일 조회
  • 보호 시작일 순으로 정렬

풀이

  • 아직 입양을 못 간 동물은 ANIMAL_INS를 기준으로 LEFT JOIN을 했을 때, ANIMAL_OUTS.ANIMAL_ID가 NULL인 레코드이다.
  • 가장 오래 보호소에 있는 동물 3마리는 ANIMAL_INS.DATETIME으로 ASC정렬했을 때 LIMIT 3을 하면 된다.
SELECT `IN`.NAME, `IN`.DATETIME
FROM ANIMAL_INS AS `IN`
LEFT JOIN ANIMAL_OUTS AS `OUT`
ON `IN`.ANIMAL_ID = `OUT`.ANIMAL_ID
WHERE `OUT`.ANIMAL_ID IS NULL
ORDER BY `IN`.DATETIME LIMIT 3;

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

문제

  • 보호소에서 들어올 당시에는 중성화 안했지만 나갈당시에는 중성화한 동물 조회
  • 아이디와 생물 종, 이름을 조회
  • 아이디순으로 정렬

풀이

  • 보호소에 들어오고 나갔으므로 양쪽에 존재하므로 INNER JOIN
  • 들어올 당시에는 중성화를 안했으므로 LIKE "Intact%" 조건
    • Intact%: Intact로 시작하는 모든 문자열을 의미한다.
  • 나갈 당시에는 중성화를 했으므로 "Neutered%" 또는 "Spayed%"
SELECT `IN`.ANIMAL_ID, `IN`.ANIMAL_TYPE, `IN`.NAME
FROM ANIMAL_INS AS `IN`
INNER JOIN ANIMAL_OUTS AS `OUT`
ON `IN`.ANIMAL_ID = `OUT`.ANIMAL_ID
WHERE `IN`.SEX_UPON_INTAKE LIKE "Intact%"
AND
	(`OUT`.SEX_UPON_OUTCOME LIKE "Spayed%"
	OR `OUT`.SEX_UPON_OUTCOME LIKE "Neutered%")
ORDER BY `IN`.ANIMAL_ID;
profile
잘 먹고 잘살기

0개의 댓글