외부 조인은 내부조인과 달리 다른 테이블과 조인을 하되 조인 컬럼이 존재하지 않는 데이터를 포함시켜서 관계를 맺는 것이다.
Left Join
Oracle
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, d.dept_name, b.use_yn
FROM emp_master a,
dept_master b
WHERE a.dept_id = b.dept_id (+)
ORDER BY a.emp_id;
현재 상황에서 a에 있는 데이터 중에 a.dept_id가 null인 데이터가 있다. 해당 데이터가 dept_master와 관계를 맺기위해서는 a.dept_id가 필수적이다. 하지만 이 부분을 null로 채워서 합치게 되면 외부조인이 완성된다.
따라서 dept_id에 null데이터를 넣기 때문에 b.dept_id 옆에 (+)가 붙은 것으로 이해할 수 있다.
ANSI
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, d.dept_name, b.use_yn
FROM emp_master a,
LEFT JOIN dept_master b
ON a.dept_id = b.dept_id
ORDER BY emp_id
left는 FROM으로 선언된 테이블이다. 그렇기 때문에 left join은 left로 오른쪽에 있는 테이블을 조인하겠다는 것이다.
Right Join
Right Join은 FROM절로 선택된 테이블이 아닌 관계를 맺고자 하는 대상의 테이블을 기준으로 Join을 진행한다.
Oracle
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, d.dept_name, b.use_yn
FROM emp_master a,
dept_master b
WHERE a.dept_id(+) = b.dept_id
ORDER BY a.emp_id;
ANSI
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, d.dept_name, b.use_yn
FROM emp_master a,
RIGHT JOIN dept_master b
ON a.dept_id = b.dept_id
ORDER BY a.emp_id;
Full Outer Join
ANSI방식을 사용해서 join하는 것밖에 없다.
SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id,
b.dept_id, b.dept_name, b.use_yn
FROM emp_master a,
FULL OUTER JOIN dept_master b
ON a.dept_id = b.dept_id
ORDER BY a.emp_id;
Full Outer Join vs Union
JOIN은 서로 다른 컬럼을 가진 두 테이블을 하나의 컬럼을 기준으로 묶어 주는 것이고 Union의 경우 서로 같은 컬럼이 여러개 존재하는 테이블을 해당 값만을 기준으로 합쳐서 보여주는 것이다. 위의 예시 같은 경우 UNION으로는 구현이 불가능한 것을 알 수 있다.
카티션 곱
카티션 곱은 두 테이블의 데이터를 기준으로 가능한 모든 조합을 출력하는 방법으로 JOIN보다는 곱집합의 연산 결과라고 생각 할 수 있다.
이는 조인 절에서 WHERE 절, 즉 연관관계 컬럼을 지정하지 않음으로써 구현될 수 있다.
본 글은 '누구나 쉽게 SQL'이라는 책을 읽고 정리한 내용입니다.
http://www.yes24.com/Product/Goods/74311553
더 많은 내용을 알고 싶은 분은 위의 책을 보시길 바랍니다.
긴 글 읽어주셔서 감사합니다.
틀린 부분이 있으면 댓글을 달아주시면 감사하겠습니다.
📧 : may3210@g.skku.edu
'개발 > Oracle' 카테고리의 다른 글
[Database] 세미조인과 안티조인 (0) | 2022.02.15 |
---|---|
[Database] 서브 쿼리 (0) | 2022.02.15 |
[Database] 테이블 간 관계 맺기 - 내부 조인 (0) | 2022.02.15 |
[Database] 집합 쿼리 (0) | 2022.02.15 |
[Database] 데이터 집계 - HAVING (0) | 2022.02.15 |