코딩 테스트/프로그래머스

프로그래머스 - 오랜 기간 보호한 동물(1) (SQL)

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

NOT EXISTS, NOT IN, LEFT JOIN을 사용하여 풀어 보았습니다.

각각의 성능 차이는 데이터량, db 종류 등에 따라 달라질 수 있을 거 같습니다. 

예로 서브쿼리 최적화가 좋지 못한 DB라면  LEFT JOIN을 사용해야하겠죠.

서브쿼리 성능관련해서는 https://jojoldu.tistory.com/520를 참조하시면 좋을거 같습니다.

 

NOT EXISTS, NOT IN 두 가지를 사용할때 주의할 점은 null을 처리하는 방법이 다르다는 것입니다.

 

1. NOT IN 절은 AND 절로 모두 IN절 내의 모든 값에 포함되지 않아야 하는데 NULL의 경우 이를 확인할수 없는 값으로 처리

 

2. Not In 은 Where 절의 조건이 만족하더라도 연결고리 컬럼이 Null값을 갖는 경우 결과에서 제외


3. Not Exists는 Not In과 달리 Null값을 가진 Row들도 결과에 포함됩니다. 이는 연결고리 값이 Null값을 가질때 Not In은 조인 연산을 하지 않기 때문에 결과에서 제외되며 Not Exists는 Exists 이하의 절이 False를 리턴하고 거기에 대한 Not이기 때문에 결과적으로 true가 되어 결과에 포함

 

1. NOT EXISTS

SELECT NAME, DATETIME
FROM ANIMAL_INS AI
WHERE NOT EXISTS(SELECT 1 FROM ANIMAL_OUTS AO WHERE AI.ANIMAL_ID = AO.ANIMAL_ID)
ORDER BY DATETIME 
LIMIT 0, 3

 

2. NOT IN

SELECT NAME, DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN(SELECT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY DATETIME 
LIMIT 0, 3

 

3.LEFT JOIN

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