본문 바로가기
알고리즘, 문제해결/알고리즘, 자료구조

[SQL] JOIN

by 카펀 2021. 3. 11.

프로그래머스 링크: 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에 명시하였습니다.

'알고리즘, 문제해결 > 알고리즘, 자료구조' 카테고리의 다른 글

C++의 auto에 대해  (0) 2021.08.31
[SQL] String, Date  (0) 2021.03.11
[SQL] is Null  (0) 2021.03.11
[SQL] Group By  (0) 2021.03.10
[SQL] SUM, MAX, MIN  (0) 2021.03.10

댓글