[DataBase] 조인의 종류
조인 종류
두 개 이상의 테이블을 하나의 테이블 처럼 가로로 늘어뜨려 출력하기 위해 사용하는 조인은 대상 데이터를 어떻게 연결하느냐에 따라 등가 조인, 비등가 조인, 자체 조인, 외부 조인 등으로 구분합니다 .
등가 조인
등가 조인(equi join)은 테이블을 연결한 후에 출력행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식입니다 .
여러 테이블의 열이름이 같을 때 유의점
EMP 테이블과 DEPT 테이블은 DEPTNO 열 값이 같은 조건으로 조인이 가능했습니다 .
등가 조인을 사용할 때 조인 조건이 되는 각 테이블의 열이름이 같을 경우 해당 열 이름을 테이블 구분 없이 명시하면 다음과같이 오류가 발생합니다 .
DEPTNO 열은 두 테이블에 모두 존재하는 열이므로 어느 테이블에 속해 있는 열인지 반드시 명시 해야 합니다 .
열 이름에 각각의 테이블 이름도 함께 명시
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY D.DEPTNO, E.EMPNO ;
WHERE 절에 조건식을 추가하여 출력 범위 설정
사원 번호 , 이름, 급여, 근무 부서를 함께 출력하되 급여가 3000인 데이터만 출력합니다 .
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND SAL >= 3000 ;
대부분 SELECT 문이 그렇듯 모든 데이터를 출력하는 경우는 흔치 않습니다 .
구체적인 데이터를 출력하기 위해 WHERE 절은 조인 조건 외에도 다양한 조건식을 활용합니다 .
비등가 조인
비등가 조인(non-equi join) 은 등가 조인 방식 외의 방식입니다 .
앞에서는 모두 EMP 테이블과 DEPT 테이블을 사용했지만 , 이번에는 급여 등급 데이터를 가지고 있는 SALGRADE 테이블과 EMP 테이블을 조인 하겠습니다 .
현재 데이터
- EMP
- SALGRADE
급여 범위를 지정하는 조건식으로 조인하기
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;
SALGRADE 테이블은 각 급여 등급의 기준이 되는 최소, 최고 금액을 저장하고 있습니다 .
만약 각 사원 정보와 더불어 사원의 급여 등급 정보를 함께 출력하고자 한다면 EMP와 SALGRADE 테이블을 조인해야 합니다 .
급여등급을 맞추려면 사원의 급여 금액이 일치 하는 것이 아니라 최소급여와 최대 급여 사이에 있어야 하기 때문에 등가 조인은 적합하지 않습니다 .
BETWEEN A AND B 연산자를 이용하여 손쉽게 처리할 수 있습니다.
자체 조인
EMP 테이블에는 직속 상관의 사원 번호가 저장된 MGR 열이 있습니다 .
MGR 열이 특정 사원의 직속 상관의 사원 번호를 가리키는 데이터이므로 이 열의 데이터와 사원 번호를 잘 이용하면 사원 정보와 직속 상관의 정보를 연결할 수 있을 것입니다 .
지금까지 사용한 SELECT문의 방식으로는 위에 그림과 같이 현재 행을 벗어나 다른행의 데이터를 가져올 수 없었습니다 .
자체 조인은 하나의 테이블을 여러 개의 테이블 처럼 활용하여 조인하는 방식으로 앞에서 물리적으로 동이한 테이블 여러 개를 사용할 때 발생할 수 있는 문제점을 해결합니다 .
자체 조인은 FROM 절에 같은 테이블을 여러 번 명시하되 테이블의 별칭만 다르게 지정하는 방식으로 사용합니다 .
같은 테이블을 두번 사용하여 자체 조인하기
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 ;
EMP 테이블을 자체 조인을 사용하여 사원 정보와 직속 상관 정보를 나란히 출력하는 SQL 문입니다 .
하나의 테이블이지만 SELECT문 내부에서 별칭을 각각 달리 주어 논리적으로 다른 테이블인 것처럼 명시하여 두 테이블을 조인하는 방식입니다 .
MGR열이 NULL인 KING은 자동으로 제외 됩니다 .
자체 조인 역시 두개 테이블에서 지정한 열중 일치 한 데이터를 기준으로 조인 되었으므로 큰 범위에서는 등가 조인으로 볼 수 있습니다 .
외부 조인
앞서 확인한 자체 조인의 실습 결과 행 수는 13개 였습니다 .
EMP 테이블은 14개의 행이 존재하는데 13개가 나온이유는 KING 데이터가 제외되었기 때문입니다 .
하지만 이렇게 조인 조건 데이터 중 어느 한쪽이 NULL임에도 결과에 출력할 때 포함시켜야 하는 경우가 있습니다 .
두 테이블 간 조인 수행에서 조인 기준 열의 어느 한쪽이 NULL 이어도 강제로 출력하는 방식을 외부 조인(outer join)이라고 합니다.
외부 조인은 좌우를 따로 나누어 지정합니다.
왼쪽 외부 조인
WHERE 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 ;
오른쪽 외부 조인
WHERE 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;