Oracle - JOIN

목록



JOIN

두 개 이상의 테이블에 있는 컬럼의 값을 한 번에 가져오기 위해 사용하는 쿼리이다. 조회하는 컬럼 중 어떤 컬럼은 A테이블에, 어떤 컬럼은 B테이블에 있다면, FROM 절에 A테이블, B테이블을 join해야 원하는 데이터를 조회할 수 있다.

위 쿼리에 대한 조회를 보면, emp 테이블에 대한 전체 조회를 했을 경우, 출력되는 컬럼 수는 14개이다. 그리고 dept 테이블에 대한 전체 조회를 했을 경우, 출력되는 컬럼 수는 5개이다.

join을 해서 조회하면 두 테이블에 대한 데이터를 중복검사 없이 조회를 하기 때문에 emp 테이블의 14개와 dept 테이블의 5개를 결합한 총 70개의 데이터가 조회되는 것을 확인할 수 있다.

SQL Developer 통해서 join한 전체 데이터를 다시 조회해보면, 중복되는 컬럼을 확인할 수 있다.

이 중복된 데이터를 제거하고 조회하고 싶다면, emp 테이블의 deptno 컬럼과 dept 테이블의 deptno 컬럼이 같다는 것을 명시하면 될 것이다.

1
2
3
SELECT *
FROM emp, dept
WHERE emp.deptno = dept.deptno;

이렇게 하면 잘못된 데이터는 제외되고 14개의 데이터만 조회된다.


SELF JOIN

같은 테이블을 두 번 이상 조인하는 것을 Self Join이라고 한다.

아래의 데이터를 조회해보자.

1
'SMITH' 사원의 사원번호(empno), 이름(ename), 직속상관의 이름(ename)을 가져온다.

ename을 두 번 조회해야 하는 문제이다. 당연히 같은 이름이 아니며, ename 중 하나는 ‘SMITH’ 이름에 해당하며, 다른 하나는 ‘SMITH’ 사원의 직속상관(mgr)과 같은 사원번호를 갖는 사원의 이름이 될 것이다. 쿼리를 작성해보면 다음과 같다.

1
2
3
4
SELECT e1.empno, e1.ename, e2.ename as "직속상관"
FROM emp e1, emp e2
WHERE e1.ename = 'SMITH'
AND e1.mgr = e2.empno; -- e1 테이블의 mgr과 일치하는 empno를 갖는 테이블 조회

emp 테이블을 두 개 가져와서 하나는 ‘SMITH’ 사원에 대한 테이블로, 다른 하나는 ‘SMITH’ 사원의 직속상관에 대한 데이터를 찾는 테이블로 사용했다.


OUTER JOIN

조인 조건에 만족하지 못해 제거되는 row까지 모두 가져오는 것을 Outer Join이라고 한다.

아래의 퀴즈를 해결하며 알아보자.

1
2
각 사원의 이름(ename), 사원번호(empno), 직속상관(mgr) 이름(ename)을 가져온다. 
단 직속상관이 없는 사원도 가져온다.

일반 사원에 대한 테이블과 각 사원에 대한 직속상관에 해당하는 테이블 2개를 조회해야 함을 알 수 있다.

1
2
3
SELECT e1.ename, e1.empno, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno; -- e1 테이블의 mgr과 일치하는 empno를 갖는 테이블 조회

이렇게만 하면, 아래처럼 조회할 수 있다.

퀴즈의 조건 중 직속상관이 없는 직원은 조회되지 않은걸 알 수 있다. 이 때 사용되는게 Outer Join이다. Join을 하는 테이블중 where 조건에 해당안하더라도 모든 데이터를 조회하고자 한다면, (+)를 붙여서 조회하면 된다.

쿼리를 수정해서 다시 조회해보았다.

1
2
3
SELECT e1.ename, e1.empno, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno(+); -- where조건에 부합하지 않더라도 e2 테이블 전체조회