SQL JOIN

3 분 소요


최근 면접에서 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

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 벤 다이어그램

이미지 출처, https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


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 벤 다이어그램

이미지 출처, https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


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 벤 다이어그램

이미지 출처, https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


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 벤 다이어그램

이미지 출처, https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


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 벤 다이어그램

이미지 출처, https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


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 벤 다이어그램

이미지 출처, https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


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 벤 다이어그램

이미지 출처, https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


OPINION

포스트를 작성하면서 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;

REFERENCE

카테고리:

업데이트:

댓글남기기