본문 바로가기

DB/Oracle

[Oracle] FROM절 JOIN 형태

INNER JOIN
정의 : 내부 join 이라고 하며 join 조건에서 동일한 값이 있는 행만 반환. 
inner join 은 join의 기본값으로 inner 생략 가능
inner 라는 말을 생략해도 된다. 


기본문법

select * from 테이블1
inner join 테이블2 on 테이블1.컬럼명 = 테이블2.컬럼명;


교집합이 있는 부분이 있으면 그 부분으로 테이블끼리 연결할 수 있다.

Ex)

A테이블 칼럼 : 1,2,3,4,5  B테이블 칼럼 : 5,6,7,8
5라는 칼럼이 겹치니 inner join 사용할 수 있음)

USING 조건절
같은 이름을 가진 칼럼들 중 원하는 칼럼에 대해서만 선택적으로 등가 조인 가능
기준칼럼은 두 테이블 간 같은 칼럼이름임.

기본문법

select *  from 테이블1
inner join 테이블2 using(기준칼럼);


칼럼이나 테이블에 별칭을 붙일 수 없음
위의 inner join과 교집합 부분으로 두 테이블을 연결하는 것은 같지만  차이점은 using조건절을 사용하면 on~~ 을 안 써도 된다.
Ex)

A테이블 칼럼 : 1,2,3,4,5 B테이블 칼럼 : 5,6,7,8
즉, A테이블에서의 5라는 칼럼과 B테이블에서의 5라는 칼럼이 같다는 문장을 적지 않아도 되는것이다. using(5) 만 적으면 됨

NATURAL JOIN
두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 등가 조인을 수행

기본문법

select *  from 테이블1
natural join 테이블2;


추가로 on 조건절이나 using 조건절. where절에서 join 조건 정의 불가
테이블에 별칭 지정 불가능
위의 inner join, using조건절과 같이 교집합이 있을 경우 사용하면 되는데,  차이점은 natural join은 어떤 칼람이 같은지 안적어도 된다. 
Ex)

A테이블 칼럼 : 1,2,3,4,5 B테이블 칼럼 : 5,6,7,8
A테이블에 5라는 칼럼이 있고 B테이블에도 5라는 칼럼이 있으면, 

select * from A
natural join B


라고 입력만 하면 5라는 칼럼이 같기 때문에 자동으로 A,B테이블을 합쳐서 원하는 값을 출력할 수 있다.

CROSS JOIN
join 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 조회
cross 라는 말을 생략해도 된다.

기본문법

select * from 테이블1
cross join 테이블2

 

Ex)

A테이블 칼럼 : 1,2 B테이블 칼럼 : 7,8,9    =>1,7 / 1,8 / 1,9 / 2,7 / 2,8 / 2,9 조합으로 조회할 수 있다.
inner join 과 cross join 은 inner, cross 라는 말을 생략해도 된다. 
차이점은 on 에 있다.
on을 사용한다면 inner join 이고, 
on을 사용하지 않는다면 cross join이다.

OUTER JOIN 종류

outer join
두 개의 테이블 간에 교집합을 조회하고 한쪽 테이블에만 있는 데이터도 포함시켜서 조회. 
빈 곳은 NULL 값으로 출력
WHERE 조건절에서 한쪽에만 있는 데이터를 포함시킬 테이블 쪽으로 (+)를 위치

 

기본문법

select *  from 테이블1, 테이블2
where 테이블1.칼럼 = 테이블2.칼럼


outer join에서 (+) 기호를 사용하여 표현하는 경우 (+)가 있는 쪽 테이블의 모든 데이터를 출력함
Ex)

select *  from user, class
where user.class_id (+) = class.class_id;


=> 이 경우는 left outer join 방식이라고 할 수 있다. 왼쪽에 있는 user 테이블의 모든 데이터를 출력하라고 적었기 때문.


left outer join 

기본문법

select * from 테이블1 
left outer join 테이블2
on 테이블1.칼럼 = 테이블2.칼럼


차집합 A-B 에서 A만 출력. 나머지 B부분은 NULL값으로 출력됨
Ex)

A테이블 칼럼 : 1,2,3  B테이블 칼럼 : 3,4,5  => 차집합이니 1,2,3은 제 값으로 출력되지만 4,5는  NULL값으로 출력됨

right outer join

기본문법

select * from 테이블1 
right outer join 테이블2
on 테이블1.칼럼 = 테이블2.칼럼

 

차집합. A-B 에서 B만 출력. 남은 A부분은 NULL값으로 출력
EX) 

A테이블 칼럼 : 1,2,3  B테이블 칼럼 : 3,4,5   => 차집합이니 3,4,5는 제 값으로 출력되지만 1,2는  NULL값으로 출력됨

full outer join

기본문법

select * from 테이블1
full outer join 테이블2
on 테이블1.칼럼 = 테이블2.칼럼;


합집합. A,B 전체

Ex)

A테이블 칼럼 : 1,2,3 B테이블 칼럼 : 3,4,5 => 합집합이니 1,2,3,3,4,5 제 값으로 출력됨. NULL값 없음