본문 바로가기
Database/Oracle

[Oracle SQL] 조인(join) - 오라클 조인

by Amy IT 2022. 5. 11.

지금까지는 하나의 테이블에 대해서만 SELECT문을 사용했습니다. 만일 검색하고자 하는 데이터가 여러 테이블에 분산되어 있는 경우에는 어떻게 해야 할까요? 이때 필요한 것이 조인(join) 기능입니다. 

 

예를 들어 SMITH의 부서명을 알고 싶을 때, 기존에는 emp 테이블과 dept 테이블 두 가지를 모두 확인하는 것이 필요했습니다. 하지만 emp 테이블과 dept 테이블이 공통적으로 가지는 컬럼인 deptno를 이용해서 두 테이블을 연결시켜주면 원하는 정보를 한번에 확인할 수 있게 됩니다. 즉 조인을 통해 여러 테이블들을 하나의 테이블로 합쳐서 사용할 수 있습니다. 이번 글에서는 먼저 오라클에서만 사용되는 오라클 조인을 알아보겠습니다.

 

 

1. equi 조인 (동등 조인)

 

조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 반드시 일치하는 행을 연결하는 방법입니다. 대부분 기본키(Primary Key)를 가진 부모 테이블과 외래키(Foreign Key)를 가진 자식 테이블을 조인할 때 사용합니다. 앞서 언급된 emp 테이블의 deptno 컬럼은 외래키로서 dept 테이블의 기본키인 deptno 컬럼을 참조하고 있습니다. 이러한 관계에서 사용할 수 있는 것이 equi 조인입니다. 

SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.공통컬럼 = 테이블2.공통컬럼;
SELECT * 
FROM emp, dept 
WHERE emp.deptno=dept.deptno;

deptno 컬럼이 서로 일치하는 행으로 연결되어, 총 레코드 12개와 컬럼 11개로 조인이 잘 이루어진 것을 확인할 수 있습니다. 

 

이제 SMITH의 부서명을 한 번의 SELECT문으로 알 수 있습니다. 기존에 WHERE절로 지정했던 검색 조건은 AND로 추가해 줍니다.

SELECT dname
FROM emp, dept 
WHERE emp.deptno=dept.deptno
AND ename='SMITH';

 

이때 주의할 점은, deptno와 같이 중복되는 컬럼의 경우 모호성 제거를 위해 어떤 테이블의 컬럼을 사용할지 반드시 명시해 주어야 한다는 것입니다.

SELECT ename, dname, emp.deptno
FROM emp, dept 
WHERE emp.deptno=dept.deptno;

 

다음과 같이 테이블에 별칭을 부여할 수도 있습니다.

SELECT e.ename, d.dname, e.deptno
FROM emp e, dept d
WHERE e.deptno=d.deptno;

 

 

 

2. non-equi 조인

 

WHERE절에 조인 조건을 지정할 때 동등 연산자(=) 이외의 비교 연산자를 사용하는 조인입니다. emp 테이블과 salgrade 테이블 사이에는 공통 컬럼이 없습니다. 하지만 emp 테이블의 sal 컬럼과 salgrade 테이블의 losal, hisal 컬럼 사이의 연관성을 이용해서 조인시킬 수 있습니다. 

 

다음과 같이 월급이 최소값과 최대값 사이에 포함되는 범위로 연결시킬 수 있습니다.

SELECT * 
FROM emp, salgrade 
WHERE sal BETWEEN losal AND hisal;

 

테이블 3개를 조인하여 이름이 SMITH인 사원의 이름, 월급, 월급의 등급, 부서명, 부서지역을 한번에 출력해 보겠습니다.

SELECT ename, sal, grade, dname, loc
FROM emp e, dept d, salgrade s
WHERE e.deptno=d.deptno
AND sal BETWEEN losal AND hisal
AND ename='SMITH';

 

 

 

3. self 조인

 

equi 조인과 non-equi 조인은 2개 또는 3개의 테이블을 조인하는 방법이었습니다. 그런데 하나의 테이블만 사용하여 자기 자신을 조인할 수도 있습니다. 

 

사원의 관리자 정보를 알기 위해 self 조인을 해 보겠습니다. 사원의 관리자 번호인 mgr과 그 관리자의 사원 번호인 empno를 연결시켜주면 됩니다.

SELECT e.ename, e.mgr, m.empno, m.ename
FROM emp e, emp m
WHERE e.mgr=m.empno;

사원의 관리자 번호와 그 관리자의 사원 번호가 일치하는 값으로 잘 연결된 것을 확인할 수 있습니다. 

 

그런데 emp 테이블에서 KING은 관리자가 없습니다. 조인할 때 일치하는 데이터가 없기 때문에 검색 결과에 누락되어 출력이 되었습니다. 조인 조건을 만족하지 않는 데이터까지 출력하고 싶을 때는 OUTER 조인을 해야 합니다.

 

 

 

4. OUTER 조인

 

조인 조건에 일치하는 데이터만 조회하는 조인을 INNER 조인이라 합니다. 반면 OUTER 조인은 조인 조건을 만족하지 않아도 결과 값에 포함시키는 조인 방법입니다. 일치하는 데이터가 없는 쪽에 (+) 연산자를 지정하면, 내부적으로 null값을 가지는 레코드가 생성되어 조인하게 됩니다. KING까지 출력된 것을 확인할 수 있습니다. 

SELECT e.ename, e.mgr, m.empno, m.ename
FROM emp e, emp m
WHERE e.mgr=m.empno(+);

 

사원, 사원의 관리자, 관리자의 관리자 정보를 모두 출력하는 SQL문입니다.

SELECT e.ename, e.mgr, m.empno, m.ename, m.mgr, mm.empno, mm.ename
FROM emp e, emp m, emp mm
WHERE e.mgr=m.empno(+)
AND m.mgr=mm.empno(+);

 

 

오라클에서 사용 가능한 오라클 조인에 대한 내용이었습니다. 다음 글에서는 표준화된 조인인 ANSI 조인을 정리해 보겠습니다.

 

 

댓글