JOIN(조인) : 조건을 기준으로 테이블들의 각 행들을 합친후, 원하는 데이터 레코드를 가져오는 방법이다.

  • 검색하고 싶은 컬럼이 다른 테이블에 있을 경우 주요 사용하며, 테이블들을 마치 하나의 테이블인 것처럼 활용한다.
  • 보통 기본키(PK) 또는 외래키(FK)로 두 테이블을 연결한다.

 

1. INNER JOIN  : 기준테이블과 조인한 테이블의 중복값을 보여준다. 조건에 맞는 항목만 출력

   (1) EQUI-JOIN : 조건식에 '='을 사용한다. 교집합

--EQUI조인 표현식
SELECT T1.COL1, T1.COL2, T2.COL3, T2.COL4....
FROM TABLE T1, TABLE T2
WHERE T1.PRIMARYKEY = T2.FOREIGNKEY;

--EMP테이블의 사번, 이름, DEPT테이블의 부서명, 부서번호 출력
SELECT EMPNO, ENAME, DNAME, DEPTNO
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

--EMP테이블을 E로, DEPT테이블을 D로 줄여 약칭으로 표기가 가능하다.
SELECT E.EMPNO, E.ENAME, D.DNAME, E.DEPTNO
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
--△똑같음▽ / 아래는 FM표현식
SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO
FROM EMP E INNER JOIN DEPT D
WHERE (E.DEPTNO = D.DEPTNO);

--부서번호 30인 사원의 사번, 이름, 급여, 부서번호, 부서명을 출력
SELECT E.EMPNO, E.ENAME, D.DNAME, D.DEPTNO
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 30;

 

   (2) NON-EQUI-JOIN : 조건식에 '='연산자 이외의 비교연산자를 사용한다. 조인절이 일치하지 않는 조건을 명시한다.

--EMP테이블의 이름, 급여, SALGRADE테이블의 급여등급을 출력
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S;

--EMP테이블의 이름, 급여, SALGRADE테이블의 급여등급을 출력
--NON EQUI INNER JOIN
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
--WHERE E.SAL >= S.LOSAL AND E.SAL <= S.HISAL;

 

2. OUTER JOIN  : 조건에 맞지 않은 항목도 출력

   (1) OUTER LEFT JOIN : 왼쪽 테이블을 기준으로 조인해 왼쪽테이블 데이터 + 오른쪽테이블과 중복된 데이터를 출력

--EMP테이블(LEFT TABLE)과 DEPT테이블(RIGHT TABLE)의 OUTER LEFT JOIN
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
ORDER BY DEPTNO;

   (2) OUTER RIGHT JOIN : 오른쪽 테이블을 기준으로 조인해 오른쪽테이블 데이터 + 왼쪽테이블과 중복된 데이터를 출력

--EMP테이블(LEFT TABLE)과 DEPT테이블(RIGHT TABLE)의 OUTER RIGHT JOIN
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO(+)
ORDER BY DEPTNO;

 

3. SELF JOIN  : 자기자신과 조인하여 가지고 있는 데이터를 다양하게 변형시켜 활용할 경우에 자주 사용된다.

                              하나의 테이블을 여러번 복사해서 조인한다고 생각하면 된다.

--"SMITH의 매니저(MGR) 는 FORD입니다." 처럼 출력하기 / SMITH, FORD 둘다 ENAME
SELECT E.ENAME ||'의 매니저는' ||MG.ENAME|| '입니다.' AS RESULT
FROM EMP E, EMP MG
WHERE E.MGR = MG.EMPNO; --MGR코드는 사번, EMPNO 사번

--사원이름, 부서번호, 해당사원과 같은 부서에서 근무하는 사원을 출력
SELECT A.ENAME, A.DEPTNO, B.ENAME, B.DEPTNO
FROM EMP A, EMP B
WHERE A.DEPTNO = B.DEPTNO AND A.ENAME != B.ENAME
ORDER BY A.ENAME;

 

4. 3중 JOIN(MULTIPLE JOIN) : 테이블 여러개를 조인

--사원번호, 이름, 부서번호, 부서명, 급여, 급여등급을 출력
--E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, E.SAL, S.GRADE
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, E.SAL, S.GRADE
FROM EMP E, DEPT D, SALGRADE S
WHERE E.DEPTNO = D.DEPTNO 
      AND E.SAL BETWEEN S.LOSAL AND S.HISAL;

 

+ Recent posts