본 포스트는 그루비에 있는 Oracle SQL Basic 요약본을 보고 정리한 내용임
--- dept 테이블과 emp 테이블을 조인하는 예제
SELECT e.empno, e.ename,d.dname
  FROM dept d, emp e
 WHERE d.deptno =e.deptno
콤마(,)대신 INNER JOIN을 사용할 수 있으며, INNER는 생략가능,JOIN조건은 ON절에 옴
--INNER JOIN절을 이용하여 조인하는 예제
SELECT e.empno, e.ename, d.dname
  FROM dept d
  INNER JOIN emp e
  		ON d.deptno = e.deptno
NATURAL JOIN을 사용하면 동일한 컬럼을 내부적으로 모두 조인하므로 ,ON절이 생략가능
--- JOIN~USING절을 이용하여 조인하는예제
SELECT e.empno, e.ename,deptno
  FROM emp e
  JOIN dept d
 USING (deptno);
---emp 테이블과 slagrade 테이블의 Non-Equi Join 예제
SELECT e.ename, e.sal, s.grade
 FROM emp e, salgrade s
 WHERE e.sal
 BETWEEN s.losal
   AND s.hisal;
   
ENAME             SAL      GRADE 
---------- ---------- ---------- 
SMITH             800          1 
JAMES             950          1 
ADAMS            1100          1 
...   
   
---사원의 매니저명을 조회하는 Self Join 예제
SELECT e.ename, a.ename ="MANAGER"
  FROM emp e ,emp a
  WHERE e.empno =a.mgr;
  
ENAME     Manager 
------- ---------- 
FORD      SMITH 
BLAKE     ALLEN 
BLAKE     WARD 
KING      JONES 
...  
--- CROSS JOIN절을 이용하여 Cartesian Product값을 얻는 예제
SELECT e.empno, e.ename, d.dname
  FROM dept d CROSS JOIN emp e;
Equi Join과 Outer Join의 비교
--- Equi Join으로 부서 번호를 조회하는 예제
SELECT DISTINCT (e.deptno), d.deptno, d.dname
   FROM emp e,dept d
   WHERE e.deptno = d.deptno
DEPTNO     DEPTNO 
------ ---------- 
    10         10 
    20         20 
    30         30
    
--- Outer Join으로 부서 번호를 조회하는 예제
SELECT DISTINCT (e.deptno), d.deptno
  FROM emp e , dept d
 WHERE e.deptno(+) = d.deptno;
 DEPTNO  DEPTNO 
 ------- -------- 
     10       10 
     20       20 
     30       30 
              40
Outer Join을 사용하는 테이블에 추가로 조건절이 있다면 (+)연산자를 모두 해야 함
Oracle9i 부터는 ANSI/ISO SQL 표준인 LEFT OUTER JOIN,RIGHT OUTER JOIN, FULL OUTER JOIN을 지원
LEFT OUTER JOIN은 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용
RIGHT OUTER JOIN은 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용
FULL OUTER JOIN은 양쪽 테이블 모두 Outer Join 걸어야 하는 경우에 사용
Cartesian Product값을 얻을때 사용
---일반적인 SQL문장
SQL> SELECT e.empno, e.ename
	  FROM dept d, emp e
      WHERE d.deptno=e.deptno
      
--INNER JOIN SQL문장
SQL> SELECT e.empno, e.ename
	  FROM dept d INNER JOIN emp e
        ON d.deptno =e.deptno
---일반적인 SQL문장
SQL> SELECT e.empno, e.ename, d.deptno
       FROM emp e, dept d
      WHERE e.deptno=d.deptno
      
--- NATURAL JOIN 사용한 SQL문장
SQL> SELECT e.empno, e.ename, d.deptno
	   FROM emp NATURAL JOIN dept
---일반적인 사용방법
SQL> SELECT e.empno,e.ename,deptno
	   FROM emp e JOIN dept d USING(deptno)
--테스트를 위해 scott유저에서 아래 insert문장을 실행
SQL> INSERT INTO bonus (ename, job,sal) VALUES('SMITH','CLERK',500);
---ON절 사용 예제(multi-table joins)
SQL> SELECT e.empno, e.ename, e.sal
	  FROM emp e JOIN dept d ON (e.deptno=d.deptno)
      			 JOIN bouus b ON (b.ename=e.ename)
      WHERE e.sal IS NOT NULL