-
프로그래머스) [SQL 고득점 KIT, JOIN] 없어진 기록 찾기, 있었는데요 없었습니다, 오랜 기간 보호한 동물(1), 보호소에서 중성화한 동물SQL 2020. 6. 4. 21:49반응형
없어진 기록 찾기
유실된 데이터를 찾는 문제기 때문에, OUTER JOIN을 이용해야하는 문제이다.
편의에 따라 LEFT, RIGHT를 사용하면 되는데, LEFT JOIN은 FROM 테이블을 기준으로 오른쪽에 JOIN 테이블은 붙이는 것이고, RIGHT JOIN은 JOIN테이블은 기준으로 FROM 테이블을 왼쪽에 붙이는 것으로 알고있다.
WHERE 절로도 쉽게 풀 수 있는 문제였다.
QUERY
-- LEFT (OUTER) JOIN #SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_OUTS AS O #LEFT JOIN ANIMAL_INS AS I #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.ANIMAL_ID IS NULL; -- RIGHT (OUTER) JOIN #SELECT O.ANIMAL_ID, O.NAME #FROM ANIMAL_INS as I RIGHT OUTER JOIN ANIMAL_OUTS as O on I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.ANIMAL_ID IS NULL; -- WHERE Clause SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS);
있었는데요 없었습니다
입양일이 보호시작일 보다 빠른 경우를 찾는 문제였다.
그래서 INNER JOIN, OUTER JOIN 모두 다 가능했다.
입맛에 맞는 JOIN문을 쓰면 된다.
하지만, NULL이 필요한 문제가 아니기 때문에 INNER JOIN이 더 효율적이지 않을까 한다.
연습하기위해 할 수 있는 모든 구문을 작성해봤지만, WHERE로 만으로도 손쉽게 풀 수 있는 문제였다.
QUERY
# INNER JOIN #SELECT I.ANIMAL_ID, I.NAME #FROM ANIMAL_INS AS I #JOIN ANIMAL_OUTS AS O #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.DATETIME > O.DATETIME #ORDER BY I.DATETIME; # LEFT JOIN #SELECT I.ANIMAL_ID, I.NAME #FROM ANIMAL_INS AS I #LEFT JOIN ANIMAL_OUTS AS O #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.DATETIME > O.DATETIME #ORDER BY I.DATETIME; # RIGHT JOIN #SELECT I.ANIMAL_ID, I.NAME #FROM ANIMAL_OUTS AS O #JOIN ANIMAL_INS AS I #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.DATETIME > O.DATETIME #ORDER BY I.DATETIME; # WHERE SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O WHERE I.ANIMAL_ID = O.ANIMAL_ID AND I.DATETIME > O.DATETIME ORDER BY I.DATETIME;
오랜 기간 보호한 동물(1)
입양을 가지 못한 동물 중, 가장 오래 보호소에 있던 동물 3마리를 출력하는 문제였다.
입양 기록이 없는 동물을 찾기 때문에, NULL 이 필요하고, OUTER JOIN을 써야하는 문제다.
이 때, 이 전 포스팅에서 다뤘던 LIMIT를 이용해주어, 3마리만 출력해준다.
QUERY
-- LEFT (OUTER) JOIN #SELECT I.NAME, I.DATETIME FROM ANIMAL_INS AS I #LEFT JOIN ANIMAL_OUTS AS O #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE O.ANIMAL_ID IS NULL #ORDER BY I.DATETIME ASC #LIMIT 3; -- RIGHT (OUTER) JOIN #SELECT I.NAME, I.DATETIME #FROM ANIMAL_OUTS AS O #RIGHT JOIN ANIMAL_INS AS I #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE O.ANIMAL_ID IS NULL #ORDER BY I.DATETIME ASC #LIMIT 3; -- Where Clause SELECT I.NAME, I.DATETIME FROM ANIMAL_INS AS I WHERE I.ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS) ORDER BY I.DATETIME ASC LIMIT 3;
보호소에서 중성화한 동물
보호 시작점과 입양갈 때, 성별이 다른 동물을 출력하는 문제다.
그렇기 때문에, INNER JOIN, OUTER JOIN 모두 이용 가능한 문제다.
하지만, 위에서도 언급했듯, 이 문제도 INNER JOIN 혹은 WHERE 구문으로 푸는 것이 더 적절해 보인다.
QUERY
## INNER JOIN #SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME #FROM ANIMAL_OUTS AS O #JOIN ANIMAL_INS AS I #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.SEX_UPON_INTAKE != O.SEX_UPON_OUTCOME #ORDER BY O.ANIMAL_ID; ## LEFT JOIN #SELECT O.ANIMAL_ID, O.ANIMAL_TYPE,O.NAME #FROM ANIMAL_OUTS AS O #JOIN ANIMAL_INS AS I #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.SEX_UPON_INTAKE != O.SEX_UPON_OUTCOME #ORDER BY O.ANIMAL_ID; ## RIGHT JOIN #SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME #FROM ANIMAL_OUTS AS O #JOIN ANIMAL_INS AS I #ON I.ANIMAL_ID = O.ANIMAL_ID #WHERE I.SEX_UPON_INTAKE != O.SEX_UPON_OUTCOME #ORDER BY O.ANIMAL_ID; ## WHERE SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME FROM ANIMAL_INS AS I, ANIMAL_OUTS AS O WHERE I.ANIMAL_ID = O.ANIMAL_ID AND I.SEX_UPON_INTAKE != O.SEX_UPON_OUTCOME ORDER BY I.ANIMAL_ID;
반응형'SQL' 카테고리의 다른 글
MySQL 권한 설정 (0) 2021.04.29 프로그래머스) [SQL 고득점 KIT] 입양 시각 구하기, 중성화여부, 오랜기간 보호한 동물(2), DATETIME에서 DATE로 변환, NULL 처리하기 (0) 2020.06.04 MySQL) Challenges (0) 2020.06.04 MySQL) Ollivander's Inventory (0) 2020.06.03 MySQL) Top Competitors (0) 2020.06.03