[SQL] JOIN
프로그래머스 링크: programmers.co.kr/learn/courses/30/parts/17046
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코딩 테스트의 SQL 문제를 대비하기 위해 공부하며 정리한 글입니다.
JOIN과 관련된 내용이 코딩 테스트 대비 시에 제일 중요한 부분 같습니다.
1. 없어진 기록 찾기
programmers.co.kr/learn/courses/30/parts/17046
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
ANIMAL_INS와 ANIMAL_OUTS 테이블로부터, 입양을 간 기록은 있는데 보호소에 들어온 기록이 없는 동물들의 ID와 이름을 ID 순으로 정렬하여 출력하는 문제.
SELECT b.ANIMAL_ID, b.NAME
FROM ANIMAL_INS a right JOIN ANIMAL_OUTS b on a.ANIMAL_ID = b.ANIMAL_ID
WHERE a.ANIMAL_ID is NULL
ORDER BY b.ANIMAL_ID
Foreign key를 이용하여 서로 다른 두 테이블을 JOIN 합니다.
2. 있었는데요 없었습니다
programmers.co.kr/learn/courses/30/lessons/59043
코딩테스트 연습 - 있었는데요 없었습니다
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디
programmers.co.kr
ANIMAL_INS와 ANIMAL_OUTS 테이블로부터, 보호 시작일보다 입양일이 더 빠른 동물들의 ID와 이름을 보호 시작일이 빠른 순으로 정렬하여 출력하는 문제.
SELECT b.ANIMAL_ID, b.NAME
FROM ANIMAL_INS a RIGHT JOIN ANIMAL_OUTS b on a.ANIMAL_ID = b.ANIMAL_ID
WHERE a.DATETIME > b.DATETIME
ORDER BY a.DATETIME
앞의 문제와 비슷하게 JOIN을 수행하고, WHERE 부분에서 조금 차이가 나는 문제입니다.
3. 오랜 기간 보호한 동물(1)
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
ANIMAL_INS와 ANIMAL_OUTS 테이블로부터, 아직 입양을 가지 못한 동물들 중 가장 오래 있었던 동물 3마리의 이름과 보호 시작일을, 보호 시작일을 기준으로 정렬하여 출력하는 문제.
SELECT a.NAME, a.DATETIME
FROM ANIMAL_INS a LEFT JOIN ANIMAL_OUTS b on a.ANIMAL_ID = b.ANIMAL_ID
WHERE b.DATETIME is NULL
ORDER BY a.DATETIME
LIMIT 3
Join에는 총 세 가지가 있습니다. Inner Join, Right Join, Left Join. 위의 코드의 경우 RIGHT JOIN을 사용하면 아무런 결과도 나오지 않습니다.
Inner Join은 두 테이블 A, B간의 교집합을 의미합니다. 즉, A, B 양쪽에 다 있는 필드에 대해서만 join을 수행합니다.
Inner Join을 Full Join이라고 하는데, WHERE로 필터링을 하기 전에는 테이블 A와 테이블 B가 CROSS JOIN이 된 상태로 A의 항목 수 x B의 항목 수가 된다고 합니다. 즉 가능한 경우의 수가 모두 join되는 것인데, 양 테이블에 항목이 많다면 어마어마한 크기의 결과물이 나오게 됩니다.
Left Join, Right Join은 Outer Join 입니다. Left Outer Join, Right Outer Join을 줄인 표현이라고 볼 수 있습니다.
표현은 다음과 같습니다.
'기준이 되는 테이블' LEFT JOIN '기준에 따라가는 테이블' ON 조건문
'기준에 따라가는 테이블 'RIGHT JOIN '기준이 되는 테이블 ON 조건문
즉 1, 2번 문제에서는 SELECT에서 b를 골랐으므로 b가 기준이 되는 테이블이 되도록 RIGHT JOIN을 사용했으며,
3번 문제에서는 SELECT에서 a를 골랐으므로 a가 기준이 되는 테이블이 되도록 LEFT JOIN을 사용했습니다.
(출처: nbdevelop.tistory.com/9)
4. 보호소에서 중성화한 동물
programmers.co.kr/learn/courses/30/lessons/59045
코딩테스트 연습 - 보호소에서 중성화한 동물
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디
programmers.co.kr
ANIMAL_INS와 ANIMAL_OUTS 테이블로부터, 보호소에 들어올 때는 중성화가 되지 않았었지만, 보호소를 나갈 때는 중성화가 된 동물의 아이디와 생물 종, 이름을 아이디 순으로 조회하여 출력하는 문제.
SELECT a.ANIMAL_ID, a.ANIMAL_TYPE, a.NAME
FROM ANIMAL_INS a LEFT JOIN ANIMAL_OUTS b on a.ANIMAL_ID = b.ANIMAL_ID
WHERE a.SEX_UPON_INTAKE != b.SEX_UPON_OUTCOME
ORDER BY a.ANIMAL_ID
위에서 언급한 규칙에 따라 Left Join을 사용하였습니다.
중성화를 했다면 들어올 때와 나올 때의 성별이 다를 것이므로, 이를 WHERE에 명시하였습니다.