[TIL] #7. 프로그래머스 JOIN
[ JOIN ]
테이블 사이의 복잡한 관계를 파악해보아요.
🔗 JOIN 개념과 기본 코드는 여기 참고하기
[ 없어진 기록 찾기 ]
🔗 문제 바로가기
문제 정리
1. 테이블 정리
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블
2. 필드 정보
ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일
INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름- 성별 및 중성화 여부
ANIMAL_INS
→SEX_UPON_INTAKE
ANIMAL_OUTS
→SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
3. 문제
일부 데이터가 유실되어 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID순으로 조회하는 SQL문을 작성하라.
DATETIME
정보가ANIMAL_OUTS
에만 있는 레코드를 원한다.
→ 이렇게 정보가 한쪽 테이블에만 있을 경우,LEFT JOIN
을 이용해야 한다.
(RIGHT JOIN
도 당연히 가능!)ANIMAL_OUTS
의ANIMAL_ID
와ANIMAL_INS
의ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_INS
에도DATETIME
정보가 있으므로ANIMAL_INS
의DATETIME
정보가 없는 것을 가져오기 위해서는NULL인 값만 가져와야 한다
는 조건을 추가해야 한다.ANIMAL_ID
순으로 조회해야 한다.
풀이
✅ 코드 분석
SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
ANIMAL_ID
와NAME
필드값을 조회한다.
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
LEFT JOIN
을 이용하여ANIMAL_OUTS
테이블을 기준으로ANIMAL_INS
테이블을 조합한다.ANIMAL_OUTS.ANIMAL_ID
와ANIMAL_INS.ANIMAL_ID
가 같은 값만 가져온다.
WHERE ANIMAL_INS.DATETIME IS NULL
ANIMAL_INS.DATETIME
정보가 없는, 즉NULL
인 값만 가져온다.
ORDER BY ANIMAL_OUTS.ANIMAL_ID
ANIMAL_OUTS.ANIMAL_ID
필드값을 기준으로 오름차순으로 정렬한다.
✅ 전체 코드
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.DATETIME IS NULL
ORDER BY ANIMAL_OUTS.ANIMAL_ID
[ 있었는데요 없었습니다 ]
🔗 문제 바로가기
문제 정리
1. 테이블 정리
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블
2. 필드 정보
ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일
INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름- 성별 및 중성화 여부
ANIMAL_INS
→SEX_UPON_INTAKE
ANIMAL_OUTS
→SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
3. 문제
관리자의 실수로 일부 동물의 입양일이 잘못 입력되었다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성하라. 이때 결과는 보호 시작일이 빠른 순으로 조회해야 한다.
ANIMAL_OUTS.DATETIME
값 중 잘못된 값이 있다. 그러므로ANIMAL_INS.DATETIME
값을 가져와야 한다.
→ 이번에는RIGHT JOIN
이용!ANIMAL_OUTS
의ANIMAL_ID
와ANIMAL_INS
의ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_OUTS.DATETIME
값이ANIMAL_INS.DATETIME
값보다 큰 레코드를 가져와야 한다.ANIMAL_INS.DATETIME
값을 기준으로 오름차순으로 조회해야 한다.
풀이
✅ 코드 분석
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
ANIMAL_ID
와NAME
필드값을 조회한다.
FROM ANIMAL_OUTS
RIGHT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
RIGHT JOIN
을 이용하여ANIMAL_INS
테이블을 기준으로ANIMAL_OUTS
테이블을 조합한다.ANIMAL_OUTS.ANIMAL_ID
와ANIMAL_INS.ANIMAL_ID
가 값은 값만 가져온다.
WHERE ANIMAL_OUTS.DATETIME < ANIMAL_INS.DATETIME
ANIMAL_OUTS.DATETIME
값이ANIMAL_INS.DATETIME
보다 작은 값만 가져온다.
ORDER BY ANIMAL_INS.DATETIME
ANIMAL_INS.DATETIME
값을 기준으로 오름차순으로 정렬한다.
✅ 전체 코드
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_OUTS
RIGHT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_OUTS.DATETIME < ANIMAL_INS.DATETIME
ORDER BY ANIMAL_INS.DATETIME
[ 오랜 기간 보호한 동물(1) ]
🔗 문제 바로가기
문제 정리
1. 테이블 정리
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블
2. 필드 정보
ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일
INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름- 성별 및 중성화 여부
ANIMAL_INS
→SEX_UPON_INTAKE
ANIMAL_OUTS
→SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
3. 문제
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성하라. 이때 결과는 보호 시작일 순으로 조회해야 한다.
DATETIME
정보가ANIMAL_INS
에만 있는 레코드를 원한다.
→LEFT JOIN
이용!ANIMAL_OUTS
의ANIMAL_ID
와ANIMAL_INS
의ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_OUTS
에도DATETIME
정보가 있으므로ANIMAL_OUTS
의DATETIME
정보가 없는 것을 가져오기 위해서는NULL인 값만 가져와야 한다
는 조건을 추가해야 한다.ANIMAL_INS.DATETIME
값을 기준으로 오름차순으로 조회해야 한다.
풀이
✅ 코드 분석
SELECT INS.NAME, INS.DATETIME
NAME
과DATETIME
필드값을 조회한다.
FROM ANIMAL_INS AS INS
LEFT JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
LEFT JOIN
을 이용하여ANIMAL_INS
테이블을 기준으로ANIMAL_OUTS
테이블을 조합한다.ANIMAL_OUTS.ANIMAL_ID
와ANIMAL_INS.ANIMAL_ID
가 같은 값만 가져온다.AS
키워드를 이용하여 별칭을 부여하여 사용하였다.
WHERE OUTS.DATETIME IS NULL
OUTS.DATETIME
정보가 없는, 즉NULL
인 값만 가져온다.
ORDER BY INS.DATETIME
LIMIT 3
INS.DATETIME
값을 기준으로 오름차순으로 정렬한 뒤,3
개만 가져온다.
✅ 전체 코드
SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS AS INS
LEFT JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.DATETIME IS NULL
ORDER BY INS.DATETIME
LIMIT 3
[ 보호소에서 중성화한 동물 ]
문제 정리
1. 테이블 정리
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블
2. 필드 정보
ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일
INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름- 성별 및 중성화 여부
ANIMAL_INS
→SEX_UPON_INTAKE
ANIMAL_OUTS
→SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
3. 문제
보호소에서 중성화 수술을 거친 동물 정보를 알아보려고 한다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성하라.
- 중성화를 거치지 않은 동물은
Intact
, 중성화를 거친 동물은Spayed
또는Neutered
라고 표시되어 있다.
ANIMAL_OUTS
,ANIMAL_INS
테이블에 모두 있는 데이터를 가져와야 하므로INNER JOIN
을 사용한다.ANIMAL_OUTS
의ANIMAL_ID
와ANIMAL_INS
의ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_INS.SEX_UPON_INTAKE
값은'Intact'
를 포함해야 하고,ANIMAL_OUTS.SEX_UPON_OUTCOME
값은Spayed
또는Neutered
를 포함해야 한다.ANIMAL_ID
순으로 조회해야 한다.
풀이
✅ 코드 분석
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
ANIMAL_ID
와ANIMAL_TYPE
,NAME
필드값을 조회한다.
FROM ANIMAL_INS AS INS
JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
INNER JOIN
을 이용하여ANIMAL_INS
,ANIMAL_OUTS
테이블의 공통 부분을 가져온다.OUTS.ANIMAL_ID
와INS.ANIMAL_ID
가 같은 값만 가져온다.
WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND (SEX_UPON_OUTCOME LIKE "Spayed%"
OR SEX_UPON_OUTCOME LIKE "Neutered%")
ANIMAL_INS.SEX_UPON_INTAKE
값이"Intact"
를 포함하고,
ANIMAL_OUTS.SEX_UPON_OUTCOME
값이"Spayed"
또는"Neutered"
를 포함하는 값만 가져온다.
위의 조건을 다른 방식으로 표현할 수 있다.
1. NOT LIKE
이용
WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND SEX_UPON_OUTCOME NOT LIKE "%Intact%"
NOT LIKE
을 이용하여SEX_UPON_OUTCOME
이"Intact"
를 포함하지 않을 경우에만 가져오면 된다.
2. SEX_UPON_INTAKE와 SEX_UPON_OUTCOME 값 이용하기
WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND SEX_UPON_INTAKE != SEX_UPON_OUTCOME
- 중성화를 했다면
SEX_UPON_INTAKE
와SEX_UPON_OUTCOME
의 값이 달라지므로 값이 다른 경우에만 가져오면 된다.
ORDER BY INS.ANIMAL_ID
ANIMAL_ID
필드값을 기준으로 오름차순으로 정렬한다.
✅ 전체 코드
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS AS INS
JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND SEX_UPON_INTAKE != SEX_UPON_OUTCOME
ORDER BY INS.ANIMAL_ID
Author And Source
이 문제에 관하여([TIL] #7. 프로그래머스 JOIN), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mmy789/TIL-7.-프로그래머스-JOIN저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)