JOINs 


Concept

What is 'JOIN'?

  • 두 테이블(혹은 view)의 결과 row들을 하나의 결과 row들로 결합하는 과정을 Join이라 한다.
    이 때, 결합하는 과정에서 조건 이 존재할 수 있는데, 이를 'Join 조건' 이라 한다.
  • 일반적으로 Join의 처리과정은 Tree 형태로 표현한다.
  • Join의 Tree에서, Join의 하위 노드 중 왼쪽 노드를 'Outer node', 오른쪽 노드를 'Inner node'라 한다..

https://www.lucidchart.com/publicSegments/view/8efab5c8-84d3-443c-8d78-d73308bb64e9/image.png 

Various Types of Joins

정말 다양한 Join의 종류가 있지만, 

1. Cross Join
2. Inner Join
3. Outer Join
4. Semi Join
5. Anti Join

이 5가지를 먼저 살펴보자.

또한 설명에 사용될 테이블( t1, t2 )

SQL>


SELECT * FROM t1; A B - - 1 a 2 b 2 rows selected.


SQL>


SELECT * FROM t2; C D - - 4 d 5 e 2 rows selected.

들을 예로 들겠다.


1. Cross Join

  • Join 조건이 없는 가장 기본적인 Join. Outer node와 Inner node의 모든 row가 결합되어 반환된다.


예 : Cross Join

SQL>


SELECT a, c FROM t1, t2; A C - - 1 4 1 5 2 4 2 5 4 rows selected.



2. Inner Join

  • Join 조건이 있는 Join. node의 각 row에 대해 조건을 만족하는 row에 대해서만 결합하여 반환한다.
  • Join 조건은 column들간의 연산자로 구성되어 있으며, 
    이 때 이 연산자가 등호(=)이면 'Equi-Join'이라 한다.



예 : Inner Join ( Equi-Join )

SQL>


SELECT a, b, c, d FROM t1, t2 WHERE a + 3 = c; A B C D - - - - 1 a 4 d 2 b 5 e 2 rows selected.



예 : Inner Join ( Non-Equi-Join )

SQL>


SELECT a, b, c, d FROM t1, t2 WHERE a < c; A B C D - - - - 1 a 4 d 1 a 5 e 2 b 4 d 2 b 5 e 4 rows selected.



3. Outer Join

  • Join 조건을 만족하는 row에 대해 결합하고, 만족하지 않는 row에 대해 NULL 데이터만을 갖는 row와 결합하여 반환한다.
  • Left Outer Join, Right Outer Join, Full Outer Join이 있다.
  • ( A LEFT OUTER JOIN B ) 와 ( B RIGHT OUTER JOIN A )는 완전 동치이다.
  • Join 조건을 where에서가 아닌 'ON'에서 힌트를 준다.



ON vs WHERE 

ON은 말 그대로 JOIN 수행 중 계속 검사하는 Join 조건이지만,
WHERE는 조인이 다 끝난 후의 filtering을 시행한다. 
미세한 차이점 알아두기 !





예 : Left Outer Join

SQL>


SELECT a, b, c FROM t1 LEFT OUTER JOIN t2 ON a > 1; A B C - - ---- 1 a null 2 b 4 2 b 5 3 rows selected.



예 : Full Outer Join

SQL>


SELECT a, b, c FROM t1 FULL OUTER JOIN t2 ON a > 1 AND c < 5; A B C ---- ---- ---- 1 a null 2 b 4 null null 5 3 rows selected.



4. Semi Join

  • Join 조건이 존재해야 하며, 부합하는 row들 중 Outer node와의 Join 결과를 반환한다. ( Outer node의 row만 )
  • 또, SQL 구문상 직접 기술할 수 없어, 'IN' 'EXISTS' 등의 ANY형 연산자 로 표현한다.
  • Join 조건에 대한 Index가 존재하고, Inner node의 Unique가 보장되면 'Inverted Semi Join'또한 할 수 있다.



예 : Semi Join

SQL>


SELECT a FROM t1 WHERE a + 3 IN ( SELECT C FROM t2 WHERE d = 'd' ); A - 1 1 row selected.



5. Anti Join

  • Join 조건에 부합하지 않는 Outer node의 row들만을 반환한다.
  • 반드시 NULL 처리가 필요하다. ( oracle 11 버전부터는 명시하지 않아도 가능 )



예 : Anti Join

SQL>


SELECT a FROM t1 WHERE a + 3 NOT IN ( SELECT C FROM t2 WHERE d = 'd' ); A - 2 1 row selected.





마침.


블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,