본문 바로가기
DATABASE/ORACLE

[Oracle] SQL Outer Join / ANSI Join

Outer Join / ANSI Join





조인 조건에 만족하지 못하였더라도 해당 로우를 나타내고 싶을 때 사용



형식 : SELECT <열 목록> FROM <첫번째 테이블 (LEFT 테이블)> 

<LEFT|RIGHT|FULL> OUTER JOIN <두번째 테이블 (RIGHT 테이블)>

ON<조인 될 조건> WHERE 


LEFT OUTER JOIN

왼쪽 테이블의 것은 조건에 부합하지 않더라도 무두 결합되어야 한다는 의미이다.

즉, FROM 첫번째 테이블 LEFT OUTER JOIN 두번째 테이블이라면, 첫번째 테이블의 것은 모두 출력 되어야 한다.


1
2
3
4
5
6
7
8
9
10
- 전체 회원의 구매기록을 살펴보자.
-- 단, 구매 기록이 없는 회원도 출력되어야 한다.
 
-- LEFT OUTER JOIN이므로, UserTable은 모두 출력된다
 
SELECT U.ID, Name, GoodName, Addr
FROM UserTable U                    -- LEFT Table    
        LEFT OUTER JOIN BuyTable B  -- RIGHT Table
        ON U.ID = B.ID
ORDER BY U.ID
cs


INNER JOIN시 INNER 키워드를 생략 가능했던 것처럼,

LEFT OUTER JOIN 역시 LEFT JOIN만으로 작성해도 무방하다.


결과



RIGHT OUTER JOIN

오른쪽 테이블의 것은 조건에 부합하지 않더라도 모두 결합되어야 한다는 의미



FULL OUTER JOIN

전체 조인 또는 전체 외부 조인이라고 한다.

FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 것이라고 생각하면 된다.


즉, 한쪽을 기준으로 조건과 일치하지 않는 것을 출력하는 것이 아니라,

양쪽 모두에 조건이 일치하지 않는 것들까지 모두 결합하는 개념이다


따라서, 테이블들의 모든 행이 조건에 관계없이 결합된다






ANSI JOIN


ANSI Cross Join


SELECT * FROM EMP CROSS JOIN DEPT;


ANSI JOIN은 FROM 다음에 INNER JOIN이란 단어를 사용하여 조인 할 테이블 이름을 명시하고 ON 절을 사용하여 조인 조건을 명시하여 작성한다.


형식 : SELECT *FROM table1 INNER JOIN table2 ON table.column1 = table2.column2



이것을

1
2
SELECT ENAME, DNAME FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
cs


이렇게 

1
2
SELECT ENAME, DNAME FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;
cs


EMP와 DEPT에 DEPTNO라는 같은 칼럼이 있기 때문에 USING 절을 사용 할 수 있다

1
2
SELECT ENAME, DNAME FROM EMP INNER JOIN DEPT
using(deptno);
cs



NATURAL JOIN


두 테이블에 각각 조인을 정의한 컬럼의 이름이 동일 하다면 USING 절에서 조인 할 칼럼을 지정하여 구문을 더 간단하게 표현 할 수 있다

형식 : SELECT *FROM table1 NATURAL JOIN table2


1
SELECT EMP.ENAME, DEPT.DNAME FROM EMP NATURAL JOIN DEPT;
cs

EMP와 DEPT에 DEPTNO라는 같은 이름의 컬럼이 있기 때문에 가능하다



ANSI OUTER JOIN


LEFT Outer Join, RIGHT Outer Join, FULL Outer Join 세가지 타입의 조인을 제공한다


LEFT OUTER JOIN : 조인문의 왼쪽에 있는 테이블의 모든 결과를 가져 온 후 오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL로 표시


형식 : SELECT *FROM table1 [LEFT | RIGHT | FULL] Outer Join table2


어느 한쪽 테이블에는 해당하는 데이터가 존재 하는데 다른 쪽 테이블에는 데이터가 존재 하지 않을 경우 ( 위의 KING 예제)

그 데이터가 출력 되지 않는 문제점을 해결 하기 위해 사용하는 조인 기법이다.



예제

DEPT01 테이블의 20번 부서와 조인 할 부서번호가 DEPT02에는 없지만, 20번 부서도 출력 되도록 하기 위해서 DEPT01 테이블이 왼쪽에 존재 하기에 LEFT OUTER JOIN을 사용한다.


1
2
3
4
5
6
7
8
9
10
11
create table dept01( deptno number(2), dname varchar2(14));
insert into dept01 values(10,'ACCOUNTING');
insert into dept01 values(20,'RESEARCH');
 
select *from DEPT01;
 
create table dept02( deptno number(2), dname varchar2(14));
insert into dept02 values(10,'ACCOUNTING');
insert into dept02 values(30,'SALES');
 
select *from DEPT02;
cs




1
2
select *from dept01 left outer join dept02
on dept01.deptno = dept02.deptno;
cs


'DATABASE > ORACLE' 카테고리의 다른 글

[Oracle] SQL DML / DDL  (2) 2018.04.21
[Oracle] SQL 서브쿼리  (2) 2018.04.21
[Oracle] SQL Self Join  (0) 2018.04.20
[Oracle] SQL JOIN  (0) 2018.04.20
[Oracle] SQL HAVING  (1) 2018.04.20