JOINs
Concept
What is 'JOIN'?
- 두 테이블(혹은 view)의 결과 row들을 하나의 결과 row들로 결합하는 과정을 Join이라 한다.
이 때, 결합하는 과정에서 조건 이 존재할 수 있는데, 이를 'Join 조건' 이라 한다. - 일반적으로 Join의 처리과정은 Tree 형태로 표현한다.
- Join의 Tree에서, Join의 하위 노드 중 왼쪽 노드를 'Outer node', 오른쪽 노드를 'Inner node'라 한다..
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.
마침.
'IT > Database Concepts' 카테고리의 다른 글
[DB개념] :: Index Structures (인덱스 구조) (2) | 2018.04.13 |
---|---|
[DB개념] :: Representing Data Elements (데이터 엘리먼트의 표현) (0) | 2018.04.10 |
[DB개념] :: Constraints and Triggers (제약과 트리거) (0) | 2018.04.06 |
[DB개념] :: Define on SQL about kinds of Relations (다양한 릴레이션에 대한 SQL) (0) | 2018.04.04 |
[DB개념] :: SQL (Structured Query Language, 구조화 질의어) (0) | 2018.04.03 |