ORACLE DB 테이블 조인
테이블 조인
EQUI JOIN
두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치하는 행을 연결하여 결과를 생성
컬럼명 앞에 테이블명을 기술해 어느 소속 컬럼인지 확실히 할 수 있다.
만약 같은 절에 같은 컬럼명이 두개이상 있다면 명확히 해줘야한다.
별칭을 사용할 수도 있음
from emp e, dept d
select emp.empno, emp.ename, dept.dname from emp, dept where emp.deptno = dept.deptno;
EMPNO ENAME DNAME
---------- ---------- --------------
7369 SMITH RESEARCH
7499 ALLEN SALES
7521 WARD SALES
7566 JONES RESEARCH
7654 MARTIN SALES
7698 BLAKE SALES
7782 CLARK ACCOUNTING
7839 KING ACCOUNTING
7844 TURNER SALES
7900 JAMES SALES
7902 FORD RESEARCH
EMPNO ENAME DNAME
---------- ---------- --------------
7934 MILLER ACCOUNTING
select e.empno, e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;
EMPNO ENAME DNAME
---------- ---------- --------------
7369 SMITH RESEARCH
7499 ALLEN SALES
7521 WARD SALES
7566 JONES RESEARCH
7654 MARTIN SALES
7698 BLAKE SALES
7782 CLARK ACCOUNTING
7839 KING ACCOUNTING
7844 TURNER SALES
7900 JAMES SALES
7902 FORD RESEARCH
EMPNO ENAME DNAME
---------- ---------- --------------
7934 MILLER ACCOUNTING
SQL> r
1 select e.empno, e.ename, d.dname
2 from emp e, dept d
3 where e.deptno = d.deptno
4* and e.ename = 'ALLEN'
EMPNO ENAME DNAME
---------- ---------- --------------
7499 ALLEN SALES
NON-EQUI JOIN
WHERE 절에 = 연산자 이외의 비교 연산자 사용
SQL> select e.ename, e.sal, s.grade
2 from emp e, salgrade s
3 where e.sal >= s.losal and e.sal <= s.hisal;
ENAME SAL GRADE
---------- ---------- ----------
SMITH 800 1
JAMES 950 1
WARD 1250 2
MARTIN 1250 2
MILLER 1300 2
TURNER 1500 3
ALLEN 1600 3
CLARK 2450 4
BLAKE 2850 4
JONES 2975 4
FORD 3000 4
ENAME SAL GRADE
---------- ---------- ----------
KING 5000 5
SQL> r
1 select e.ename, e.sal, s.grade
2 from emp e, salgrade s
3* where e.sal between s.losal and s.hisal
ENAME SAL GRADE
---------- ---------- ----------
SMITH 800 1
JAMES 950 1
WARD 1250 2
MARTIN 1250 2
MILLER 1300 2
TURNER 1500 3
ALLEN 1600 3
CLARK 2450 4
BLAKE 2850 4
JONES 2975 4
FORD 3000 4
ENAME SAL GRADE
---------- ---------- ----------
KING 5000 5
EQUI + NON-EQUI JOIN
SQL> r
1 select e.ename, d.dname, s.grade
2 from emp e, dept d, salgrade s
3 where e.deptno = d.deptno
4* and e.sal between s.losal and s.hisal
ENAME DNAME GRADE
---------- -------------- ----------
MILLER ACCOUNTING 2
CLARK ACCOUNTING 4
KING ACCOUNTING 5
SMITH RESEARCH 1
JONES RESEARCH 4
FORD RESEARCH 4
JAMES SALES 1
WARD SALES 2
MARTIN SALES 2
TURNER SALES 3
ALLEN SALES 3
ENAME DNAME GRADE
---------- -------------- ----------
BLAKE SALES 4
SELF JOIN
원하는 데이터가 하나의 테이블에 모두 있음
자신의 테이블을 별칭을 통해 연결해 원하는 값을 검색
SQL> r
1 select e.ename "사원", m.ename "팀장"
2 from emp e, emp m
3* where e.mgr = m.empno
사원 팀장
---------- ----------
FORD JONES
ALLEN BLAKE
WARD BLAKE
MARTIN BLAKE
TURNER BLAKE
JAMES BLAKE
MILLER CLARK
JONES KING
BLAKE KING
CLARK KING
SMITH FORD
SQL> r
1 select e.ename || ' 사원의 매니저는 ' || m.ename || '입니다'
2 from emp e, emp m
3* where e.mgr = m.empno
E.ENAME||'사원의매니저는'||M.ENAME||'입니다'
-----------------------------------------------------
FORD 사원의 매니저는 JONES입니다
ALLEN 사원의 매니저는 BLAKE입니다
WARD 사원의 매니저는 BLAKE입니다
MARTIN 사원의 매니저는 BLAKE입니다
TURNER 사원의 매니저는 BLAKE입니다
JAMES 사원의 매니저는 BLAKE입니다
MILLER 사원의 매니저는 CLARK입니다
JONES 사원의 매니저는 KING입니다
BLAKE 사원의 매니저는 KING입니다
CLARK 사원의 매니저는 KING입니다
SMITH 사원의 매니저는 FORD입니다
11 행이 선택되었습니다.
OUTER JOIN
조인 조건을 만족하지 못하더라도 해당 행을 결과에 포함
LEFT OUTER JOIN
where e.mgr = m.empno(+);
SQL> select e.ename, m.ename
2 from emp e, emp m
3 where e.mgr = m.empno(+);
ENAME ENAME
---------- ----------
FORD JONES
ALLEN BLAKE
WARD BLAKE
MARTIN BLAKE
TURNER BLAKE
JAMES BLAKE
MILLER CLARK
JONES KING
BLAKE KING
CLARK KING
SMITH FORD
ENAME ENAME
---------- ----------
KING
SQL> r
1 select e.ename "사원", m.ename "관리자"
2 from emp e left outer join emp m
3* on e.mgr = m.empno
사원 관리자
---------- ----------
FORD JONES
ALLEN BLAKE
WARD BLAKE
MARTIN BLAKE
TURNER BLAKE
JAMES BLAKE
MILLER CLARK
JONES KING
BLAKE KING
CLARK KING
SMITH FORD
사원 관리자
---------- ----------
KING
RIGHT OUTER JOIN
SQL> r
1 select e.ename, d.dname
2 from emp e, dept d
3* where e.deptno(+) = d.deptno
ENAME DNAME
---------- --------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH
MARTIN SALES
BLAKE SALES
CLARK ACCOUNTING
KING ACCOUNTING
TURNER SALES
JAMES SALES
FORD RESEARCH
ENAME DNAME
---------- --------------
MILLER ACCOUNTING
OPERATIONS
SQL> r
1 select e.ename, d.dname
2 from emp e right outer join dept d
3* on e.deptno = d.deptno
ENAME DNAME
---------- --------------
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH
MARTIN SALES
BLAKE SALES
CLARK ACCOUNTING
KING ACCOUNTING
TURNER SALES
JAMES SALES
FORD RESEARCH
ENAME DNAME
---------- --------------
MILLER ACCOUNTING
OPERATIONS