본문 바로가기
Database/Oracle

[Oracle SQL] 조인(join) - ANSI 조인

by Amy IT 2022. 5. 12.

ANSI 조인은 오라클이 아닌 환경에서도 사용 가능한 표준화된 조인입니다. 

 

 

1. Natural 조인 (동등 조인)

 

오라클 조인의 equi 조인과 동일한 기능입니다. 단, 조인하는 테이블들에 반드시 한 개의 공통 컬럼이 있어야 되며, 두 개 이상의 공통 컬럼이 존재할 경우 엉뚱한 실행 결과가 출력될 수 있습니다. 

SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 NATURAL JOIN 테이블2
[WHERE 검색조건];

어떤 컬럼을 조인시킬 것인지 지정하지 않아도 자동으로 공통 컬럼을 찾아서 조인하게 됩니다.

SELECT * FROM emp NATURAL JOIN dept;

오라클 조인에서 동등 조인을 할 때는 컬럼이 총 11개(emp 테이블 8개 + dept 테이블 3개)였습니다. 반면 Natural 조인에서는 공통 컬럼인 deptno 컬럼이 한 개로 합쳐져 총 10개의 컬럼으로 출력됩니다. 주의할 것은, deptno 컬럼이 공통 컬럼으로서 한 개로 합쳐졌기 때문에 'emp.deptno'와 같이 테이블을 지정하면 오류가 발생합니다. 

 

20번 부서에 속한 사원의 이름, 부서번호, 부서명을 Natural 조인을 사용하여 출력하는 SQL문입니다.

SELECT ename, deptno, dname
FROM emp NATURAL JOIN dept
WHERE deptno=20;

 

 

 

2. INNER 조인 

 

2-1. USING 절 (동등 조인)

 

Natural 조인 사용시 두 개 이상의 공통 컬럼이 있을 때 엉뚱한 결과가 출력될 수 있습니다. 이때 USING절을 사용하여 명시적으로 어떤 컬럼으로 조인시킬 것인지 지정할 수 있습니다. 

SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 [INNER] JOIN 테이블2 USING(공통컬럼)
[WHERE 검색조건];
SELECT * FROM emp JOIN dept USING(deptno);

앞서 살펴본 Natural 조인과 동일한 결과를 출력합니다. USING절 사용시에도 마찬가지로 공통 컬럼에 테이블을 지정하면 오류가 발생합니다. 

 

20번 부서에 속한 사원의 이름, 부서번호, 부서명을 USING절을 사용하여 출력하는 SQL문입니다.

SELECT ename, deptno, dname 
FROM emp JOIN dept USING(deptno)
WHERE deptno=20;

 

 

2-2. ON 절 (non-equi 조인 또는 임의의 조건으로 조인)

 

Natural 조인이나 USING절은 내부적으로 공통 컬럼값이 반드시 일치하는 Equi 조인 형식으로 실행됩니다. Non-equi 조인이나 임의의 조건으로 조인할 경우에는 ON절을 사용해야 합니다. 

SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 [INNER] JOIN 테이블2 ON 조인조건
[WHERE 검색조건];
SELECT * FROM emp e JOIN dept d ON e.deptno=d.deptno;

ON절 사용시, deptno 컬럼이 두 개가 출력되기 때문에 어떤 테이블의 컬럼을 사용할 것인지 명시해 주어야 합니다.

 

20번 부서에 속한 사원의 이름, 부서번호, 부서명을 ON절을 사용하여 출력하는 SQL문입니다.

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

 

사원 이름, 부서번호, 부서명, 월급 등급을 출력하기 위해 ON절을 사용하여 3개의 테이블을 조인시키는 SQL문입니다.

SELECT ename, e.deptno, dname, grade
FROM emp e JOIN dept d ON e.deptno=d.deptno
	   JOIN salgrade s ON sal BETWEEN losal AND hisal;

 

 

2-3. self 조인

 

사원의 이름, 사원의 관리자 번호, 관리자의 사번, 관리자의 이름, 관리자의 관리자 번호, 관리자의 관리자 사번, 관리자의 관리자 이름을 모두 출력하는 SQL문입니다. 

SELECT e.ename, e.mgr, m.empno, m.ename, m.mgr, mm.empno, mm.ename
FROM emp e JOIN emp m ON e.mgr=m.empno
           JOIN emp mm ON m.mgr=mm.empno;

 

 

 

3. OUTER 조인

 

오라클 조인에서 (+) 연산자를 사용한 것과 마찬가지로 ANSI 조인에서도 OUTER 조인을 사용할 수 있습니다. 오라클 조인에서는 (+) 연산자를 한 쪽 테이블에서만 사용할 수 있었던 것과 달리, ANSI 조인에서는 양쪽 테이블 모두 지정이 가능합니다. 

SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 LEFT|RIGHT|FULL OUTER JOIN 테이블2 
USING(컬럼) | ON 조인조건
[WHERE 검색조건];

 

위의 SQL문에서 관리자가 없거나, 관리자의 관리자가 없는 사원들도 모두 출력하려면 왼쪽 테이블의 데이터를 조인 조건 일치 여부와 상관없이 모두 출력해야 합니다. 따라서 다음과 같이 LEFT OUTER JOIN을 사용할 수 있습니다.

SELECT e.ename, e.mgr, m.empno, m.ename, m.mgr, mm.empno, mm.ename
FROM emp e LEFT OUTER JOIN emp m ON e.mgr=m.empno
           LEFT OUTER JOIN emp mm ON m.mgr=mm.empno;

 

 

이상은 조인에 대한 내용이었습니다. 다음 글에서는 서브쿼리에 대해 다루어 보도록 하겠습니다.

댓글