Cartesian Product( Join이 될 key를 잡아 주지않았다.)


Select * From emp, dept;

위와 같이 FROM 절에 두 개 혹은 그 이상의 table 명을 기술할 수 있다. 위 문장의 수행 결과 Cartesian Product가 발생하여 s_emp 25 row * s_dept 12 row = 300 row의 결과가 나오게 된다.

대부분의 SELECT 문장에서는 위와 같이 두 table을 Cartesian Product 하지는 않는다. 예를 들어, s_dept의 PK인 id와 s_emp의 FK인 dept_id 가 같은 row끼리만 업무적으로 의미 있는 data 이므로 WHERE 절에 두 table을 연관시키기 위한 condition을 기술해 준다. 이렇게 두 개 이상의 table을 연관시키는 것을 Join이라고 하며 WHERE 절 내용을 Join condition이라고 한다.

SQL> SELECT * FROM s_emp, s_dept WHERE s_dept.id = s_emp.dept_id;
SQL> SELECT * FROM s_dept, s_emp WHERE s_dept.id = s_emp.dept_id;


< JOIN >

최종적으로 얻고자 하는 data가 여러 개의 table에 흩어져 있는 경우, 또는 최종적으로 얻고자 하는 data를 가져오기 위해 여러 table을 연관시켜야 하는 경우 Join을 사용한다.
대부분의 경우 한 table의 Primary Key와 다른 table의 Foreign Key를 사용하여 join condition을 작성하게 된다.
Join condition이 빠지면 Cartesian product가 발생하므로 유의하여야 한다.



Equijoin  (기본조인)

emp.deptno = dept.deptno Equijoin  이퀄로 평가될수 있는 조인



Non - Equejoin  ( =  외에 연산자를 사용)

  select e.ename,e.sal, s.grade  
  from emp e, salgrade s
  where e.sal between s.losal and s.hisal
* order by s.grade




Outer Join



(+)Null값이 존재하는 테이블에 붙여준다.

  1  select d.dname, e.ename
  2  from  dept d, emp e
  3* where d.deptno = e.deptno(+)

SQL> /

DNAME          ENAME
-------------- ----------
ACCOUNTING     CLARK
ACCOUNTING     KING
ACCOUNTING     MILLER
RESEARCH       JONES
RESEARCH       FORD
RESEARCH       ADAMS
RESEARCH       SMITH
RESEARCH       SCOTT
SALES          WARD
SALES          TURNER
SALES          ALLEN
SALES          JAMES
SALES          BLAKE
SALES          MARTIN
OPERATIONS


SQL> select ename, dname from emp e, dept d
  2  where e.deptno(+) = d.deptno(+);
where e.deptno(+) = d.deptno(+)
                  *
2행에 오류:
ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다

정리
Outer join operator는 하나의 SELECT 문 안에서 하나의 table에만 사용할 수 있으며 아래와 같은 구조를 갖는다.
SELECT table.column, table.column
FROM table1.table2
WHERE table1.column(+) = table2.column;

(+) 연산자는 조인 조건의 필요한 곳에 붙이도록 한다. 어느 쪽에 붙이느냐 에 따라 의미가 변하므로 올바른 위치에 붙여야 한다.

위의 outer join 경우, table1에 matching 되는 row가 없는 table2의 모든 row에 대해서 Oracle은 table1의 select list 값들을 모두 NULL로 return해준다.


Self Join(같은 테이블끼리 join 한다.)


Self join의 경우 동일한 table 명이 2개 이상 사용되므로 반드시 table alias를 사용한다.



사원의 이름과 매니저의 이름을 출력하시오.

 SELECT worker.last_name ||' works for '|| manager.last_name
FROM s_emp worker, s_emp manager
WHERE worker.manager_id=manager.id;




'프로그래밍 기초 > 오라클' 카테고리의 다른 글

서브쿼리  (0) 2010.03.02
제약조건(Constraint)  (0) 2010.03.01
Single-Row Functions  (0) 2010.02.24
기본쿼리2  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
Posted by 아몰라