OUTER JOIN(외부조인)
INNER(내부) JOIN 과 대비하여 OUTER(외부) JOIN이라고 불리며, JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용합니다.
즉 A, B 테이블을 JOIN 할 경우, 조건에 맞지 않는 데이터도 표시하고 싶을 때 OUTER JOIN을 사용합니다.
과거 OUTER JOIN을 위해 Oracle에선 JOIN 컬럼 뒤에 (+) 를 표시하였고, Sybase는 비교 연산자의 앞이나 뒤에 (+) 를 표시했었는데, JOIN 조건과 WHERE 절 검색 조건이 불명확한 단점, IN 이나 OR 연산자 사용시 에러발생, (+) 표시가 누락된 컬럼 존재시 OUTER JOIN 오류 발생, FULL OUTER JOIN 미지원 등 불편한 점이 많았습니다.
따라서 STANDARD JOIN 을 사용함으로써 OUTER JOIN의 문제점을 해결할 수 있었고, 대부분의 관계형 DBMS 간에 호환성을 확보 할 수 있었으므로 명시적인 OUTER JOIN 을 사용할 것을 적극적으로 권장하게 됩니다.
또한, OUTER JOIN 역시 JOIN 조건을 FROM절에 정의하겠다는 뜻이기 때문에, USING, ON 조건절을 필수적으로 사용해야 한다는 점 명시하시길 바랍니다.
추가로, LEFT/RIGHT OUTER JOIN 은 기준이 되는 테이블이 조인 수행 시 무조건 드라이빙 테이블이 됩니다. 드라이빙 테이블은 JOIN이 발생했을 때 첫번째로 ACCESS 되는 테이블을 뜻합니다. 또한, 드라이빙 테이블이 어떤 테이블이냐에 따라 쿼리 성능이나 튜닝 부분에서 굉장히 중요한 영향을 끼칩니다. 데이터 양보다는 무조건 적은 데이터를 추출하는 테이블을 드라이빙 테이블로 잡는 것이 중요합니다.
LEFT OUTER JOIN
조인 수행시 먼저 표기된 좌측 테이블에 해당하는 테이터를 먼저 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 테이터를 읽어옵니다. 즉 Table A와 B가 있을 때 (Table A 가 기준이 됨) A와 B를 비교해서 B의 JOIN 컬럼에서 같은 값이 있을 때 해당 데이터를 가져오고, B의 JOIN 컬럼에서 같은 값이 없는 경우에는 B테이블에서 가져오는 컬럼들은 NULL 값으로 채웁니다. OUTER 키워드는 생략할 수 있습니다.
즉 A LEFT OUTER JOIN B 할 경우 A,B 테이블간 조인 조건이 맞지 않는 A와B 테이블의 레코드 중 A테이블 레코드는 무조건 결과값에 포함되어 나오는 것입니다. 왼쪽 테이블은 무조건 나오는 것이지요.
SELECT STADIUM.STADIUM_NAME, STADIUM.STADIUM_ID, STADIUM.SEAT_COUNT, STADIUM.HOMETEAM_ID, TEAM.TEAM_NAME
FROM STADIUM LEFT OUTER JOIN TEAM
ON STADIUM.HOMETEAM_ID = TEAM.TEAM_ID
ORDER BY STADIUM.HOMETEAM_ID;
INNER JOIN 이라면, 홈팀이 배정된 15개의 경기장만 출력이 되었겠지만, LEFT OUTER JOIN을 사용하였기 때문에 홈팀이 없는 대구시민경기장, 부산시민경기장, 일산경기장, 마산경기장, 안양경기장의 정보까지 추가로 출력 되었습니다.
RIGHT OUTER JOIN
조인 수행시 LEFT JOIN과 반대로 우측 테이블이 기준이 되어 결과를 생산합니다. 즉 TABLE A와 B가 있을 경우(TABLE B가 기준이 됨), A 와 B를 비교해서 A의 .JOIN 컬럼에서 같은 값이 있을 때 그 해당 데이터를 가져오고, A의 JOIN 컬럼에서 같은 값이 없는 경우에는 A 테이블에서 가져오는 컬럼들은 NULL 값으로 채운다. 그리고 RIGHT JOIN으로 OUTER 키워드를 생략해서 사용할 수 있습니다.
즉 A RIGHT OUTER JOIN B 할 경우 A,B 테이블간 조인 조건이 맞지 않는 A와B 테이블의 레코드 중 B테이블 레코드는 무조건 결과값에 포함되어 나오는 것입니다. 오른쪽 테이블은 무조건 나오는 것이지요.
SELECT E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
INNER JOIN 이라면, 사원 정보와 함께 사원이 배정된 3개의 부서 정보와 14명의 사원 정보만 출력 되었겠지만, RIGHT OUTER JOIN을 사용하였기 때문에 사원이 배정되지 않은 부서번호 40의 OPERATIONS 부서의 LOC정보까지 출력 되었습니다.
FULL OUTER JOIN
조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN하여 결과를 생성합니다. 즉 TABLE A와 B가 있을 때(TABLE A, B 모두 기준이 됨), RIGHT OUTER JOIN 과 LEFT OUTER JOIN 의 결과를 합집합으로 처리한 결과와 동일합니다. 단 UNION ALL 이 아닌 UNION 기능과 같으므로 중복되는 데이터는 삭제합니다. 마찬가지로 OUTER 키워드는 생략할 수 있습니다.
즉 A FULL OUTER JOIN B 할 경우 A 기준 LEFT OUTER JOIN 결과와 B 기준 RIGHT OUTER JOIN 2개의 결과를 합친 결과가 나옵니다.
저는 마땅한 테이블이 없어 FULL OUTER JOIN 결과를 아래 URL를 참고하셔서 확인하시면 됩니다.
쉽게 이해할만한 내용이니 따로 테이블을 만들지는 않겠습니다.
https://thebook.io/006696/part01/ch06/03/04/
이번시간엔 OUTER JOIN 에 대해서 알아보았습니다.
다시한번 복습하면, OUTER JOIN은 JOIN 조건에 해당하지 않는 컬럼값도 결과값에 포함시키기 위함임을 잊지 않으셨으면 좋겠습니다!
'프로그래밍 > DataBase' 카테고리의 다른 글
[DataBase] 조건절에 특정 컬럼 값이 NULL이면 해당 테이블 전체조회, 컬럼 값이 있으면 테이블 조건 조회 (1) | 2018.06.29 |
---|---|
[DataBase] NULL 처리 함수 (0) | 2018.03.20 |
[DataBase] FROM 절에 사용하는 JOIN 의 형태 (0) | 2018.01.27 |
[DB] SQLPLUS로 SQL Script 실행(SQLD 실습환경) (0) | 2018.01.23 |
[SQL] 실습문제 (0) | 2017.12.13 |
댓글