1. EQUI JOIN
서로 다른 테이블에 있는 컬럼들의 데이터를 하나의 결과로 조인해서 출력하기 위해 EQUI JOIN을 사용한다.
예를 들어사원테이블과 부서 테이블을 조인하여 이름과 부서 위치를 출력할 경우 아래와 같이 쿼리를 작성한다.
SELECT ename, loc
FROM EMP, DEPT
WHERE EMP.deptno = DEPT.deptno;
EMP와 DEPT 테이블을 서로 조인하기 위해선느 조인 조건이 있어야 한다. 조인 조건을 두개의 테이블을 연결하기 위한 연결고리이다. 여기서 조인 조건이 EMP 테이블의 부서 번호가 DEPT 테이블의 부서 번호와 같다라는 조건( : EMP.deptno = DEPT.deptno) 처럼 조인 조건이 이퀄(=)이면 EQUI JOIN이라한다.
※ 검색조건과 조인 조건이 동시에 필요한 경우
예를 들어 위의 예시에서 직업이 ANALYST인 사원만 출력할 경우 WHERE절에 있는 조인 조건에다 job = 'ANALYST'라는 조건을 추가해야한다. 이때는 두 조건을 AND연산자로 연결하여 작성한다.
SELECT ename, loc
FROM EMP, DEPT
WHERE EMP.deptno = DEPT.deptno AND job = 'ANALYST';
※ 열 이름 앞에 테이블명을 접두어로 붙여야 한다.
위의 예시에서 출력했던 ename과 loc 컬럼의 경우 각각 EMP, DEPT 테이블에만 있는 컬럼이다. 하지만 부서번호인 deptno는 EMP, DEPT 두 테이블에 모두 존재하는 연결고리이다. 따라서 deptno를 출력하고자 하는 경우 어떤 테이블의 deptno인지를 접두어로 붙여야 한다.
-- 잘못된 예
SELECT ename, loc, deptno
FROM EMP, DEPT
WHERE EMP.deptno = DEPT.deptno;
-- 바른 예
SELECT ename, loc, EMP.deptno
FROM EMP, DEPT
WHERE EMP.deptno = DEPT.deptno;
다만 검색 속도 향상을 위해 가급적 열 이름 앞에 테이블명을 붙여서 작성하는 것을 권장한다.
※ 별칭사용
컬럼명 앞에 테이블명을 일일이 작성하다보면 코드가 길어진다. 이와 같은 불편함을 줄이기위해 테이블 별칭을 사용하여 조인 코드를 더 간결하게 작성한다.
SELECT e.ename, d.loc, e.deptno
FROM EMP e, DEPT d
WHERE e.deptno = d.deptno;
별칭은 대소문자는 구분하지 않는다. 그러나 별칭은 원래 테이블명을 바꾸는 것이기 때문에 원래 테이블로 작성할 경우 에러가 발생한다.
-- 불가능
SELECT EMP.ename, d.loc, e.deptno
FROM EMP e, DEPT d
WHERE e.deptno = d.deptno;
2. NON EQUI JOIN
조인하려는 테이블들 사이의 연결 조건이 이퀄(=)이 아닌 경우에는 NON EQUI JOIN을사용한다.
예를 들어 사원(EMP)테이블과 급여 등급(SALGRADE) 테이블을 조인하여 이름, 월급 , 급여 등급을 출력할 경우 아래와 같이 쿼리를 작성한다.
SELECT E.ename, E.sal, S.grade
FROM EMP E, SALGRADE S
WHERE E.sal BETWEEN S.losal AND S.hisal
등급을 나누는 월급 범위에서 하단인 losal, 상단인 hisal 컬럼을 BETWEEN 과 함께 사용하여 월급의 등급을 나타낸다.
EQUI JOIN에서 봤던 예제와는 달리 EMP테이블과 SALGRADE 테이블에 동일한 컬럼이 존재 하지 않아 조인 조건에 이퀄(=)이 사용되지 않는다. 대신 EMP 테이블에 월급을 나타내는 SAL과, 이에 대한 등급을 나타내는 LOSAL, HISAL 컬럼이 SALGRADE 테이블에 있다. 이를 이용해 위 쿼리 처럼 월급에 대한 등급을 출력할 수 있다. 이 처럼 조인 조건에 이퀄(=)을 사용할 수 없는 조인이 NON EQUI JOIN이다.
3. OUTER JOIN
OUTER JOIN은 EQUI JOIN으로는 볼 수 없는 결과 데이터를 출력하기 위해서는 OUTER JOIN을 사용한다.
예를 들어 사원테이블과 부서 테이블을 조인하여 이름과 부서 위치를 출력하는데, BOSTON도 같이 출력할 경우 아래와 같이 쿼리를 작성한다. 먼저 이 문제를 쉽게 해결하기 위해 사원테이블을 먼저 생각한다.
문제에서 얘기하는 BOSTON은 부서 번호가 40인 부서의 위치이다. 그러나 EMP 테이블을 보면 부서번호가 40인 사원이 없다는 것을 알 수 있다. 즉, EQUI JOIN을 통해 각 사원들의 부서 위치를 출력한다면 볼 수 없는 것이다. 따라서 BOSTON에는 사원이 배치되지 않았다는 정보를 한눈에 확인하기 위해서는 OUTER JOIN을 사용해아한다.
OUTER JOIN을 사용하기 위해서 EQUI JOIN에서 (+) 기호를 추가하면 볼 수 없는 결과 데이터를 출력할 수 있다. 여기서 (+) 표시를 붙이는 기준은 두 테이블 중 결과가 덜 나오는(null값이 나오는) 쪽에 붙여준다. 즉 예시에서는 EMP테이블 쪽에 붙여준다.
SELECT E.ename, D.loc
FROM EMP E, DEPT D
WHERE E.deptno (+) = D.deptno;
EQUI JOIN은 양쪽에 다 존재하는 데이터만 출력한다.
LEFT OUTER JOIN은 EMP 테이블에는 존재하고 DEPT 테이블에는 존재하지 않는 데이터를,
RIGHT OUTER JOIN은 DEPT 테이블에는 존재하는데 EMP 테이블에는 존재하지 않는 데이터를 출력한다.
아래 그림을 참고하면 더 쉽게이해할 수 있다.
4. SELF JOIN
자기 자신의 테이블과 조인하기 위해서 SELF JOIN을 사용한다.
예를 들어 사원 테이블 자기 자신의 테이블과 조인하여 이름, 직업, 해당 사원의 관리자 이름과 관리자의 직업을 출력하는 경우 아래와 같이 쿼리를 작성한다.
SELECT E.ename as 사원, E.job as 직원, M.ename as 관리자, M.job as 직업
FROM EMP E, EMP M
WHERE E.mgr = M.empno AND E.job = 'SALESMAN';
WARD, TURNER, ALLEN, MARTIN의 관리자는 모두 BLAKE이라는 것을 알 수 있다.
여기서 이들을 연결해주는 연결고리는 mgr, 즉 사원의 직속 상사의 사원번호와 사원번호(empno)이다. 이전에 EQUI JOIN에서의 경우 서로 다른 테이블에 연결고리가 있었지만, 한 테이블 안에 연결고리가 존재하는 경우 SELF JOIN을 사용해야한다.
따라서 EMP 테이블을 각각 E, M이라는 별칭을 두고 E 테이블에서의 직속 상사의 사원번호(mgr)과 M테이블에 사원 번호를 대조하여 일치하는 것 만을 출력하면 사원들의 상사에 대한 정보를 출력할 수 있다.