레이블이 #EQUI조인 #등가조인 #Equal조인 #SQL조인 #오라클조인 #ORACLE #SQL #SQL강좌 #SQL교육인 게시물을 표시합니다. 모든 게시물 표시
레이블이 #EQUI조인 #등가조인 #Equal조인 #SQL조인 #오라클조인 #ORACLE #SQL #SQL강좌 #SQL교육인 게시물을 표시합니다. 모든 게시물 표시

2021년 10월 31일 일요일

오라클 SQL, 등가조인(Equi Join)과 비등가조인(Non-Equi Join)

 

오라클 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교육

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...