데이터베이스/Oracle

inner Join, Outer Join

backend dev 2024. 4. 2.

Oracle Join , ANSI Join

오라클에서 조인을 할 때 오라클 조인(Oracle Join)과 안시 조인(ANSI JOIN)을 사용할 수 있다.

오라클 9i 까지는 오라클 조인만 사용할 수 있으며, 오라클 10g부터는 안시 조인을 추가로 사용할 수 있다.

최근 구축되는 시스템은 대부분 안시 조인을 사용하지만,

과거에 구축되어 있는 시스템은 오라클 조인을 많이 사용하고 있기 때문에 오라클 조인 방식도 꼭 알고 있어야 한다.

 

안시조인은 join 과 on을 이용 // 오라클 조인은 from에 조인할 테이블을 추가로 적고 where에서 조인할 컬럼을 설정

--오라클 조인 ( 옛날 기술 )
select *
from m,
     S
where m.m1 = s.S1;


select m.m1, m.m2, s.s2
from m,
     S
where m.m1 = s.s1;
----------------

-- ansi ( 현업 )
select *
from m
         inner join s
                    on m.m1 = s.S1;


-- ansi  inner 생략
select *
from m
         join s
              on m.m1 = s.S1;

 

 

Inner Join 

 == 등가 조인
 - 등가 조인은 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 
   선정하는 방식이다.
 - 내부 조인(Inner Join) 또는 단순 조인(Simple Join)

SELECT a.empno
     , a.ename
     , a.deptno
     , b.dname
  FROM emp a
 INNER JOIN dept b
    ON a.deptno = b.deptno
 WHERE a.job = 'MANAGER'

위의 예제는 EMP 테이블과 DEPT 테이블을 조인(내부 조인)하여 DEPT 테이블의 DNAME(부서명)을 조회한 쿼리이다.

조인(INNER JOIN)은 메인 테이블과 조인 테이블에 조인 칼럼(deptno)의 값이 동시에 존재해야 조회가 된다.

위의 조인 구조를 보면 EMP 테이블의 "GENT"는 DEPT 테이블과 조인이 안되었기 때문에 데이터 조회에서 제외된다.

위의 ANSI JOIN을 Oracle Join으로 변경하면 아래와 같다.

SELECT a.empno
     , a.ename
     , a.deptno
     , b.dname
  FROM emp a
     , dept b
 WHERE a.job = 'MANAGER'
   AND a.deptno = b.deptno

 

 

오라클 조인은 조인 칼럼(deptno) 조건을 WHERE 절에 작성하면 된다.

 

Join은 테이블이 합쳐진다.

 

조인테이블의 모든 컬럼을 가지고 합친다. 그리고 데이터는 조인컬럼 기준으로 같은 로우를 넣어준다.

위의 오라클 조인말고 안시조인을 사용할것 

select *
from emp
join dept on EMP.DEPTNO = dept.DEPTNO

 

여러개 테이블 조인 가능. ( 오라클 조인)
안시조인을 사용할것.

 

비등가 조인

조인 대상이 되는 테이블과 대응되는 열(컬럼)이 없는 경우 범위를 지정하는 조건식으로 조인하는 방식
 - WHERE 절에 "="이 아닌 ">", "<", "BETWEEN" 등의 조건식을 사용한다.

 

 

 

 

 

Outer Join

outer join 종류

 

Outer join ( Left Outer Join)

 

 

안시조인

m 테이블과 s 테이블의 컬럼을 모두 합치고, 그 안에는 조인컬럼기준 데이터가 같은것을 넣어 준뒤

m테이블의 나머지 데이터도 넣어준다. 그 데이터가 s테이블의 컬럼값이 없을텐데 그건 null로 채워준다.

 

위의 같은 예시를 오라클조인으로

조인 조건을 ON절에서 WHERE 절로 위치가 변경되었고 조인 칼럼에 (+)이 붙어있다.

조인 칼럼에 (+)를 붙이면 해당 칼럼의 테이블이 조인 테이블이 된다.

아우터 조인의 핵심은 메인 테이블의 데이터는 무조건 조회가 되고 조인 테이블은 참조 용도로만 사용된다.

left outer join 응용

m테이블에만 있는 데이터가 남는다!

 

 

 

 


Outer Join ( Right Outer Join)

 

RIGHT OUTER JOIN은 LEFT OUTER JOIN과 동일한 아우터 조인이며,

다른 점은 오른쪽(RIGHT) 테이블이 메인 테이블이 된다. 

(조인 테이블) RIGHT OUTER JOIN (메인 테이블)

 

s 테이블이 메인 테이블이기 때문에 s테이블의 모든 데이터가 조회되고 m테이블은 참조 용도로만 사용된다.

메인 테이블의 위치만 바뀌었을 뿐 LEFT OUTER JOIN과 조인 방법은 동일하다.

특별한 경우가 아니면 RIGHT OUTER JOIN은 사용하지 않는 것이 차후 쿼리문을 분석할 때 가독성을 좋게 할 수 있다.

 

오라클 조인으로 구현

오라클 조인에서는 RIGHT OUTER JOIN이라는 용어는 사용 안 하지만,

조인 칼럼의 (+) 위치를 변경 함으로써 RIGHT OUTER JOIN과 비슷하게 만들 수 있다.

 

RIGHT OUTER JOIN은 개념을 이해하고 있으면 된다.

아우터 조인은 LEFT OUTER JOIN을 확실히 익혀 두도록 하자.

 

 

right outer join 응용

s가 기준테이블이고, s에만 존재하는 데이터만 저장

 


CROSS JOIN(상호 조인)

 

한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능입니다. 

상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼 됩니다.
카티션 곱(CARTESIAN PRODUCT)라고도 합니다.

 

크로스 조인은 두 테이블의 모든 데이터를 서로 한 번씩 조인을 한다고 생각하면 된다.
CROSS JOIN 절에 테이블 작성하고 메인 테이블과 조인 칼럼을 연결하지 않는다.

모든 조합이 다 나온다고 생각하면 된다.

크로스 조인은 두 테이블의 모든 데이터를 서로 한 번씩 조인을 한다고 생각하면 된다.
CROSS JOIN 절에 테이블 작성하고 메인 테이블과 조인 칼럼을 연결하지 않는다.

 

 

 

오라클 조인에서 크로스 조인을 하기 위해서는 FROM 절에 테이블을 작성하고 WHERE 절에서 조인 칼럼을 작성하지 않으면 두 개의 테이블이 서로 크로스 조인된다.

오라클 조인 ( 크로스 조인)

 


풀 아우터 조인 (FULL OUTER JOIN)

 

두 개의 테이블을 조인하여 조인된 데이터는 조인된 상태로 조회되고, 

조인 안된 데이터는 조인이 안된 상태로 조회된다. 

 

조인되어도 조회되고 조인이 안되어도 모두 조회된다고 생각하면 된다.

 풀 아우터 조인은 ANSI JOIN에서만 사용 가능하고 Oracle Join에서는 사용할 수 없다. 

자주 사용하는 조인 방법은 아니기 때문에 개념만 이해하고 있으면 좋을 듯하다.

 

풀 아우터 조인 (FULL OUTER JOIN) 응용

 


Self Join 

 

 

자기 참조 : 하나의 테이블에서 특정컬럼이 다른 컬럼을 참조하는 경우

하나의 테이블을 2개처럼 취급해서 조인한다 ( 별칭을 이용해서)

조인 조건을 e.mgr = m.empno으로 적어줘야한다.

mgr을 기준으로 empno이 같은것을 붙여줘야하므로.

 

 

 

 

댓글