2014년 2월 2일 일요일

[Oracle join,조인이란? 조인테이블, 내부조인, 외부조인, outer조인]오라클 조인(oracle join) ,오라클교육, SQL, PLSQL교육,오엔제이프로그래밍실무교육센터

[Oracle join,조인이란? 조인테이블, 내부조인, 외부조인, outer조인]오라클 조인(oracle join) ,오라클교육, SQL, PLSQL교육,오엔제이프로그래밍실무교육센터

오라클 9i이후 부터는 ANSI SQL3-1999 표준을 따르게 되어 조인을 사용하는 형태가 조금 달라 졌습니다.
첫째 조인의 형태는 FROM 절에서 명시적으로 지정 했는데 Oracle 9i에서는 특히 Outer Join, Cross Join 이라고 구체적으로 명시함으로써 한번에 알수있게 하였으며 둘째 조인의 조건은 WHERE절과 구분되어 ON절에 명시되는데 Natural Join, Cross Join, Outer Join등으로 나누어 볼 수가 있습니다.

1. Natural Join
9i이전에는 두개 이상의 테이블을 SELECT 하기 위해서는 WHERE절에 테이블의 공통된 컬럼을 이용하여 조인해야 했습니다. 그러나 9i부터는 Natural Join을 사용하여 WHERE절없이 사용하는 것이 가능해 졌습니다.

