Backend/db

조인

IT grow. 2018. 8. 20. 21:49
반응형

5. 조인

           -하나 이상의 테이블로부터 데이터를 검색할 때

          

           사원테이블(emp)에 사원명과 부서테이블(dept)에 그 사원의 부서명을 출력

 

1. 두 테이블만 기술 =>Cartesian Product

select ename, dname

from emp, dept;

emp 행수 : 14         dept 행수 : 4

결과 : 14 * 4개의 행수로 출력

 

2. 두 테이블 연결 => 조인 ( 내부조인 )

select ename, dname

from emp, dept

where emp.deptno = dept.deptno;

결과 : 14

 

(1)   부서번호로 검색하고자 한다면 두 테이블에 있기에 어느 테이블에서 가져올지 지정

 

           (2)매 컬럼마다 테이블이름 지정 대신 테이블 alias로 대신

           *자바에서 불러올 때 단순한 컬럼명으로만 부르기에 alias 지정 필수 !

 

           (3)부서 없이 본인 데이터를 하나 입력한다. (deptno 없이 emp 테이블에 입력)

           *다시 dept 테이블과 조인하여 확인 -> 입력된데이터 출력 안됨.

 

3. 외부조인 => 없는 데이터를 포함하여 조인

 

select e.ename as ename, d.dname as dname, e.deptno as deptno

           from emp e, dept d

           where e.deptno = d.deptno(+);

결과 : 15

 

           *외부조인 : 한 테이블에 공통 컬럼값이 없더라도(null이라도검색

           *(+) : 해당 데이터가 존재하지 않더라도 이를 무시하고 조인에 참여

 

 

           [외부조인 특징 ]

           -세 개의 테이블 조인시 한 조건이라도 외부조인이면 다른 조인에도 (+)를 붙여야함

           -(+) 컬럼에만 붙이고, OR 연산자와 사용 못함

           -두 테이블에 모두 (+)를 붙일 수 없음

           -(+)이 붙은 컬럼과 IN 연산자서브쿼리를같이 사용 못함

 

4. ANSI 조인 ( 표준화 )

 (1) 내부조인

select e.ename, d.dname, d.deptno

from emp e, dept d

where e.deptno = d.deptno;

select e.ename, d.dname, d.deptno

from emp e INNER JOIN dept d

ON e.deptno = d.deptno;

           또는

select e.ename, d.dname, d.deptno

from emp e, dept d

where e.deptno = d.deptno;

select e.ename, d.dname, deptno

from emp e INNER JOIN dept d

USING (deptno);

 

           *USING을 사용하면 deptno 검색시 테이블명을 지정하면 안되고 컬럼명만 기술.

           *Natural join

select e.ename, d.dname, deptno

from emp e Natural JOIN dept d;

 

           * Cartesian Product => CROSS JOIN

 

(2) 외부조인

select e.ename, d.dname, d.deptno

from emp e, dept d

where e.deptno = d.deptno(+);

select e.ename, d.dname, d.deptno

from emp e LEFT OUTER JOIN dept d

ON e.deptno = d.deptno;

select e.ename, d.dname, d.deptno

from emp e, dept d

where e.deptno(+) = d.deptno;

select e.ename, d.dname, d.deptno

from emp e RIGHT OUTER JOIN dept d

ON e.deptno = d.deptno;

 

           *기존문법에서 (+)가 데이터가 없는 테이블에 붙였다면,

           LEFT RIGHT는 반대로 데이터가 있는 테이블에 붙인다.

 

           *기존 문법에서는 양 쪽에 (+)에 붙일 수 없는데,FULL OUTER JOIN으로 가능.

 

 

(3) 셀프조인

           사원테이블(emp)에 각 사원의 매니저를 조회

           select e.empno, e.ename,e.mgr, e2.ename

           from emp e, emp e2

           where e.mgr =e2.empno(+);

 


반응형