본문 바로가기
알고리즘/프로그래머스 - SQL 고득점 KIT

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

by 호롤롤로루야 2021. 10. 14.

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

1. 없어진 기록 찾기

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59040

 

코딩테스트 연습 - 고양이와 개는 몇 마리 있을까

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

programmers.co.kr

문제 조건

1. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

쿼리

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_OUTS AS A 
LEFT JOIN ANIMAL_INS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.ANIMAL_ID;

풀이

1. A LEFT JOIN B ON A.ANIMAL_ID = B.ANIMAL_ID

   . A의 ANIMAL_ID와 일치하는 B.ANIMAL_ID가 있는 경우 B의 내용을 붙인다.

   . A.ANIMAL_ID와 매핑되는 값이 없으면 B.ANIMAL_ID는 아래와 같이 NULL값을 갖는다.

   . 여기서 NULL 값만 뽑아내기 위해 WHERE B.ANIMAL_ID IS NULL을 사용한다.

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

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59043

 

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

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

programmers.co.kr

문제 조건

1. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요.

2. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

쿼리

SELECT A.ANIMAL_ID, A.NAME FROM ANIMAL_INS AS A
INNER JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID AND B.DATETIME <= A.DATETIME
ORDER BY A.DATETIME;

풀이

1. A INNER JOIN B ON ~

   . A.ANIMAL_ID, B.ANIMAL_ID 두 곳 모두 존재하는 경우 매핑하여 출력한다.

   . 따라서 B.ANIMAL_ID가 NULL 을 갖는 경우는 없다.

   . 아래는 INNER JOIN과 LEFT JOIN이다.

2. 보호 시작일(IN)보다 입양일(OUT)이 더 빠른 경우를 찾아야하기 때문에 아래를 사용한다.

   . B.DATETIME <= A.DATETIME (A = ANIMAL_INS / B = ANIMAL_OUTS)

 

 

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

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59044

 

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

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

programmers.co.kr

문제 조건

1. 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요.

2. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

쿼리

SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS AS A 
LEFT JOIN ANIMAL_OUTS B 
ON A.ANIMAL_ID = B.ANIMAL_ID 
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
LIMIT 3;

풀이

1. 아직 입양을 못 간 동물이라면 ANIMAL_INS에는 있고 ANIMAL_OUTS에는 없어야 한다.

2. ANIMAL_INS AS A LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID 

   . A.ANIMAL_ID와 매핑되는 B.ANIMAL_ID가 없다면 NULL이 붙을 것이다.

3. WHERE B.ANIMAL_ID IS NULL 로 입양 못 간 동물을 뽑아낸다.

4. 가장 오래 있었던 3마리를 골라내기 위해 ORDER BY A.DATETIME LIMIT 3; 를 사용했다.

 

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

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59045

 

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

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

programmers.co.kr

문제 조건

1. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.

쿼리

SELECT B.ANIMAL_ID, B.ANIMAL_TYPE, B.NAME FROM ANIMAL_OUTS AS B
JOIN ANIMAL_INS AS A ON B.ANIMAL_ID = A.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE LIKE 'Intact%'
AND (B.SEX_UPON_OUTCOME LIKE 'Neutered%' OR B.SEX_UPON_OUTCOME LIKE 'Spayed%');

 

SELECT B.ANIMAL_ID, B.ANIMAL_TYPE, B.NAME FROM ANIMAL_OUTS B 
LEFT JOIN ANIMAL_INS A ON B.ANIMAL_ID = A.ANIMAL_ID
WHERE A.ANIMAL_ID IS NOT NULL 
AND (B.SEX_UPON_OUTCOME LIKE 'NEUTERED%' OR B.SEX_UPON_OUTCOME LIKE 'SPAYED%')
AND A.SEX_UPON_INTAKE LIKE 'INTACT%';

풀이

1. 입양을 간 동물이라면 ANIMAL_INS와 ANIMAL_OUTS에 모두 정보가 있을 것이다.

2. 따라서 INNER JOIN == JOIN 을 사용한다. (LEFT JOIN을 한다면 NULL 처리를 신경 써야한다.)

3. 중성화가 완료된 경우는 Neutered ~ 혹은 Spayed ~ 로 표시된다. 따라서 LIKE를 사용했다.

 

댓글