● 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 |