반응형

안녕하세요. 신기한 연구소입니다.

기본적으로 SQL 작업을 하는 개발자는 이 포스팅이 큰 의미가 없을 수 있어요.

하지만 처음 접하는 개발자나 오랜만에 사용해서 갑자기 생각이 안나는 경우를

대비해서 공유도 하고 나 자신도 활용하기 위해 작성해 봅니다.

 

 

이번 포스팅은 외부 조인(OUTER JOIN)입니다.

 

어떤 경우에 사용하는지 먼저 예를 들어봅니다. 

팀원 정보를 조회하는 화면이 있습니다.

관리자는 팀원들의 정보를 한눈에 보기를 원합니다.

하지만 테이블은 관련 정보를 기준으로 그룹화되어 여러 테이블로 분리되어 있습니다.

그 중 하나를 살펴보면..

관리자는 팀원들의 사내 동호회 활동에 대해 궁금해합니다.

하지만 모든 팀원들이 사내 동호회를 가입한 건 아닙니다.

 

 

이전 포스팅에서 배운 내부 조인(INNER JOIN)을 활용해 보면

사원 테이블과 동호회 테이블이 조인이 되어 서로 연결된 정보를

한 데이터 집합으로 화면에 조회가 됩니다.

 

 

그런데 문제가 발생합니다.

팀원이 12명인데 9명만 나오는 현상이 발생합니다.

왜 그런지 살펴보니 3명은 아직 동호회에 가입하지 않은 겁니다.

그래서 사원 정보에 동호회 코드가 NULL이기에 조인 성립이 되지 않아서

조회 대상에서 누락된 겁니다.

관리자는 팀원 전원인 12명의 정보를 원합니다.

가입이 안되었다면 ‘미가입’ 또는 빈칸으로 나오기를 바랍니다.

이런 경우 팀원 전원이 나와야 하기에 드라이빙 테이블이 됩니다.

그리고 동호회 테이블과 조인하면서 있으면 보여주고 없으면 NULL을

보여주면 됩니다.

 

이런 경우에 외부 조인(OUTER JOIN)을 사용하면 됩니다.

 

 

이제 원하는 데이터가 화면에 나와서 관리자는 만족할 겁니다.

그런데 쿼리를 보니 처음 보는 기호가 있습니다.

(+)인데요..

바로 이것이 외부 조인(+)에 사용하는 기호입니다.

기본 사용법은 다음과 같습니다.

주 테이블(드라이빙)은 그대로 두고 없어도 NULL을 더해서 보여주라고 (+)를

상대 테이블의 컬럼에 전부 붙여주면 됩니다.

 

 

위 쿼리를 보면 CLUBNO(+) <> ‘10’ 조건을 넣을 때 조인 조건이 아니지만

(+)를 넣었습니다.

WHERE절의 모든 조건 중 대상 테이블의 컬럼이 나오면 조인 조건이든 아니든

(+)를 붙여줘야 한다는 겁니다.

그리고 OR연산자에는 사용할 수 없습니다.

 

 

해당 쿼리는 오류가 발생합니다.

그런데 기존 버전에서는 IN 연산자는 IN의 조건 값이 하나를 초과하면

외부 조인이 안된다고 하는데 테스트해보니 잘 되네요.

 

 

개선되었나 봅니다.

다음으로 중요한 부분인데요.

대상 테이블의 컬럼에 외부 조인 (+)를 붙인 후 서브 쿼리와 사용할 수 없습니다.

 

 

이렇게 조회를 하면 오류가 발생하니 주의하세요.

 

이제 ANSI 표준에 대해 살펴보겠습니다.

외부 조인 사용방법은 내부 조인과 비슷합니다.

 

 

FROM절에 외부 조인을 적용한 쿼리입니다.

왼쪽 사원 테이블이 드라이빙 테이블이기에 LEFT를 사용했습니다.

기존 외부 조인에서 드라이빙 테이블은 그냥 두고 대상 테이블 컬럼에 (+) 붙인 것과 같습니다.

만약 동호회 테이블을 드라이빙 테이블로 사용하고 사원 테이블을 대상 테이블로 한다면

FROM 절에 RIGHT OUTER JOIN을 사용하면 됩니다.

오른쪽에 있는 테이블이 주 테이블(드라이빙)이라는 의미거든요.

그리고 OUTER를 생략해도 같은 의미가 됩니다.

 

 ANSI 기준에 따라 당연히 조인 조건은 ON, USING을 사용해야 합니다.

추가 조건은 ON, USING에 추가해도 되고

WHERE 절을 추가해서 사용해도 되지만 WHERE절에 조인 조건을 넣으면 오류가 납니다.

 

 

마지막으로 기존 조인에서 불가능한 부분을 ANSI에서 편하게 사용할 수 있는

외부 조인이 있습니다.

 

 

기존 조인은 드라이빙과 대상 테이블 두 군데 (+)를 붙일 수 없습니다.

두 번째 쿼리는 오류가 납니다.

왜 붙여야 하냐면..

만약 양쪽 테이블 정보를 서로 누락 없이 빈 곳은 NULL을 채워서

전부 보여주고 싶은 경우가 있을 겁니다.

기존 조인의 경우는 따로 조회해서 합쳐야 하는 번거로움이 있지만

ANSI를 사용하면 FULL OUTER JOIN으로 간단히 해결됩니다.

 

잘못된 정보나 수정이 필요하면 댓글 주세요.

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형