조인은 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용하는 방식이다.
만약 두개 이상의 테이블의 정보를 출력할때 FROM절에만 여러 테이블을 선언해주면 생각보다 많은 양의 데이터가 출력된다. 왜냐하면 테이블 하나하나에 저장된 정보의 모든 경우의 수가 조합되어 출력되기 때문이다. 예를들어 14행인 테이블과 4개의 행인 테이블을 그대로출력하면 14*4인 56개의 행이 출력된다.
SELECT *
FROM EMP, DEPT
ORDER BY EMPNO;
SMITH라는 사람 한명에 DEPTNO_1의 10,20,30,40테이블 모두 조합된 모습이 나온다.
EMP와 DEPT의 공통열 DEPTNO로 조인을 하면 정상적으로 나온다.
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY EMPNO;
조인은 대상 데이터를 어떻게 연결하느냐에 따라 등가 조인, 비등가 조인, 자체 조인, 외부 조인으로 나뉜다.
가장 많이 사용되는 조인 방식이다. 특정 열값이 일치한 출력 결과를 사용하는 방식이다.
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY D.DEPTNO, E.EMPNO;
여기서 조심할것은 EMP테이블과 DEPT테이블 모두 DEPTNO를 가지고 있기 때문에 별칭으로 명시하지 않으면 열의 정의가 애매하므로 출력이 되지 않는다.
cf)
그리고
SELECT ....
FROM ....
WHERE ....
보다
SELECT ....
FROM ....
WHERE ....
이렇게 줄을 맞추는것이 가독성이 더 좋다. (회사에서 배움)
같은 열이 있지 않아도 조건으로 조인하는 방법이다.
비등가 조인방식은 그리 자주 사용하는 방식은 아니지만, 열의 일치여부로 조인하는 방식외 다른 방식으로도 사용할 수 있다는것만 알아두자.
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
같은 테이블을 다른 별칭으로 설정해서 자기 자신을 조인 할 수도 있다.
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR=E2.EMPNO;
바로 위에있는 자체 조인에서 결과는 13행이 나왔다. 왜냐하면 EMP테이블의 MGR값이 NULL인 데이터가 출력되지 않았기 때문이다.
외부조인은 어떤 한 테이블을 기준으로 그 기준 열의 어느 한 쪽이 NULL이어도 출력하게 하는 방식이다.
외부조인은 좌우를 따로 나누어 지정한다.
cf)
oracle sql과 ansi sql에서 조금 차이가 나는데, 일단은 귀찮으니 쓰까서 적었다.
WHERE TABLE1.COL1 = TABLE2.COL1(+)
또는
FROM TABLE1 LEFT OUTER JOIN TABLE2 ON(TABLE1.COL1 = TABLE2.COL1)
형식으로 사용한다.
예)
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR=E2.EMPNO(+)
ORDER BY E1.EMPNO;
------------------------------------------------또는
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 LEFT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
WHERE TABLE1.COL1(+) = TABLE2.COL1
또는
FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON(TABLE1.COL1 = TABLE2.COL1)
형식으로 사용
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR(+)=E2.EMPNO
ORDER BY E1.EMPNO;
------------------------------------------------또는
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 RIGHT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
외부조인을 벤다이어 그램으로 표현한 그림이다.