본문 바로가기
DataBase/Oracle

JOIN/EQUI-JOIN) INNER JOIN, OUTER JOIN, NATURAL JOIN(left outer join, right outer join, full outer join, using)

by 박채니 2022. 4. 18.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


JOIN

- 두 개 이상의 테이블 레코드(entity)를 연결해서 가상 테이블 relation을 생성하는 문법

- 기준 컬럼을 가지고 두 테이블의 레코드를 연결

 

relation 생성하기

① join

② set operator

 

송종기 사원의 부서명을 조회

-- 송종기 사원의 부서명을 조회
-- employee.emp_name
-- department.dept_title
select dept_code from employee where emp_name = '송종기';
select dept_title from department where dept_id = 'D9';

 

select
    *
from
    (employee e join department d
        on e.dept_code = d.dept_id)

employee 테이블의 dept_code와 department 테이블의 dept_id가 같은 department 테이블이 join된 것을 알 수 있습니다.

 

-- employee - department가 연결된 relation 생성
select
    e.emp_name,
    d.dept_title
from
    (employee e join department d
        on e.dept_code = d.dept_id)
where
    e.emp_name = '송종기';

join을 이용하여 '송종기'사원의 부서명을 가져왔습니다.

 


조인 분류

① EQUI-JOIN

- 조인 기준절(on)에 = 동등 비교를 사용하는 조인

② NON-EQUI-JOIN
- 조인 기준절(on)에 = 동등 비교를 사용하지 않는 조인 (!=, between and, in, is null ..등 연산자 사용)

 

조인 문법 분류

① ansi 표준 문법 : join, on 키워드

② oracle 전용 분법 : , (콤마), where절 이용


EQUI-JOIN

 

INNER JOIN

- 내부 조인

- 두 테이블 간의 교집합을 의미

- 각 테이블에서 기준 컬럼이 null인 행, 상대 테이블에서 매칭 되는 행이 없는 행도 제외

- inner 키워드 생략 가능 (inner) join으로 작성

select emp_name, dept_code from employee;

select * from department;

 

select
    e.emp_name,
    d.dept_title
from    
    employee e inner join department d
        on e.dept_code = d.dept_id;

employee 테이블에서 제외된 행 : dept_code가 null인 행

department 테이블에서 제외된 행 : 상대 테이블 employee.dept_code에서 사용되지 않은 D3, D4, D7 3행 제외

 

[오라클 전용문법 버전]

- 테이블 간 순서가 중요하지 않음

select
    e.emp_name,
    d.dept_title
from    
    employee e, department d
where
    e.dept_code = d.dept_id;

 

 

OUTER JOIN

- 외부 조인

- 좌/우측 테이블 기준으로 조인

- 기준이 된 테이블은 누락되는 행이 없음

- outer 키워드 생략 가능 (outer) join / right (outer) join

 

☞ left outer join

select
    e.emp_name,
    d.dept_title
from
    employee e left outer join department d
        on e.dept_code = d.dept_id;

employee 테이블 기준이므로 employee 테이블의 모든 행을 포함하고 있습니다.

24행이 출력된 것을 확인할 수 있습니다.

24행 = 22행 (inner join) + 2행 (인턴/null값)

[오라클 전용문법 버전]

- (+) 기준 테이블의 반대 컬럼에 추가 (from절의 순서는 중요하지 않고, where절의 (+)가 중요)

select
    e.emp_name,
    d.dept_title
from
    employee e, department d
where
    e.dept_code = d.dept_id(+);

 

☞ right outer join

select
    d.dept_title,
    e.emp_name
from
    employee e right outer join department d
        on e.dept_code = d.dept_id;

department 테이블이 기준이므로 department 테이블의 모든 행을 포함하고 있습니다.

25행이 출력된 것을 볼 수 있습니다.

25행 = 22행 (inner join) + 3행 (사원이 없는 부서 D3, D4, D7)

 

[오라클 전용문법 버전]

select
    d.dept_title,
    e.emp_name
from
    employee e, department d
where
    e.dept_code(+) = d.dept_id;

 

☞ full outer join

- 좌/우측 테이블이 모두 기준

- 좌/우측 테이블에서 제외되는 행이 없음

select
    e.emp_name,
    d.dept_title
from
    employee e full outer join department d
        on e.dept_code = d.dept_id;

employee 테이블과 department 테이블이 모두 기준이 되어 두 테이블의 모든 행을 포함하고 있습니다.

27행이 출력된 것을 볼 수 있습니다.

27행 = 22행(inner join) + 2행(인턴/null값) + 3행(사원이 없는 부서 D3, D4, D7)

 

[오라클 전용문법]

- full outer join 문법 없음

 

 

※ 유의 사항

기준 컬럼명이 다른 경우 : 별칭을 사용하지 않아도 정상처리 (하지만 사용 권장)

employee e full outer join department d 
	on e.dept_code = d.dept_id;

 

기준 컬럼명이 같은 경우 : 별칭을 생략할 수 없음

employee e join job j
	on job_code = job_code; --ORA-00918: column ambiguously defined (별칭 생략 시 오류 발생)

이처럼 동일한 기준 컬럼명을 가진 테이블을 join할 경우,

테이블 별칭을 생략하면 "ORA-00918: column ambiguously defined" 오류가 발생됩니다.

 


NATURAL JOIN

- 컬럼명이 동일한 경우 모두 기준 컬럼을 사용

 

☞using(컬럼명)

- 지정한 컬럼만 기준 컬럼으로 사용

select
    *
from
    employee e join job j
        using(job_code);

지정한 컬럼 'job_code'를 기준 컬럼으로 사용하여 employee 테이블의 job_code와 job 테이블의 job_code 컬럼이 맨 앞에 한 번 출력된 것을 확인할 수 있습니다.