SQL(MYSQL) / 프로그래머스 JOIN (없어진 기록 찾기, 있었는데요 없었습니다, 오랜 기간 보호한 동물(1), 보호소에서 중성화한 동물)
https://programmers.co.kr/learn/courses/30/parts/17046
JOIN
INNER JOIN : 내부조인(교집합)
LEFT/RIGHT JOIN : 부분집합
OUTER JOIN : 외부조인(합집합)
JOIN은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것이다.
🎈 없어진 기록 찾기
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS I RIGHT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물을 찾아야한다.
ANIMAL_OUTS(O)에는 존재하고 ANIMAL_INS(I)에는 존재하지 않는 부분 집합을 찾아야 한다.
따라서 RIGHT JOIN을 사용하여 부분 집합을 찾아 조회한다.
🎈 있었는데요 없었습니다
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME ASC
보호 시작일보다 입양일이 더 빠른 동물을 찾아야한다.
ANIMAL_INS와 ANIMAL_OUTS 중 같은 ANIMAL_ID를 갖는 동물 중 DATETIME이 ANIMAL_INS보다 ANIMAL_OUTS가 느린 것을 찾아야 한다.
WHERE문으로 조건을 걸어주어 조건에 맞는 동물의 정보를 조회한다.
🎈 오랜 기간 보호한 동물(1)
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리를 찾아야한다.
입양을 못 간 동물은 ANIMAL_INS(I)에는 존재하고 ANIMAL_OUTS(O)에는 존재하지 않는 부분집합이다.
LEFT JOIN으로 부분 집합을 구할 수 있다.
가장 오래 보호소에 있었던 동물들은 ANIMAL_INS이 빠른 동물이다.
따라서 ANIMAL_INS(I) DATETIME 오름차순으로 정렬한 후 LIMIT 3으로 상위 3마리만 조회한다.
🎈 보호소에서 중성화한 동물
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS I JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE '%Intact%' AND (O.SEX_UPON_OUTCOME LIKE '%Spayed%' OR O.SEX_UPON_OUTCOME LIKE '%Neutered%')
ORDER BY ANIMAL_ID
보호소에서 중성화 수술을 거친 동물들을 조회한다. 보호소에 들어올 당시에는 중성화 되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물을 찾아야한다.
ANIMAL_INS 테이블은 중성화 여부에 "Intact"가 포함되어야하고 ANIMAL_OUTS 테이블은 중성화 여부에 "Spayed"나 ""Neutered"가 포함되는 동물을 찾아 출력한다.
단어가 포함되어 있는지의 여부는 LIKE 문으로 알 수 있다.
참고
https://pearlluck.tistory.com/46
내부 조인의 두가지 방법이 있다.
- FROM/WHERE을 사용 : FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O / WHERE I.ANIMAL_ID = O.ANIMAL_ID
- INNER JOIN / ON을 사용 : FROM ANIMAL_INS AS I INNER JOIN ANIMAL_OUTS AS O / ON I.ANIMAL_ID = O.ANIMAL_ID
두 가지 모두 사용하여 테이블 두 개를 조인할 수 있다.
댓글