[Database] Inner Join과 Outer Join(2)

2011. 6. 8. 13:21Database

초보가 초보에게.. ( 잘못된 내용은 답변 좀 달아 주시면 감사하겠습니다.)
Inner Join과 비슷하지만 기준 혹은 분류가 된다고 생각한다.

2. Outer Join : 기준과 분류

사용자                                       사용자코드
이름          직책                           코드             명                           
---------------                          ---------------
가1              3                              1              사장
가2              5                              2              부장
가3                                             3               과장
가4              2                              4              대리
가5              1                              5              사원
가6              3
가7


조금 전에 썻던 테이블을 다시 사용해 보자.

아래에 설명 되어 있는 Inner Join은 직책을 가지고 있는 사용자만 출력 되었다.
'가3' 과  '가7'은 표시 되지 않았다. 그렇다면 사용자 전부를 보고 싶을 때는 어떻게 할까?
혹은 사장,부장,과장,대리,사원인 직책 별로 보고 싶을 때는 어떻게 하는 것이 좋을까?
그것을 위한 것이 Outer Join이다.
Outer Join의 표기 방법은 오라클을 기준으로 표현한다.

OUTER JOIN 이란 기준이 되는 테이블 래코드와 과 거기에 붙은 테이블 래코드가 있다고 생각하면 이해가 편할 것 같다. 또한 기준이 되는 레코드를 중심으로 분류 된다.
이렇게 설명하면 무척 어려울 것이다. 단 두 단어 기준, 분류만을 기억하고 밑에 예를 보자.

1) Left Outer Join

사실 Left, right Join의 차이점은 기준이다. Left Join 시켰어도 위치만 바꿔 주면 그것이 right join이 된다. 그건 밑에서 다시 설명하겠다.

그럼 첫번째로 위에서 언급한 모든 사용자를 출력해 그에 맞는 직책을 출력을 시켜 보겠다.

밑에 건 LEFT JOIN을 이용한 것이다.

 SELECT 사용자.이름, 사용자코드.명 FROM 사용자, 사용자코드
 WHERE 사용자.직책 =  사용자코드.코드(+)


 SELECT 사용자.이름, 사용자코드,명 FROM 사용자 
 LEFT JOIN 사용자코드 ON 사용자.직책 = 사용자코드.코드
(위에 박스에 있는 것이 오라클에서만 사용되는 문법이다.
아래 박스에 보이는 것이 표준으로 정의된 사용법이며 모든 DBMS에서 적용된다.)


OUTER 조인을 설명하기 위해서 방 개념을 사용해 보겠다.

위에서 실행된 쿼리는 사용자의 래코드가 기준이 되서 사용카코드의 래코드가 붙는 테이블이다. 그리고분류된 조건(붙는 조건)은 사용자.직책 = 사용자코드.코드 이다.

가1 가2  가3   가4  가5  가6  가7 
과장  사원    부장  사장 과장  

위에 행이 기준이 된 래코드고 밑에 행이 붙은 래코드라고 생각하면 된다. 즉 출력을 해 보면

이름                명
-----------------
가1                 과장
가2                 사원
가3
가4                 부장
가5                 사장
가6                 과장
가7             

이런 출력이 될 것이다.  Inner Join과 다른 점이 어떤 것이가? 여기서는 빈칸(NULL)이 존재한다. 기준이 되는 사용자래코드는 매핑되는 값이 없어도 출력이 된다 . (101~107호 까지 있는 집에서 103호 주인이 없다고 방이 없어지지는 않지 않는가.) 이렇게 보면 사용자마다 직책을 알 수 있고 지금 직책이 없는 사람은 누군지 알수 있다.


이제는 직책에 따른 사용자가 누군지 알아 보자. 
이젠 생각해 보면 기준은 사용자코드의 직책이 될 것이고 붙는 것은 사용자 래코드 일 것이다. 분류는 역시 직책으로 한다. 
밑에는 RIGHT JOIN을 이용한 것이다. 

 SELECT 사용자.이름, 사용자코드.명 FROM 사용자, 사용자코드
 WHERE 사용자.직책(+) =  사용자코드.코드


 SELECT 사용자.이름, 사용자코드,명 FROM 사용자 
 RIGHT JOIN 사용자코드 ON 사용자.직책 = 사용자코드.코드
(위에 박스에 있는 것이 오라클에서만 사용되는 문법이다.
아래 박스에 보이는 것이 표준으로 정의된 사용법이며 모든 DBMS에서 적용된다.)


 사장 부장  과장  대리  사원 
 가5 가4   가1, 가6    가2


이걸 출력 해 본다면

이름                명
-----------------
가5                 사장
가4                 부장
가1                 과장
가6                 과장
                      대리
가2                 사원
                       

역시 기준이 되는 직책은 다 출력이 되었다. 하지만 사용자.이름을 보면 대리 부분에서 빈칸(null)이 출력되었다. 즉 대리는 한명도 없다는 것이다. 또한 직책이 없던 가3, 가7 또한 역시 출력되지 않았다. 

Outer join은 즉 어떤 기준에 의해서 1:N의 데이터를 가지고 온다고 생각하면 된다. 1은 기준이 되는 테이블의 래코드 이며 N은 붙는 테이블의 래코드 이다. 즉 기준의 되는 테이블의 데이터는 최소한 1번이라도 출력이 된다고 생각하면 된다. 

reft 와 right 조인은 기준이 되는 테이블을 어디에 위치하는 가에 따라서 바뀐다. 즉 sql문에서 테이블 위치만 바꾸어 주면 ring->left, left->right 조인으로 바뀌는 것이다.



두서 없는 설명이었고 틀린 부분도 많을 것입니다. 혹시 지나가다가 보시는 분들 중에 수정해야 할 것 같다는 점은 뎃글로 달아 주시면 감사하겠습니다.

'Database' 카테고리의 다른 글

[Database] Inner Join과 Outter Join(1)  (0) 2011.06.08