카테고리 없음

[프로그래머스 SQL kit] JOIN

아놀드금자 2022. 3. 1. 05:05
728x90

programmers SQL 고득점 kit 답안

코딩테스트 대비 

JOIN

 

출처: stackoverflow 

없어진 기록 찾기

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

 

 

입양보낸목록 - 보호소들어온목록

이렇게 차집합을 만들어서 입양보낸목록에만 있는 값들을 찾아야 한다!!

하 씨발... 존나 얼토당토않은 구문 50개쯤 만들었음

 

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

 

입양보낸목록에만 있는 값들을 찾아야 하니까 id와 name도 그 테이블에 있는걸 select

사실 완전 이해는 못했고 맨 위 이미지를 보고 해당하는 집합에 컬럼명들을 집어넣었다.

 

 

 


있었는데요 없었습니다

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

 

첫번째시도

SELECT DISTINCT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_INS 
LEFT JOIN ANIMAL_OUTS 
ON DATEDIFF(ANIMAL_OUTS.DATETIME, ANIMAL_INS.DATETIME) < 0
ORDER BY ANIMAL_INS.DATETIME ASC;

 

두번째시도

SELECT DISTINCT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_INS, ANIMAL_OUTS
WHERE DATEDIFF(ANIMAL_OUTS.DATETIME, ANIMAL_INS.DATETIME) < 0
ORDER BY ANIMAL_INS.DATETIME ASC;

 

 

헐~ 충격적 근데 이건 내가 JOIN문에 대한 이해가 부족했다.

ON절을 완전히 이상하게 쓰고있었음

그리고 날짜 비교할 때 DATEDIFF() 사용하는 건 줄 알았는데 굳이 저거 안쓰고 그냥 비교연산자로도 가능함

DATEDIFF(날짜1, 날짜2) = 날짜1-날짜2 값 

 

조인과 이너조인 아우터조인 차이를 잘 모르겠다ㅜ

 

SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_INS 
LEFT JOIN ANIMAL_OUTS 
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_OUTS.DATETIME < ANIMAL_INS.DATETIME
ORDER BY ANIMAL_INS.DATETIME ASC;

 

 

 

 


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

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

 

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

 

위의 벤다이어그램 참고했다

이번 경우에도 1번과 비슷하게 A에서 A와 B모두 존재하는 교집합을 뺀 (차집합이라는 뜻) 값을 구해야 한다

그래야 보호소에는 들어왔지만 입양을 못 간 동물들만 남음!

그래서 거기서 가장 오래된 녀석들 정렬, LIMIT 3

 

 

 


보호소에서 중성화한 동물

 

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

 

음~ 문제 읽기만 했는데 존나 어렵다

 

SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.ANIMAL_TYPE, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_OUTS.SEX_UPON_OUTCOME != ANIMAL_INS.SEX_UPON_INTAKE
ORDER BY ANIMAL_OUTS.ANIMAL_ID ASC;

 

하지만 해냈죠?

728x90