ORACLE - JOIN 함수

JOIN

  • 하나의 테이블로 원하는 칼럼정보를 참조할 수 없는 경우 관련된 테이블을 논리적으로 결합하여 원하는 칼럼 정보를 참조하는 방법

[형식]
SELECT 칼럼명1,칼럼명2...
FROM 테이블명1, 테이블명2...
WHERE JOIN 조건 AND 다른 조건 ...


-서로 다른 테이블에 있는 값을 한 번에 사용하기를 원할 때


-일단 cross-product(가능한 모든 경우의 수 나열) 해보기

중복되는 값을 찾아서 그 값을 기준으로 JOIN한다


  1  select ename, emp.deptno, dept.deptno, dname
  2  FROM emp, dept
  3  WHERE emp.deptno=dept.deptno
  4* ORDER BY ename ASC

여러개의 테이블에 데이터를 나눠서 저장하는 이유

만약 부서정보가 변경이 되면 12000개 row의 정보를 다 수정해야하니까 효율적으로 관리하기 위해 테이블을 나눔
분리했을 때는 4개의 row만 있으면 되는데 분리를 안하면 12000개 row에 다 dname, loc정보 적혀있을 것

-> 여러 성격의 정보가 여러 테이블에 나눠져있기 때문에 분산된 정보를 join으로 빼내는 기술이 필요

ANSI JOIN : 가독성을 높이기 위해 씀

INNER JOIN 테이블명 ON 조인조건

where절에 조인조건을 넣으면 가독성도 떨어지고 데이터가 늘어날 수록 복잡해짐
-> ANSI JOIN을 쓰고 WHERE절에는 조건만을 해결하기 위한 절만 들어가게 하기 !

JOIN 방법
1. where절 이용
2. ANSI JOIN (INNER JOIN)
3. ANSI JOIN인데 조인의 기준이 되는 칼럼명이 같은 경우 USING으로 묶어줌

SELF JOIN : 참조해야 할 칼럼이 같은 테이블에 있는 경우

같은 테이블이 2개가 있다고 생각하고 각각 별칭 매겨서 JOIN !!!!!!!

  1  select e1.ename, e1.mgr, e2.empno, e2.ename
  2  from emp e1, emp e2
  3  where e1.mgr=e2.empno
  4* order by e1.mgr ASC
  1  select e1.ename, e1.mgr, e2.empno, e2.ename
  2  from emp e1
  3* INNER JOIN emp e2 ON e1.mgr=e2.empno

---> 여기서 using조건은 사용불가능 (조인조건에 있는 칼럼명이 서로 같지 않기 때문)

ENAME MGR EMPNO ENAME


FORD 7566 7566 JONES
TURNER 7698 7698 BLAKE
MARTIN 7698 7698 BLAKE
WARD 7698 7698 BLAKE
JAMES 7698 7698 BLAKE
ALLEN 7698 7698 BLAKE
MILLER 7782 7782 CLARK
CLARK 7839 7839 KING
BLAKE 7839 7839 KING
JONES 7839 7839 KING
SMITH 7902 7902 FORD
11 개의 행이 선택되었습니다.
(king은 mgr이 null이라서 나오지 않음)

OUTER JOIN : 어느 데이터가 한쪽에는 있고 다른 쪽에는 없을 때 모든 데이터를 추출하도록 하는 방법

ex) emp테이블에는 부서번호 40이 없고, dept테이블에는 부서번호 40이 있을 때

* 방법은 2가지
1) WHERE절로 조인할 때 부족한 테이블에 + 붙이기
2) RIGHT OUTER JOIN 칼럼명 ON 조인조건

emp테이블엔 값이 비더라도 40번까지 출력을 하고싶을 때 ( 우측 테이블이 튀어나오게 되고 왼쪽에 row를 추가해야 함 )

---> 좌측에 (+) 하기
1 SELECT empno, dept.deptno, dname
2 FROM emp, dept
3* WHERE emp.deptno(+)=dept.deptno


플러스는 row가 부족한 곳에다가 붙인다 !!!!!!!! ( 빈 row를 추가로 만들어야 하므로 )

그리고 우측이 삐져나온걸 ansi join으로 하면
RIGHT OUTER (우측이 삐져나왔다)

  1  SELECT empno, dept.deptno, dname
  2  FROM emp
  3* RIGHT OUTER JOIN dept ON emp.deptno=dept.deptno

USING절로 하면

  1  SELECT empno, deptno, dname
  2  FROM emp
  3* RIGHT OUTER JOIN dept USING(deptno)

* USING절 : 식별자를 지정해주지 않음 !!!!!!!!!!

식별자는 두 테이블 안에 겹치는 칼럼이 있을 경우 사용하는데
SELF JOIN은 괄호 안에 조인할 칼럼 하나만 적어주니까 ! ! !

틀린 예시)

SQL> select e.deptno, d.dname, e.ename, e.sal
  2  from emp e
  3  inner join dept d using(deptno);
select e.deptno, d.dname, e.ename, e.sal
       *
1행에 오류:
ORA-25154: USING 절의 열 부분은 식별자를 가질 수 없음

맞는 예시)

SQL> select deptno, dname, ename, sal
  2  from emp
  3  inner join dept using(deptno);

테이블 3개를 조인하는 방법

  1. WHERE절 사용 - AND로 잇기
SQL> select ename, dname, grade
  2  from emp, dept, salgrade
  3  where emp.deptno=dept.deptno 
     AND sal between losal and hisal;
  1. INNER JOIN 사용 - INNER JOIN 두 번 사용하면 됨
SQL> select ename, dname, grade
  2  from emp
  3  inner join dept using(deptno)
  4  inner join salgrade on sal between losal and hisal;

좋은 웹페이지 즐겨찾기