[DB] JOIN

● JOIN

1) 여러 개의 테이블을 병합하여 하나의 결과를 도출하기 위한 방법

2) 종류

- Cartesian Product Join(데카르트 곱)

- Equi Join

a. 공통 필드의 레코드를 가져오는 방법(중복)

b. Inner Join(Natural Join) : 중복 제거

- Non Equi Join

a. 공통 되지 않은 레코드를 가져오는 방법

- Outer Join

a. Inner Join의 확장 : Inner Join + 공통되지 않은 레코드도 가져옴

b. 종류

Left Outer Join : 왼쪽을 기준으로 Inner Join + 공통되지 않은 레코드도 가져옴

Right Outer Join : 오른쪽을 기준으로 Inner Join + 공통되지 않은 레코드도 

  가져옴

Full Outer Join : 양쪽의 Inner Join + 공통되지 않은 레코드까지 가져옴

- Self Join

a. 서로 같은 테이블을 조인

   - 같은 테이블을 메모리에 복사해서 조인하는 것


3) SET 연산자

- UNION

- UNION ALL

- INTERSECT

- MINUS

※ 각각의 테이블에서 나온 결과값을 가지고 연산을 한다.



 ■ JOIN TEST

user1으로 접속 테이블 작성

create table tblA(

id number not null,

value number null

);


create table tblB(

id number not null,

value number null

);


create table tblC(

id number  null,

value number null

);


insert into tblA values(1,10);

insert into tblA values(2,20);

insert into tblA values(3,30);

insert into tblA values(5,50);

insert into tblA values(7,70);


insert into tblB values(1,10);

insert into tblB values(2,20);

insert into tblB values(4,40);

insert into tblB values(5,50);

insert into tblB values(8,80);


insert into tblC values(1,10);

insert into tblC values(2,20);

insert into tblC values(7,70);

insert into tblC values(8,80);

insert into tblC values(9,90);



테이블과 데이터를 만들어서 넣어준 결과이다. 



공통필드 : 서로다른 테이블에 있는 같은 필드들


 INNER JOIN


표준 SQL문법

SELECT tblA.id, tblB.value value FROM tblA INNER JOIN tblB

ON tblA.id = tblB.id;

SELECT tblA.id, tblB.value value FROM tblA JOIN tblB

ON tblA.id = tblB.id;

ORACLE 문법

SELECT tblA.id, tblB.value value FROM tblA , tblB

where tblA.id = tblB.id;



테이블에 별명주기


SELECT a.id "a의 아이디" , b.value "b의 값" FROM tblA a INNER JOIN tblB b

ON a.id = b.id;



   ex1) 직원의 사번, 이름, 업무, 부서번호, 부서명 조회

   SELECT empno, ename, job, emp.deptno, dname

   FROM emp INNER JOIN dept

   ON emp.deptno = dept.deptno;

   


   ex2) SALESMAN에 대해서 사번, 이름, 업무, 부서명 조회

   처리 시점이 JOIN하면서 조건을 같이 처리 

   SELECT empno, ename, job, dname

   FROM emp INNER JOIN dept

   ON emp.deptno = dept.deptno AND job='SALESMAN';


   처리 시점이 JOIN을 마친뒤 조건을 처리, ON뒤에 WHERE를 쓸수있다.

   SELECT empno, ename, job, dname

   emp INNER JOIN dept

   ON emp.deptno = dept.deptno 

   WHERE job='SALESMAN';


   


   ex3) Newyork에서 근무하는 직원의 사번, 이름, 업무, 부서명 조회

   SELECT empno, ename, job, dname

   FROM emp INNER JOIN dept

   ON emp.deptno=dept.deptno and 




 OUTER JOIN

▶LEFT OUTER JOIN

표준 SQL문법

SELECT tblA.id, tblA.value, tblB.id, tblB.value

FROM tblA LEFT OUTER JOIN tblB

ON tblA.id = tblB.id;


ORACLE 문법

SELECT tblA.id, tblA.value, tblB.id, tblB.value

FROM tblA, tblB

WHERE tblA.id = tblB.id(+);


▶RIGHT OUTER JOIN

표준 SQL문법

SELECT tblA.id, tblA.value, tblB.id, tblB.value

FROM tblA RIGHT OUTER JOIN tblB

ON tblA.id = tblB.id;


ORACLE 문법

SELECT tblA.id, tblA.value, tblB.id, tblB.value

FROM tblA, tblB

WHERE tblA.id(+) = tblB.id;



▶ FULL OUTER JOIN

SELECT tblA.id, tblA.value, tblB.id, tblB.value

FROM tblA FULL OUTER JOIN tblB

ON tblA.id = tblB.id;


-> FULL OUTER JOIN은 오라클에서 지원하지 않는다


  ex1) 이름, 급여, 부서명, 근무지를 조회하시오

   단, 부서명과 근무지는 모두 출력할 수 있도록 하시오.

 SELECT ename, sal, dname, loc

 FROM emp RIGHT OUTER JOIN dept

 ON emp.deptno = dept.deptno;




 NON EQUI JOIN

직원들의 급여에 대한 등급을 조회

SELECT ename, job, sal, grade, losal, hisal

FROM emp INNER JOIN salgrade

ON sal>=losal and sal<=hisal;




 SELF JOIN

직원의 사번, 이름, 업무, 업무, 관리자, 관리자명을 조회

SELECT e.empno, e.ename, e.job, e.mgr, m.ename

FROM emp e INNER JOIN emp m

ON e.mgr = m.empno;




□ 3개 테이블 조인


표준 SQL문법

SELECT tblA.id, tblA.value

FROM tblA INNER JOIN tblB

ON tblA.id = tblB.id

INNER JOIN tblC

ON tblB.id = tblC.id;


ORACLE 문법

SELECT tblA.id, tblA.value

FROM tblA , tblB, tblC

WHERE tblA.id=tblB.id AND tblB.id=tblC.id;



□ SET 연산자 TEST


SELECT deptno FROM emp

UNION

SELECT deptno FROM dept;


SELECT deptno FROM emp

UNION ALL

SELECT deptno FROM dept;


SELECT deptno FROM emp

INTERSECT

SELECT deptno FROM dept;



SELECT deptno FROM dept

MINUS

SELECT deptno FROM emp;


'DB' 카테고리의 다른 글

[DB] Data Integrity(데이터 무결성)  (0) 2017.11.17
[DB] Transaction  (0) 2017.11.17
[DB] SQL 문제3  (0) 2017.11.16
[DB] Sub Query  (0) 2017.11.15
[DB] DML  (0) 2017.11.15

댓글

Designed by JB FACTORY