SQL JOIN
0. 들어가면서
최근 면접에서 INNER JOIN과 OUTER JOIN의 차이점을 설명해달라는 질문을 받았을 때 제가 SQL과 얼마나 친하지 않은지 다시 한번 깨달았습니다. INNER JOIN과 OUTER JOIN의 차이점을 명쾌하게 설명할 수 있도록 SQL JOIN에 대한 정리를 이번 포스트에서 해보고자 합니다. 아래와 같은 데이터를 가지는 두 개의 테이블이 있을 때 여러 JOIN 방법을 수행하여 얻은 결과와 벤 다이어그램 이미지를 사용하여 글을 작성하였습니다.
테이블A
A | AA |
---|---|
1 | 7 |
2 | 8 |
3 | 9 |
4 | NULL |
5 | NULL |
테이블B
A | AB |
---|---|
3 | 10 |
4 | 11 |
5 | NULL |
6 | 12 |
7 | 13 |
1. INNER JOIN
특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우에 해당하는 데이터를 가져옵니다. 벤 다이어그램 이미지로 표현하면 교집합 형태가 됩니다.
QUERY
SELECT <select_list> FROM A A INNER JOIN B B ON A.A = B.A
QUERY 수행 결과
A | AA | A | AB |
---|---|---|---|
3 | 9 | 3 | 10 |
4 | NULL | 4 | 11 |
5 | NULL | 5 | NULL |
INNER JOIN 벤 다이어그램
2. LEFT JOIN
특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우와 왼쪽 테이블에만 데이터가 존재하는 경우에 해당하는 데이터를 가져옵니다. 벤 다이어그램 이미지로 표현하면 왼쪽 테이블의 데이터 집합을 의미합니다.
QUERY
SELECT <select_list> FROM A A LEFT JOIN B B ON A.A = B.A
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 |
LEFT JOIN 벤 다이어그램
3. RIGHT JOIN
특정 컬럼을 기준으로 두 테이블에 모두 데이터가 존재하는 경우와 오른쪽 테이블에만 데이터가 존재하는 경우에 해당하는 데이터를 가져옵니다. 벤 다이어그램 이미지로 표현하면 오른쪽 테이블의 데이터 집합을 의미합니다.
QUERY
SELECT <select_list> FROM A A RIGHT JOIN B B ON A.A = B.A
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 |
RIGHT JOIN 벤 다이어그램
4. OUTER JOIN
‘FULL OUTER JOIN’, ‘FULL JOIN’ 이라고도 합니다. 테이블의 모든 ROW들을 가져온 후 특정 컬럼을 기준으로 동일 데이터를 가지는 경우에만 연결해주고 나머지는 NULL을 SETTING 합니다. 벤 다이어그램 이미지로 표현하면 두 테이블의 전체 데이터 집합을 의미합니다.
QUERY
SELECT <select_list> FROM A A FULL OUTER JOIN B B ON A.A = B.A
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 |
OUTER JOIN 벤 다이어그램
5. LEFT EXCLUDING JOIN
LEFT JOIN 방식에서 교집합 영역을 제거한 데이터 영역입니다. LEFT JOIN 방식에서 JOIN 시 기준으로 사용한 컬럼 값이 오른쪽 테이블에서 NULL인 경우를 찾아냅니다. 벤 다이어그램 이미지로 표현하면 왼쪽 테이블에만 존재하는 데이터 집합을 의미합니다.
QUERY
SELECT <select_list> FROM A A LEFT JOIN B B ON A.A = B.A WHERE B.A IS NULL
QUERY 수행 결과
A | AA | A | AB |
---|---|---|---|
1 | 7 | NULL | NULL |
2 | 8 | NULL | NULL |
LEFT EXCLUDING JOIN 벤 다이어그램
6. RIGHT EXCLUDING JOIN
RIGHT JOIN 방식에서 교집합 영역을 제거한 데이터 영역입니다. RIGHT JOIN 방식에서 JOIN 시 기준으로 사용한 컬럼 값이 왼쪽 테이블에서 NULL인 경우를 찾아냅니다. 벤 다이어그램 이미지로 표현하면 오른쪽 테이블에만 존재하는 데이터 집합을 의미합니다.
QUERY
SELECT <select_list> FROM A A RIGHT JOIN B B ON A.A = B.A WHERE A.A IS NULL
QUERY 수행 결과
A | AA | A | AB |
---|---|---|---|
NULL | NULL | 6 | 12 |
NULL | NULL | 7 | 13 |
RIGHT EXCLUDING JOIN 벤 다이어그램
7. OUTER EXCLUDING JOIN
OUTER JOIN 방식에서 교집합 영역을 제거한 데이터 영역입니다. OUTER JOIN 방식에서 JOIN 시 기준으로 사용한 컬럼 값이 왼쪽 테이블에서 NULL인 경우 혹은 오른쪽 테이블에서 NULL인 경우를 찾아냅니다. 벤 다이어그램 이미지로 표현하면 두 테이블의 데이터에서 교집합 영역을 제거한 데이터 집합을 의미합니다.
QUERY
SELECT <select_list> FROM A A FULL OUTER JOIN B B ON A.A = B.A WHERE A.A IS NULL OR B.A IS NULL
QUERY 수행 결과
A | AA | A | AB |
---|---|---|---|
1 | 7 | NULL | NULL |
2 | 8 | NULL | NULL |
NULL | NULL | 6 | 12 |
NULL | NULL | 7 | 13 |
OUTER EXCLUDING JOIN 벤 다이어그램
CLOSING
포스트를 작성하면서 MySQL의 경우 OUTER JOIN(FULL OUTER JOIN) 키워드를 처리하지 못한다는 사실을 알았습니다. UNION 키워드를 사용하여 같은 결과를 얻을 수 있으며 잊어버리지 않기 위해 기록해두도록 하겠습니다.
OUTER JOIN QUERY(MySQL)
SELECT * FROM mysqldb.A A LEFT JOIN mysqldb.B B ON A.A = B.A
UNION
SELECT * FROM mysqldb.A A RIGHT JOIN mysqldb.B B ON A.A = B.A;
OUTER EXCLUDING JOIN QUERY(MySQL)
SELECT * FROM mysqldb.A A LEFT JOIN mysqldb.B B ON A.A = B.A WHERE B.A IS NULL
UNION
SELECT * FROM mysqldb.A A RIGHT JOIN mysqldb.B B ON A.A = B.A WHERE A.A IS NULL;
댓글남기기