본문 바로가기
킷도우의 IT/데이터베이스(Database)

[실무 경험담] 실무에서 필요한 JOIN문 딱 이것만 기억하자(INNER JOIN, LEFT JOIN, FULL OUTER JOIN)

by 킷도우 2022. 12. 10.
반응형

안녕하세요. IT Window 킷도우입니다.

 

학창 시절엔 이 JOIN문이 무진장 헷갈렸습니다. 그리고 JOIN문의 종류는 또 왜 이렇게 많은지... JOIN, INNER JOIN, LEFT JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 블라블라....시험 준비 때문에 어쩔 수 없이 달달 외워버리고 시험이 끝나면 다 잊어버리곤 했었는데요.

 

실무에서 6년 정도 개발/운영 업무를 하다보니 아래 3 가지 JOIN문만 알면 모든 쿼리를 조합해 낼 수 있으며 개발자가 작성한 웬만한 쿼리의 JOIN문을 이해할 수 있습니다.

 주의 할 점은 각 JOIN문 별로 동일한 결과를 보이는 쿼리 문임에도 불구하고, 쿼리 문을 작성하는 방식이 개개인마다 다른데 이건 반드시 알아 두도록 합시다. 아래와 같이 두 개의 테이블과 각 테이블에는 컬럼이 한 개 뿐이다고 가정하고 JOIN문을 설명해 보겠습니다. 월드컵 기간인 관계로 축가관련 테이블로 설명 드리겠습니다.

 

※설명

손흥민 선수와 김덕배 선수는 프리미어리그와 분데스리가에 모두 뛰었던 이력이 있다. 케인과 스털링 선수는 프리미어리그에서만 뛰었다. 뮐러와 로이스 선수는 분데스리가에서만 뛰었다. 고로 아래와 가이 테이블을 구성한다.

JOIN 설명을 위한 2개의 테이블

1. INNER JOIN(= JOIN, 교집합)

말 그대로 교집합을 구하고 싶을 때 쓰는 기능입니다. 프리미어리그와 분데스리가에 모두 뛰었던 선수들을 뽑 으라고 하면 INNER JOIN(또는 JOIN)을 사용하면 됩니다. 2가지의 표현 방식이 있습니다. 두 쿼리는 똑같은 결과를 가져옵니다.

 

표현 방식 1) 

SELECT P.PLAYER, B.PLAYER
FROM PREMI P
INNER JOIN BUNDES B ON P.PLAYER = B.PLAYER;

표현 방식 2) (제 경험상 이 방식을 더 많이 쓰는 것 같네요 ㅎㅎ)

SELECT P.PLAYER, B.PLAYER
FROM PREMI P
   , BUNDES B
 WHERE P.PLAYER = B.PLAYER

결과

INNER JOIN 결과, 교집합 즉 동일한 내용만 추출

 

2. LEFT JOIN(= LEFT OUTER JOIN, = (+))

LEFT JOIN을 하게 되면 왼쪽 테이블은 일단 무조건 고정됩니다. 즉 모든 데이터가 다 나옵니다. 그리고 JOIN 하려는 오른쪽 테이블에 교집합이 있을 경우 그 값을 표출, 없을 경우 NULL값으로 보여줍니다. 아래 쿼리를 적용한 결과를 보면서 이해해봅시다. 마찬가지로 아래 3가지 표현 방식은 모두 동일한 결과를 가져옵니다.

 

표현 방식 1)

SELECT P.PLAYER, B.PLAYER
FROM PREMI P
LEFT JOIN BUNDES B ON P.PLAYER = B.PLAYER;

표현 방식 2)

SELECT P.PLAYER, B.PLAYER
FROM PREMI P
LEFT OUTER JOIN BUNDES B ON P.PLAYER = B.PLAYER;

표현 방식 3)

SELECT P.PAYER, B.PLAYER
FROM PREMI P
   , BUNDES B
 WHERE P.PLAYER = B.PLAYER(+)

※ NULL값이 들어가는 오른쪽 테이블이 비었으니 채워주자, (+)해주자 라고 의미부여하면 잘 외워짐

 

결과

LEFT JOIN의 결과, LEFT OUTER JOIN의 결과, (+) 기호 사용의 결과(셋다 모두 동일한 결과다!!!)

참고로 Right outer join은 left join과 동일한 기능이다. 테이블을 왼쪽에 쓰냐 오른쪽에 쓰냐에 따라 차이지 결과는 다름 없다. 따라서 개발자들은 보통 left join으로 통일해서 쓰는듯하다.

 

3. FULL OUTER JOIN (= 합집합)

위 두 조인 문에 비해 활용도는 낮지만 반드시 알아야할 JOIN문 입니다. 조인하는 두 테이블의 모든 데이터 가 다 나옵니다. 이 때 교집합에 해당하는 것은 값을 채워서 보여주고 교집합이 아니라면 각각 NULL로 표출 합니다. 아래 쿼리 결과를 보면서 이해하면 쉽습니다.

 

표현 방식 1)

SELECT P.PLAYER, B.PLAYER
FROM PREMI P
FULL OUTER JOIN BUNDES B ON P.PLAYER = B.PLAYER;

잘못된 표현 방식

SELECT P.PAYER, B.PLAYER
FROM PREMI P
 , BUNDES B
 WHERE P.PLAYER(+) = B.PLAYER(+) -> 이건 오류 난다!

위 표현 방식은 혹시나 해서 그냥 만들어 봤습니다. 이렇게 쓰는 일은 없길 바랍니다. ㅎㅎ

 

결과

FULL OUTER JOIN 의 결과

 

이렇게 딱 3가지 조인문 INNER JOIN, LEFT JOIN, FULL OUTER JOIN만 알면 실무에서 조인 관련해서 헷갈리시는 일은 절대 없을 거라 장담합니다. 다만 각 조인문 별로 표현 방식이 여러 개 있으니 개념만 확실히 짚고 넘어가도록 합시다.

 

그럼 다음 시간에 또 인사드리겠습니다.

반응형

댓글