SQL Join

3 분 소요


0. 들어가면서

SQL 조인(join)과 관련된 내용을 정리하였습니다. 쿼리를 수행한 결과들을 살펴보면서 어떤 차이점이 있는지 살펴보겠습니다. 예시를 위해 다음과 같은 간단한 테이블과 데이터를 사용하겠습니다.

TABLE_A
A AA
1 7
2 8
3 9
4 NULL
5 NULL
TABLE_B
A AB
3 10
4 11
5 NULL
6 12
7 13

1. Inner Join

특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우에 해당하는 데이터를 가져옵니다. 벤 다이어그램(venn diagram) 이미지로 표현하면 교집합 형태가 됩니다.

Query
SELECT <select_list> 
    FROM TABLE_A tableA 
INNER JOIN TABLE_B tableB ON tableA.A = tableB.A
Result of Query
A AA A AB
3 9 3 10
4 NULL 4 11
5 NULL 5 NULL
Venn Diagram for Inner Join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

2. Left Join

특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우와 왼쪽 테이블에만 데이터가 존재하는 경우에 해당하는 데이터를 가져옵니다. 벤 다이어그램 이미지로 표현하면 왼쪽 테이블의 데이터 집합을 의미합니다.

Query
SELECT <select_list> 
    FROM TABLE_A tableA 
LEFT JOIN TABLE_B tableB ON tableA.A = tableB.A
Result of Query
A AA A AB
1 7 NULL NULL
2 8 NULL NULL
3 9 3 10
4 NULL 4 11
5 NULL 5 NULL
Venn Diagram for Left Join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

3. Right Join

특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우와 오른쪽 테이블에만 데이터가 존재하는 경우에 해당하는 데이터를 가져옵니다. 벤 다이어그램 이미지로 표현하면 오른쪽 테이블의 데이터 집합을 의미합니다.

Query
SELECT <select_list> 
    FROM TABLE_A tableA 
RIGHT JOIN TABLE_B tableB ON tableA.A = tableB.A
Result of Query
A AA A AB
3 9 3 10
4 NULL 4 11
5 NULL 5 NULL
NULL NULL 6 12
NULL NULL 7 13
Venn Diagram for Right Join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

4. Outer Join

Full Outer Join 혹은 Full Join

테이블의 모든 레코드(record)들을 가져온 후 특정 컬럼을 기준으로 동일 데이터를 가지는 경우에만 연결해주고 나머지는 NULL로 지정합니다. 벤 다이어그램 이미지로 표현하면 두 테이블의 전체 데이터 집합을 의미합니다.

Query
SELECT <select_list> 
    FROM TABLE_A tableA 
FULL OUTER JOIN TABLE_B tableB ON tableA.A = tableB.A
Result of Query
A AA A AB
1 7 NULL NULL
2 8 NULL NULL
3 9 3 10
4 NULL 4 11
5 NULL 5 NULL
NULL NULL 6 12
NULL NULL 7 13
Venn Diagram for Outer Join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

5. Left Excluding Join

Left Join 방식에서 교집합 영역을 제거한 데이터 영역입니다.

Left Join 방식에서 조인 시 기준으로 사용한 컬럼 값이 오른쪽 테이블에서 NULL인 경우를 찾아냅니다. 벤 다이어그램 이미지로 표현하면 왼쪽 테이블에만 존재하는 데이터 집합을 의미합니다.

Query
SELECT <select_list> 
    FROM TABLE_A tableA 
LEFT JOIN TABLE_B tableB ON tableA.A = tableB.A 
WHERE tableB.A IS NULL
Result of Query
A AA A AB
1 7 NULL NULL
2 8 NULL NULL
Venn Diagram for Left Excluding Join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

6. Right Excluding Join

Right Join 방식에서 교집합 영역을 제거한 데이터 영역입니다.

Right Join 방식에서 조인 시 기준으로 사용한 컬럼 값이 왼쪽 테이블에서 NULL인 경우를 찾아냅니다. 벤 다이어그램 이미지로 표현하면 오른쪽 테이블에만 존재하는 데이터 집합을 의미합니다.

Query
SELECT <select_list> 
    FROM TABLE_A tableA 
RIGHT JOIN TABLE_B tableB ON tableA.A = tableB.A 
WHERE tableA.A IS NULL
Result of Query
A AA A AB
NULL NULL 6 12
NULL NULL 7 13
Venn Diagram for Right Excluding Join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

7. Outer Excluding Join

Outer Join 방식에서 교집합 영역을 제거한 데이터 영역입니다.

Outer Join 방식에서 조인 시 기준으로 사용한 컬럼 값이 왼쪽 테이블에서 NULL인 경우 혹은 오른쪽 테이블에서 NULL인 경우를 찾아냅니다. 벤 다이어그램 이미지로 표현하면 두 테이블의 데이터에서 교집합 영역을 제거한 데이터 집합을 의미합니다.

Query
SELECT <select_list> 
    FROM TABLE_A tableA 
FULL OUTER JOIN TABLE_B tableB ON tableA.A = tableB.A 
WHERE tableA.A IS NULL OR tableB.A IS NULL
Result of Query
A AA A AB
1 7 NULL NULL
2 8 NULL NULL
NULL NULL 6 12
NULL NULL 7 13
Venn Diagram for Outer Excluding Join

https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

CLOSING

포스트를 작성하면서 MySQL의 경우 Outer Join(Full Outer Join) 키워드를 처리하지 못 합니다. UNION 키워드를 사용하여 같은 결과를 얻을 수 있습니다.

Outer Join Query in MySQL
SELECT * 
    FROM mysqldb.TABLE_A tableA 
LEFT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A

UNION

SELECT * 
    FROM mysqldb.TABLE_A tableA 
RIGHT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A;
Outer Excluding Join Query in MySQL
SELECT * 
    FROM mysqldb.TABLE_A tableA 
LEFT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A 
WHERE tableB.A IS NULL

UNION

SELECT * 
    FROM mysqldb.TABLE_A tableA 
RIGHT JOIN mysqldb.TABLE_B tableB ON tableA.A = tableB.A 
WHERE tableA.A IS NULL;

REFERENCE

카테고리:

업데이트:

댓글남기기