[예제 ' 아래의 경우엔 EMP와 DEPT가 같은 이름의 컬럼이 있을 때…]
SQL> select ename, sal, dname
  2  from emp natural join dept;

ENAME            SAL DNAME
---------- ---------- --------------
SMITH            800 RESEARCH
ALLEN            1600 SALES
WARD            1250 SALES
JONES            2975 RESEARCH
MARTIN          1250 SALES
BLAKE            2850 SALES
CLARK            2450 ACCOUNTING
SCOTT            3000 RESEARCH
KING            5000 ACCOUNTING

 [9i이전의 모습 예제] ' 이건 9i에서도 가능 합니다.
SQL> select ename, sal, dname
  2  from emp, dept
  3  where emp.deptno = dept.deptno;

ENAME            SAL DNAME
---------- ---------- --------------
SMITH            800 RESEARCH
ALLEN            1600 SALES
WARD            1250 SALES
JONES            2975 RESEARCH
MARTIN          1250 SALES
BLAKE            2850 SALES
CLARK            2450 ACCOUNTING
SCOTT            3000 RESEARCH
KING            5000 ACCOUNTING

또한 아래처럼 JOIN과 ON을 이용해서도 가능 합니다.

SQL> select ename, sal, dname
  2  from emp join dept
  3  on emp.deptno = dept.deptno;

ENAME            SAL DNAME
---------- ---------- --------------
SMITH            800 RESEARCH
ALLEN            1600 SALES
WARD            1250 SALES
JONES            2975 RESEARCH
MARTIN          1250 SALES
BLAKE            2850 SALES
CLARK            2450 ACCOUNTING
SCOTT            3000 RESEARCH
KING            5000 ACCOUNTING
TURNER          1500 SALES

2. 크로스 조인(Cross Join)
Cartesian Product를 만들 때 사용 합니다. 카티시안 곱이란 출력되는 데이터의 개수가 두 테이블의 곱만큼 출력되는 것입니다. 특히 조인 조건이 없는 경우에 이렇게 출력되곤하죠… 아래의 예제를 보도록 하겠습니다.

SQL> select ename, sal, dname
  2  from emp cross join dept;

ENAME            SAL DNAME
---------- ---------- --------------
SMITH            800 ACCOUNTING
ALLEN            1600 ACCOUNTING
WARD            1250 ACCOUNTING
JONES            2975 ACCOUNTING
MARTIN          1250 ACCOUNTING
BLAKE            2850 ACCOUNTING
CLARK            2450 ACCOUNTING
SCOTT            3000 ACCOUNTING
KING            5000 ACCOUNTING
TURNER          1500 ACCOUNTING
ADAMS            1100 ACCOUNTING

ENAME            SAL DNAME
---------- ---------- --------------
JAMES            950 ACCOUNTING
FORD            3000 ACCOUNTING
MILLER          1300 ACCOUNTING
SMITH            800 RESEARCH
ALLEN            1600 RESEARCH
WARD            1250 RESEARCH
JONES            2975 RESEARCH
MARTIN          1250 RESEARCH
BLAKE            2850 RESEARCH
CLARK            2450 RESEARCH
SCOTT            3000 RESEARCH
KING            5000 RESEARCH
TURNER          1500 RESEARCH
ADAMS            1100 RESEARCH
JAMES            950 RESEARCH
FORD            3000 RESEARCH
MILLER          1300 RESEARCH
SMITH            800 SALES
ALLEN            1600 SALES
WARD            1250 SALES
JONES            2975 SALES
MARTIN          1250 SALES
BLAKE            2850 SALES
CLARK            2450 SALES
SCOTT            3000 SALES
KING            5000 SALES
TURNER          1500 SALES
ADAMS            1100 SALES
JAMES            950 SALES
FORD            3000 SALES


3. 아우터 조인(Outer Join)
8i까지는 조인의 기준이 되는(반드시 모든 레코드가 출력되어야 되는 )쪽은 아무런 표시를 하지 않았으며 그렇지 않은 쪽은 '(+)' 표시를 했습니다. 하지만 9i에서는 OUTER JOIN을 그전까지 지원하지 않았던 FULL까지 지원하여 LEFT, RIGHT, FULL 3가지를 지원하고 있습니다.

[예제]
SQL> create table sales (
  2  custID char(4),
  3  ilja  char(6),
  4  amt number
  5  );

테이블이 생성되었습니다.

SQL> create table customer (
  2  custID char(4),
  3  name  varchar2(10),
  4  tel    varchar2(20)
  5  );

테이블이 생성되었습니다.

SQL> insert into sales values ('1004','040101',10000);

1 개의 행이 만들어졌습니다.

SQL> insert into sales values ('1006','040102',15000);

1 개의 행이 만들어졌습니다.

SQL> insert into customer values ('1004','가길동','111-1111');

1 개의 행이 만들어졌습니다.

SQL> insert into customer values ('1005','나길동','222-2222');

1 개의 행이 만들어졌습니다.

SQL> insert into customer values ('1006','다길동','333-3333');

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

//고객의 일별 매출을 확인시 1005번 고객은 존재하지만 매출 내역이 없어 
//누락된다.
//


SQL> select sales.custID, name, ilja, amt
  2  from sales, customer
  3  where sales.custID = customer.custID;

CUST NAME      ILJA          AMT
---- ---------- ------ ----------
1004 가길동    040101      10000
1006 다길동    040102      15000

//아래의 형태가 표준 SQL  형태이다.

SQL> select sales.custID, name, ilja, amt
  2  from sales inner join customer
  3  on sales.custID = customer.custID;

CUST NAME      ILJA          AMT
---- ---------- ------ ----------
1004 가길동    040101      10000
1006 다길동    040102      15000



//inner join이 두 테이블의 값이 일치하는것만 가지고 오지만 outer Join은 어느 한쪽
//데이터, 또는 양쪽 전부 데이터를 가져온다.

//아래는 왼쪽 외부 조인이므로 왼쪽것(판매내역)은 다 나온다.
//표준 SQL
SQL> select name, ilja, amt
  2  from sales left outer join customer
  3  on sales.custID = customer.custID;

NAME      ILJA          AMT
---------- ------ ----------
가길동    040101      10000
다길동    040102      15000

//오라클 전용, 더하기 반대의 것이 다나온다.
SQL> select name, ilja, amt
  2  from sales , customer
  3  where sales.custID = customer.custID(+);

NAME      ILJA          AMT
---------- ------ ----------
가길동    040101      10000
다길동    040102      15000



//아래는 오른쪽 외부 조인이므로 오른쪽것(고객데이터)은 다 나온다.
//표준  SQL
SQL> select name, ilja, amt
  2  from sales right outer join customer
  3  on sales.custID = customer.custID;

NAME      ILJA          AMT
---------- ------ ----------
가길동    040101      10000
다길동    040102      15000
나길동

//오라클 전용
SQL> select name, ilja, amt
  2  from sales , customer
  3  where sales.custID(+) = customer.custID;

NAME      ILJA          AMT
---------- ------ ----------
가길동    040101      10000
나길동
다길동    040102      15000

//양쪽 테이블의 것 전부 나온다.
SQL> select name, ilja, amt
  2  from sales full outer join customer
  3  on sales.custID = customer.custID;

NAME      ILJA          AMT
---------- ------ ----------
가길동    040101      10000
다길동    040102      15000
나길동

//오라클에서 아래와 FULL outer Join 형식은 오류가 발생 한다.
SQL> select name, ilja, amt
  2  from sales , customer
  3  where sales.custID(+) = customer.custID(+);
where sales.custID(+) = customer.custID(+)
                      *
3행에 오류:
ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다 

댓글 없음:

댓글 쓰기