프로그래머스 SQL 고득점 Kit - JOIN
1. 없어진 기록 찾기
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/59040
문제 조건
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
문제 조건
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. 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 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
문제 조건
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를 사용했다.
'알고리즘 > 프로그래머스 - SQL 고득점 KIT' 카테고리의 다른 글
프로그래머스 SQL 고득점 Kit - String, Date (0) | 2021.10.15 |
---|---|
프로그래머스 SQL 고득점 Kit - IS NULL (0) | 2021.10.13 |
프로그래머스 SQL 고득점 Kit - GROUP BY (0) | 2021.10.12 |
프로그래머스 SQL 고득점 Kit - SUM, MAX, MIN (0) | 2021.10.11 |
프로그래머스 SQL 고득점 Kit - SELECT (0) | 2021.10.10 |
댓글