스터디/SQL

[SQL 연습 문제] 프로그래머스 SQL 고득점 키트 문제 풀이(JOIN)

skyggg3 2022. 4. 29. 00:00

이번 문제 풀이에서는 테이블끼리 결합시켜 테이블 간의 관계를 파악할 때 사용하는 JOIN문이 필요합니다. JOIN문의 종류에는 INNER JOIN과 OUTER JOIN(LEFT JOIN, RIGHT JOIN, FULL  JOIN), SELF JOIN이 있습니다. 어떤 JOIN문을 사용하느냐에 따라 결합시킨 테이블의 형태가 달라집니다. 각 조인문에 대한 특징은 아래 링크에 정리해두었으니 참고하시길 바랍니다.

 

[MySQL] ch08_INNER JOIN, OUTER JOIN(LEFH JOIN, RIGHT JOIN, FULL JOIN), SELF JOIN

본 글은 인프런의 '[백문이불여일타] 데이터 분석을 위한 중급 SQL'강의를 듣고 직접 실습한 내용입니다. [백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런 | 강의 인프런 누적 수강생 8000명

yujeong-0121.tistory.com

 


프로그래머스 SQL 고득점 kit 문제 풀이

1. 없어진 기록 찾기

 

코딩테스트 연습 - 없어진 기록 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT outs.ANIMAL_ID, outs.NAME 
FROM ANIMAL_OUTS outs
LEFT JOIN ANIMAL_INS ins ON outs.ANIMAL_ID = ins.ANIMAL_ID
WHERE ins.ANIMAL_ID IS NULL
ORDER BY ins.ANIMAL_ID ASC

입양 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물을 보기위해보기 위해 LEFT JOIN을 사용했습니다. LEFT JOIN은 첫 번째 테이블은 무조건 표시하고, 두 번째 테이블에 매치되는 레코드가 없으면 NULL로 표시해줍니다. 따라서 보호소에 들어온 데이터가 유실된 동물만 보기 위해 WHERE절을 사용하여 IS NULL인 데이터만 조회했습니다.

 

 

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

 

코딩테스트 연습 - 있었는데요 없었습니다

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ins.ANIMAL_ID, ins.NAME
FROM ANIMAL_INS ins
INNER JOIN ANIMAL_OUTS outs on ins.ANIMAL_ID = outs.ANIMAL_ID
WHERE ins.DATETIME > outs.DATETIME
ORDER BY ins.DATETIME

INNER JOIN(교집합)으로 테이블을 결합시킨 뒤 WHERE절에 보호 시작일보다 입양일이 더 빠른 날을 찾는 쿼리를 작성했습니다.

 

 

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

 

코딩테스트 연습 - 오랜 기간 보호한 동물(1)

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ins.NAME, ins.DATETIME
FROM ANIMAL_INS ins
LEFT JOIN ANIMAL_OUTS outs ON ins.ANIMAL_ID = outs.ANIMAL_ID
WHERE outs.ANIMAL_ID IS NULL
ORDER BY DATETIME
LIMIT 3

1번 문제를 응용하면 됩니다. 보호소에 있는 동물 중 입양을 못 간 동물도 표시해주기 위해 LEFT JOIN을 사용합니다. 보호 시작일을 기준으로 오름차순 정렬하고 상위 3개만 조회했습니다.

 

 

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

 

코딩테스트 연습 - 보호소에서 중성화한 동물

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ins.ANIMAL_ID, ins.ANIMAL_TYPE, ins.NAME
FROM ANIMAL_INS ins
INNER JOIN ANIMAL_OUTS outs on ins.ANIMAL_ID = outs.ANIMAL_ID
WHERE ins.SEX_UPON_INTAKE LIKE 'Intact%' 
     AND (outs.SEX_UPON_OUTCOME LIKE 'Spayed%' OR outs.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY ins.ANIMAL_ID

INNER JOIN으로 테이블을 결합시키고 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소에 나갈 당시에는 중성화된 동물의 아이디와 생물 종을 조회하기위해 WHERE절에 쿼리를 다음과 같이 작성했습니다.

WHERE ins.SEX_UPON_INTAKE LIKE 'Intact%' 

             AND (outs.SEX_UPON_OUTCOME LIKE 'Spayed%' OR outs.SEX_UPON_OUTCOME LIKE 'Neutered%')

LIKE를 사용하면 '_____'를 포함하는 칼럼만 찾을 수 있습니다.