오라클 SQL, 등가조인(Equi Join)과 비등가조인(Non-Equi Join)
등가조인(Equi Join)은 흔히 사용하는 조인의 형태이며 조건 절에 조인되는 두 테이블의 컬럼을 Equal 연산자(=)로 연결하는 경우 입니다. 주로 Primary Key와 Foreign Key 컬럼이 서로 조인될 때 이용되는 형태 입니다.
비등가조인(Non-Equi Join)은 조인 조건이 Equal 연산자 이외의 >, >=, <, <=, <>, BETWEEN … AND 연산자들을 이용하여 조인을 하는 경우 입니다. 한 테이블의 어떠한 컬럼도 조인 할 테이블의 컬럼에 직접적으로 일치하지 않는 경우에 사용 합니다.
이러한 조인을 내부조인 이라고도 합니다.
EMP, DEPT 테이블의 DEPTNO라는 공통 컬럼을 Equal(=) 연산자로서 Equi Join 하는 예 입니다. EMP 테이블에는 부서명(DNAME) 컬럼을 가지고 있지 않으므로 DEPT 테이블과 조인을 해야만 부서명을 얻을 수 있습니다. EMP 테이블의 DEPTNO는 외래키(Foreign Key)이고 DEPT 테이블에서 DEPTNO는 주키(Primary Key) 입니다. 아래 예문에서 두 테이블의 공통 컬럼인 DEPTNO가 서로 Primary Key, Foreign Key 관계이므로 USING구를 이용한 형태도 가능하다는 것을 참고로 알아 두면 좋습니다. 아래 6가지 표현은 모두 같은 결과를 만들어 내는 쿼리문 입니다 |
SELECT ename AS "사원명" , dname AS "부서명" FROM emp E, dept D WHERE E.deptno = D.deptno AND E.JOB = 'SALESMAN' |
<실행결과>
| 사원명 | 부서명 |
1 | ALLEN | SALES |
2 | TURNER | SALES |
3 | MARTIN | SALES |
4 | WARD | SALES |
내부조인 형태(inner join ~ using) 이며 표준 ANSI JOIN 구문 입니다. 두 테이블에 이름이 같은 컬럼이 존재하는 경우에는 using문을 사용할 수 있습니다. |
SELECT ename "사원명" , dname "부서명" FROM emp E INNER JOIN dept D USING (deptno) WHERE JOB = 'SALESMAN' |
일반적인 조인 형태(JOIN ~ USING) 이며 표준 ANSI JOIN 구문 입니다. 두 테이블에 이름이 같은 컬럼이 존재하는 경우에는 using문을 사용할 수 있습니다. |
SELECT ename "사원명" , dname "부서명" FROM emp E JOIN dept D USING (deptno) WHERE JOB = 'SALESMAN' |
JOIN ~ USING, INNER JOIN ~ USING 인 경우 이름이 같은 공통 컬럼이 있든, 없든 on 절에 조인 조건을 기술 합니다. 기타 다른 조건이 있는 경우 where 절에 기술하거나 on 다음에 and 절을 기술하면서 조건을 주셔도 됩니다. |
SELECT ename "사원명" , dname "부서명" FROM emp E JOIN dept D ON E.deptno = D.deptno WHERE E.JOB = 'SALESMAN' |
SELECT ename "사원명" , dname "부서명" FROM emp E JOIN dept D ON E.deptno = D.deptno AND E.JOB = 'SALESMAN' |
오라클9i 이후 조인 시 두 테이블의 컬럼명이 같은 경우 조인 컬럼을 자동으로 알아서 조인하므로 이러한 등가조인(Equi Join)을 자연조인(Natural Join)이라고 하고 ON절이나 USING문을 사용하지 않아도 됩니다. |
SELECT ename "사원명" , dname "부서명" FROM emp E NATURAL JOIN dept D WHERE E.JOB = 'SALESMAN' |
자연조인(Natural Join)에서는 SELECT절에 JOIN컬럼이 출현시 테이블 별칭을 사용하면 안됩니다. |
SELECT ename "사원명" , dname "부서명" , E.deptno ❶ FROM emp E NATURAL JOIN dept D WHERE E.JOB = 'SALESMAN' |
<실행결과>
ORA-25155: NATURAL 조인에 사용된 열은 식별자를 가질 수 없음
❶ E.deptno에서 테이블 별칭인 E를 생략해야 합니다.
SELECT ename "사원명" , dname "부서명" , deptno FROM emp E NATURAL JOIN dept D WHERE E.JOB = 'SALESMAN' |
<실행결과>
| 사원명 | 부서명 |
1 | ALLEN | SALES |
2 | TURNER | SALES |
3 | MARTIN | SALES |
4 | WARD | SALES |
사원테이블(EMP) 테이블과 급여등급테이블(SALGRADE)을 조인하여 급여등급을 출력하는 쿼리문 입니다. SALGRADE 테이블에는 등급별로 하한 값과 상한 값을 가지고 있기 때문에 각 사원들의 등급을 알기 위해서는 SALGRADE 테이블과 EMP 테이블을 Non-Equi Join을 해야 합니다. 즉 조인을 하는 각 테이블의 컬럼이 직접적으로 일치 하는 않는 경우에 사용 합니다. 아래 4가지 쿼리문은 동일한 결과를 만들어 냅니다. |
SELECT E.ename "이름" , E.sal "급여" , S.grade "등급" FROM emp E, salgrade S WHERE E.deptno = 10 AND E.sal BETWEEN S.losal AND S.hisal |
<실행결과>
이름 | 급여 | 등급 | |
1 | CLARK | 2450 | 4 |
2 | MILLER | 1300 | 2 |
SELECT E.ename "이름" , E.sal "급여" , S.grade "등급" FROM emp E JOIN salgrade S ON E.sal BETWEEN S.losal AND S.hisal WHERE E.deptno = 10 |
SELECT E.ename "이름" , E.sal "급여" , S.grade "등급" FROM emp E JOIN salgrade S ON E.sal >= S.losal AND E.sal <= S.hisal WHERE E.deptno = 10 |
SELECT E.ename "이름" , E.sal "급여" , S.grade "등급" FROM emp E INNER JOIN salgrade S ON E.sal >= S.losal AND E.sal <= S.hisal WHERE E.deptno = 10 |
#EQUI조인 #등가조인 #Equal조인 #SQL조인 #오라클조인 #ORACLE #SQL #SQL강좌 #SQL교육