JOIN (Inner, Outer, Self)

JOIN (Inner, Outer, Self)

 

구분 이름 내용 비고
INNER JOIN EQUI-JOIN

–Oracle Join

SELECT A.col, B.col

FROM A,B

WHERE A.col=B.col; 

–Ansi Join

(A,B의 컬럼명이 달라도 ok)

SELECT A.col, B.col

FROM A JOIN B

WHERE A.col=B.col; 

–NATURAL JOIN (자연조인)

(A,B 같은 컬럼명이 존재해야 함)

SELECT col1,col2,col3

FROM A NATURAL JOIN B

–JOIN USING

(A,B 같은 컬럼명이 존재해야 함) 

SELECT col1,col2,col3

FROM A JOIN B USING(col)

NON-EQUI-JOIN

관계연산자(>,<,>=,<=) 혹은

BETWEEN~AND 를 씀

OUTER JOIN LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
SELF JOIN

조인 

1. EQUI-JOIN

–(1)오라클 조인
SELECT ename,hiredate,sal,dname,loc
FROM emp,dept
WHERE emp.deptno=dept.deptno;

–(2)안시 조인
SELECT ename,hiredate,sal,dname,loc
FROM emp JOIN dept
ON emp.deptno=dept.deptno;

–(3)내츄럴 조인
SELECT ename,hiredate,sal,dname,loc
FROM emp NATURAL JOIN dept;

–(4)조인유징
SELECT ename,hiredate,sal,dname,loc
FROM emp JOIN dept USING(deptno);

ex) 30번 부서에 근무하는 사원의 이름, 직위, 부서명, 근무지 출력

SELECT ename,job,dname,loc
FROM emp,dept
WHERE emp.deptno=dept.deptno AND emp.deptno=30;

ex) A가 포함된 사원의 이름, 부서명, 입사일을 출력
SELECT ename,dname,hiredate
FROM emp,dept
WHERE emp.deptno=dept.deptno AND ename LIKE ‘%A%’;

ex) COMM을 받는 사원의 이름,근무지,급여,성과급(단, 0을 받는 사원은 제외)
SELECT ename,loc,sal,comm
FROM emp, dept
WHERE emp.deptno=dept.deptno AND comm IS NOT NULL and comm<>0;

ex) DALLAS에서 근무하는 사원의 이름과 부서번호
SELECT ename,dept.deptno
FROM emp,dept
WHERE emp.deptno=dept.deptno AND dept.loc=’DALLAS’;
deptno는 컬럼이 양쪽에 중복되므로, 앞에 테이블명 붙여줘야함

 

2. NON-EQUI-JOIN 

NON-EQUI-JOIN
SELECT ename,sal,grade,losal,hisal
FROM emp,salgrade;

–위를 아래와 같이 변경해보자.

SELECT ename,sal,grade,losal,hisal
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal;

ex) 사원 정보 중에 이름, 급여, 입사일, 부서명, 근무지, 급여등급

SELECT ename,sal,hiredate,dname,loc,grade
FROM emp, dept, salgrade
WHERE emp.deptno=dept.deptno
AND sal BETWEEN losal AND hisal;

3. OUTER JOIN

3-1. 레프트 아우터 조인(오라클 타입)

 –본인이름, 사수의 이름
SELECT e1.ename “본인”, e2.ename “사수”
FROM emp e1,emp e2
WHERE e1.mgr=e2.empno(+);

 

–사수(오른쪽)가 값이 없어도(NULL) 가져옴

–널값이 있는 곳에 플러스를 붙여줌

–플러스를 붙인 곳(=널값이 있는 곳=오른쪽)의 반대편이 조인의 이름임(레프트 아우터 조인)

–레프트 아우터 조인: 오른쪽이 널값이어도 왼쪽값을 가져옴

3-2. 레프트 아우터 조인(안시 타입)

 –본인이름, 사수의 이름
SELECT e1.ename “본인”, e2.ename “사수”
FROM emp e1 LEFT OUTER JOIN emp e2
ON e1.mgr=e2.empno;

 

4. SELF JOIN 

셀프조인
–본인이름, 사수의 이름
SELECT e1.ename “본인”, e2.ename “사수”
FROM emp e1,emp e2
WHERE e1.mgr=e2.empno;

ex) BLAKE 사원보다 늦게 입사한 사원들의 이름,부서명, 입사일

–<셀프조인으로 풀기>

SELECT e1.ename,dname,e1.hiredate
FROM emp e1,dept,emp e2
WHERE e1.deptno=dept.deptno
AND e2.ename=’BLAKE’ AND e1.hiredate>e2.hiredate;

–<서브 쿼리로 풀기>

SELECT ename,dname,hiredate
FROM emp,dept
WHERE emp.deptno=dept.deptno
AND hiredate>(SELECT hiredate FROM emp WHERE ename=’BLAKE’);