[Database] Inner Join과 Outter Join(1)

2011. 6. 8. 13:20Database

책의 설명 이해 안가서 결국 실행 해보고서야 이해가 갔습니다. Join에 대해 많이 부족하지만제가 깨달은(?) 정보만 밑에다가 정리하겠습니다.. 


1. ' JOIN ' = 교집합, 하는 짓은 3단 논법? 

즉  밑에와 같은 테이블이 2개가 있다고 생각해 보자.

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



단순하게 왼쪽 테이블만 본다면 '가1'의 직책은 3이 된다. 
하지만 두개의 테이블을 보고 머리속으로 생각을 조금만 한다면 
" 가1의 직책은 3이지만 실제로는 과장이 구나 " 라고 생각할 수 있을 것이다. 왜냐하면 두개의 테이블을 보고 머리속에서 스스로 결합했기 때문이다.

머리속을 들여다 보면 간단한 그 유명한 소크라테스 형이 말한 '3단 논법'으로  밑에와 같은 작업을 했을 것이다.

가1 = 3
3 =  과장   +
------------
가1 = 과장


위와 같이 간단한 정보여야 머리속에서 합칠 수 있다. 하지만 거대한 Data 앞에서는 저렇게 바보 같이 하지 말고 JOIN이라는 명령어를 쓰자. JOIN이란 조금 전에 머리속에서 했던 결합이라고 생각하면 된다.


2. JOIN ?

JOIN 은 교집합 ? 간단하게 교집합을 생각해 보자. 두 집합에서 서로 일치하는 데이터가 없으면 그건 교집합을 해도 결과 값은 없다. 즉 일치하는 데이터가 없다는 것을 증명하는 일이 아니면 결국 쓸데 없이 머리 쓴 것이다. 
이처럼 일치하는 데이터도 없이 JOIN을 하면 그건 결국 뻘짓 된다.
(자료형 또한 맞지 않으면 에러가 난다.)

그럼 위에 빨간 박스에서 일치하는 데이터는 무엇일까? 3 이다.

가1 = 3
3 =  과장   +
------------
가1 = 과장

즉 윗 줄에 있는 3은 사용자 테이블의 직책 컬럼이다. 밑에 줄에 있는 3은 사용자코드 테이블의 코드 컬럼이다. 즉 사용자 테이블의 직책 컬럼과 사용자 코드의 코드 컬럼을 JOIN하는 것이다.

3. Inner Join
그럼 자 이제 밑에 보이는 sql을 보자

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


요롷게 하면 결과는 어떻게 될 것인가?

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

출력 될 것이다. ( 이런 조인을 Inner Join이라고 한다. )
위에 파란색 박스(테이블 정보)를 보고 위에 결과를 보면 아 그렇구나~ 당연히 저렇게 되겠지. 흔히 단순하게 생각하면 그렇다. 나도 저렇게 생각했지만 막상 쓰려로 하니깐. 어려웠다. 왜 어려웠냐 감만 잡았기 때문이다. 그렇기 때문에 혹시 아직 이해가 안되거나 어려운 사람을 위해 좀 더 작업을 설명 하겠다. 

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

위 sql을 멋대로 해석 이다. 
1). FROM 사용자,  사용자코드 : 
 FROM 작업을 했을 것이다. 사용자 테이블과 사용자 코드 테이블의 테이블 영역을 참조하기 시작했을 것이다.

2).WHERE 사용자.직책 = 사용자코드.코드 :
 이제 where 작업을 할 것이다. 사용자.직책 = 사용자코드.코드 작업 즉 join을 한다. 위에 제목에 설명했듯이 '3단 논리'를 생각하면 될것이다.

가1      3     -----------------------> 1           사장   (3 = 1 ? false)
                                |------------> 2           부장   (3 = 2 ? false)
                                |------------> 3           과장   (3 = 3 ? true)  
                                |------------> 4           대리   (3 = 4 ? false)
                                |------------> 5           사원   (3 = 5 ? false) 

가2      5     -----------------------> 1           사장   (5 = 1 ? false)
                                |------------> 2           부장   (5 = 2 ? false)
                                |------------> 3           과장   (5 = 3 ? false)
                                |------------> 4           대리   (5 = 4 ? false)
                                |------------> 5           사원   (5 = 5 ? true) 

가3            -----------------------> 1           사장   (  = 1 ? false)
                                |------------> 2           부장   (  = 2 ? false)
                                |------------> 3           과장   (  = 3 ? false)
                                |------------> 4           대리   (  = 4 ? false)
                                |------------> 5           사원   (  = 5 ? false) 

가4      2     -----------------------> 1           사장   (4 = 1 ? false)
                                |------------> 2           부장   (4 = 2 ? false)
                                |------------> 3           과장   (4 = 3 ? false)
                                |------------> 4           대리   (4 = 4 ? true)
                                |------------> 5           사원   (4 = 5 ? false) 

가5      1     -----------------------> 1           사장   (1 = 1 ? ture)
                                |------------> 2           부장   (1 = 2 ? false)
                                |------------> 3           과장   (1 = 3 ? false)
                                |------------> 4           대리   (1 = 4 ? false)
                                |------------> 5           사원   (1 = 5 ? false) 

가6      3     -----------------------> 1           사장   (1 = 1 ? false)
                                |------------> 2           부장   (3 = 2 ? false)
                                |------------> 3           과장   (3 = 3 ? true)
                                |------------> 4           대리   (3 = 4 ? false)
                                |------------> 5           사원   (3 = 5 ? false) 

가7            -----------------------> 1           사장   ( = 1 ? false)
                                |------------> 2           부장   ( = 2 ? false)
                                |------------> 3           과장   ( = 3 ? false)
                                |------------> 4           대리   ( = 4 ? false)
                                |------------> 5           사원   ( = 5 ? false) 

이와 같은 작업을 하게 된다.
위에서 true가 될때마다 새로운 래코드만 만들어 진다. 즉 select 되기 전의 JOIN만 된상태는 이럴 것이다. (view라고 부르는 것 같다.) 

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


즉 조건이 맞은 테이블의 레코드 끼리 합체 했다고 생각하면 된다. 

3). SELECT 사용자.이름,  사용자코드.명 :

의에 있는 사용자.이름 과 사용자코드.명을 뽑아 낸 것이다. 그래서 결과는 이와 같이 나왔다. 이런 것을 Inner Join 이라고 한다.

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

'Database' 카테고리의 다른 글

[Database] Inner Join과 Outer Join(2)  (0) 2011.06.08