SQL Join
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
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
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
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
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
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
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
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;
댓글남기기