외부조인
외부조인(outer join)은 관계형 데이터베이스에서 두 테이블 간의 조인을 수행할 때, 조인 조건을 만족하지 않는 행도 포함하여 결과를 반환하는 조인 방식이다. 조인 조건에 일치하는 행은 물론이고, 한쪽 테이블에는 존재하지만 다른 쪽에는 일치하는 행이 없는 경우에도 결과에 포함된다.
외부조인은 세 가지 형태로 나뉜다. 왼쪽 외부조인(LEFT OUTER JOIN), 오른쪽 외부조인(RIGHT OUTER JOIN), 그리고 완전 외부조인(FULL OUTER JOIN)이다.
외부조인의 기본 목적은 누락된 데이터를 포함한 더 완전한 데이터를 얻는 것이다. 내부조인과 달리, 일치하지 않는 행도 NULL 값을 채워서 결과에 표시되므로, 데이터 누락 없이 분석이 가능하다. SQL에서는 LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN 키워드를 사용하여 외부조인을 구현한다.
특징[편집]
- 조건 불일치 행도 포함
- 외부조인은 조인 조건을 만족하지 않는 행도 결과에 포함한다는 점에서 내부조인과 다르다. 조건에 맞지 않는 값은 NULL로 채워진다.
- 세 가지 유형으로 구분됨
- LEFT OUTER JOIN: 왼쪽 테이블의 모든 행을 포함하고, 오른쪽 테이블에서 일치하는 행이 없으면 NULL을 채운다.
- RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행을 포함하고, 왼쪽 테이블에서 일치하는 행이 없으면 NULL을 채운다.
- FULL OUTER JOIN: 양쪽 테이블의 모든 행을 포함하며, 일치하지 않는 부분은 각각 NULL로 채운다.
- 데이터 누락 방지
- 조인 조건을 만족하지 않는 행도 결과로 가져올 수 있기 때문에, 전체 데이터를 보존해야 할 때 유용하다. 특히 데이터 집계나 통계를 낼 때 누락 없이 전체 범위를 확인할 수 있다.
- NULL 값이 결과에 자주 포함됨
- 외부조인은 조인 조건을 만족하지 않는 경우 NULL 값을 반환하므로, 결과 테이블에는 NULL이 많이 포함될 수 있다. 이로 인해 후속 처리 시 NULL 처리 로직이 필요하다.
- 성능에 영향 줄 수 있음
- 내부조인보다 많은 데이터를 반환할 수 있기 때문에, 테이블이 크거나 인덱싱이 적절하지 않으면 성능에 영향을 줄 수 있다.
종류[편집]
왼쪽 외부 조인[편집]
왼쪽 외부 조인의 예, 부가적인 결과 열 (내부 조인과 비교하여)은 이탤릭체:
SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Jones | 33 | 기술부 | 33 |
Rafferty | 31 | 영업부 | 31 |
Robinson | 34 | 사무부 | 34 |
Smith | 34 | 사무부 | 34 |
John | NULL | NULL | NULL |
Steinberg | 33 | 기술부 | 33 |
오라클은 대체 구문을 제공한다:
SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID(+)
사이베이스가 제공하는 대체 구문은 다음과 같다:
SELECT * FROM employee, department WHERE employee.DepartmentID *= department.DepartmentID
오른쪽 외부 조인[편집]
아래는 오른쪽 외부 조인의 예이며, 부가적인 결과 열은 이탤릭체로 되어있다:
SELECT * FROM employee RIGHT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Smith | 34 | 사무부 | 34 |
Jones | 33 | 기술부 | 33 |
Robinson | 34 | 사무부 | 34 |
Steinberg | 33 | 기술부 | 33 |
Rafferty | 31 | 영업부 | 31 |
NULL | NULL | 마케팅 | 35 |
오라클이 제공하는 대체 구문은 다음과 같다:
SELECT * FROM employee, department WHERE employee.DepartmentID(+) = department.DepartmentID
오른쪽과 왼쪽 외부 조인은 기능적으로 동일하다. 양자 모두 다른 것들이 하지 않는 어떠한 기능도 제공하지 않는다. 그래서 오른쪽과 왼쪽 외부 조인은 테이블 순서가 변경되기만 하면, 서로 대체할 수 있다.
완전 외부 조인[편집]
완전 외부 조인의 예는 다음과 같다:
SELECT * FROM employee FULL OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Smith | 34 | 사무부 | 34 |
Jones | 33 | 기술부 | 33 |
Robinson | 34 | 사무부 | 34 |
John | NULL | NULL | NULL |
Steinberg | 33 | 기술부 | 33 |
Rafferty | 31 | 영업부 | 31 |
NULL | NULL | 마케팅 | 35 |
일부 데이터베이스 시스템은 완전 외부 조인 기능을 직접적으로 지원하지 않지만, 좌우 테이블에서 각각 단일 테이블 열의 내부 조인과 UNION ALL select의 사용을 통해 비슷하게 구현할 수 있다. 동일한 예제를 다음과 같이 표현할 수 있다:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName, department.DepartmentID FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID UNION ALL SELECT employee.LastName, employee.DepartmentID, cast(NULL as varchar(20)), cast(NULL as integer) FROM employee WHERE NOT EXISTS ( SELECT * FROM department WHERE employee.DepartmentID = department.DepartmentID) UNION ALL SELECT cast(NULL as varchar(20)), cast(NULL as integer), department.DepartmentName, department.DepartmentID FROM department WHERE NOT EXISTS ( SELECT * FROM employee WHERE employee.DepartmentID = department.DepartmentID)
내부조인과의 비교[편집]
기준 내부조인(INNER JOIN) 외부조인(OUTER JOIN) 조건 불일치 행 제외됨 포함됨 (NULL 처리됨) 반환 행 수 조건 일치 데이터만 조건 불일치 데이터까지 포함 사용 목적 정확히 매칭되는 데이터만 필요할 때 누락 없이 전체 데이터가 필요할 때
참고자료[편집]
- "Join (SQL)", 《위키백과》
같이 보기[편집]