본문 바로가기
알고리즘/SQL

SQL(MYSQL) / 프로그래머스 JOIN (없어진 기록 찾기, 있었는데요 없었습니다, 오랜 기간 보호한 동물(1), 보호소에서 중성화한 동물)

by clean_h 2022. 2. 3.
728x90

SQL(MYSQL) / 프로그래머스 JOIN (없어진 기록 찾기, 있었는데요 없었습니다, 오랜 기간 보호한 동물(1), 보호소에서 중성화한 동물)

https://programmers.co.kr/learn/courses/30/parts/17046

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 


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

 

DB JOIN 정리(INNER/LEFT/RIGHT/OUTER)

join(조인) 둘 이상의 테이블을 연결해서 데이터를 검색하는 방법 연결하려면 테이블들이 적어도 하나의 컬럼을 공유하고 있어야함 이 공유하고 있는 컬럼을 PK 또는 FK값으로 사용 ​ 종류 1. INNER

pearlluck.tistory.com

 

내부 조인의 두가지 방법이 있다.

  1. FROM/WHERE을 사용 : FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O / WHERE I.ANIMAL_ID = O.ANIMAL_ID
  2. INNER JOIN / ON을 사용 : FROM ANIMAL_INS AS I INNER JOIN ANIMAL_OUTS AS O / ON I.ANIMAL_ID = O.ANIMAL_ID

두 가지 모두 사용하여 테이블 두 개를 조인할 수 있다. 

 

 

728x90

댓글