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

승민·2022년 2월 4일
0

Sql

목록 보기
5/5

💡 없어진 기록 찾기

LEFT JOIN을 이용해서 해결하는 문제이다. JOIN에는 크게 OUTER JOIN과 INNER JOIN으로 나뉘고 OUTER JOIN에는 LEFT JOIN과 RIGHT JOIN, FULL OUTER JOIN으로 나뉜다.

어차피 RIGHT JOIN도 두 테이블의 순서만 환원하면 LEFT JOIN이 되기 때문에 거의 대부분 LEFT JOIN을 사용한다. 이 문제에서는 ANIMAL_INS의 기록이 NULL인 부분을 찾아야 하므로 ANIMAL_OUTS를 A테이블로 두고 ANIMAL_INS를 B테이블로 둔 채 LEFT JOIN을 실행하면 된다. ANIMAL_ID라는 공통 칼럼을 가지므로 ANIMAL_ID로 묶어주고 테이블이 JOIN된 상태에서 ANIMAL_OUTS에는 있지만 ANIMAL_INS에는 없는 동물들을 WHERE과 is null을 이용해 찾으면 된다.

SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_INS.ANIMAL_ID is null

💡 있었는데요 없었습니다

마찬가지로 LEFT JOIN을 이용하는 문제이다. ANIMALS_OUT을 왼쪽에 두고 ANIMALS_INS를 오른쪽으로 둔 뒤 공통 칼럼인 ANIMAL_ID를 이용해 JOIN해주고 손상된 데이터인 DATETIME을 WHERE절을 이용해 찾고 DATETIME을 기준으로 ORDER BY를 사용해주면 된다.

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

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

이 문제 또한 LEFT JOIN을 이용한 문제이다. 이번에는 입양을 가지 않은 동물들을 추출해야 하므로 ANIMAL_INS를 왼쪽에 ANIMAL_OUTS를 오른쪽에 두고 JOIN을 수행한다. 입양을 가지 않았다면 ANIMAL_OUTS.DATETIME이 null값일 것이기 때문에 WHERE을 이용해 입양을 가지 않은 동물들을 추출한 뒤 LIMIT와 ORDER BY를 이용해 상위 3개의 값만 출력한다.

SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME
FROM ANIMAL_INS
LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_OUTS.DATETIME is null
ORDER BY ANIMAL_INS.DATETIME ASC
LIMIT 3

💡 보호소에서 중성화한 동물

보호소에서 중성화한 것을 알아내는 것이기 때문에 보호소를 나간 동물이어야 한다. 즉 LEFT JOIN을 이용하면 된다. 이 때 왼쪽에는 ANIMAL_INS를 두고 오른쪽에 ANIMAL_OUTS를 두고 ANIMAL_INS에서는 중성화하지 않은 상태이고 ANIMAL_OUTS에서는 중성화 상태인 동물들을 추출하면 된다. SQL에서 특정 문자열이 존재하는지 검사하는 키워드는 LIKE 이다. WHERE 키워드와 함께 사용하면 되며 LIKE '%특정문자열%'과 같이 사용하면 된다. 이 때 %는 특정문자열 앞과 뒤에 있는 어떠한 문자열을 의미하기 때문에 '특정문자열%'와 같이 사용하면 특정문자열로 시작하는 행만 추출된다.

SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME
FROM ANIMAL_INS
LEFT JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_INS.SEX_UPON_INTAKE LIKE '%Intact%'
AND (ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE '%Spayed%'
OR ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE '%Neutered%')
profile
안녕하세요 승민입니다

0개의 댓글