[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개만 지정할 수 있습니다
오라클 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개만 지정할 수 있습니다
댓글 없음:
댓글 쓰기