2020년 7월 19일 일요일

SQL조인이란? 동등조인, EquiJoin, Non EquiJoin

SQL조인이란? 동등조인, EquiJoin, Non EquiJoin

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=621

6.3 EquiJoin, Non EquiJoin

조인(Join)이란? 두개의 테이블에 대해 연관된 행들을 조인 칼럼을 기준으로 비교하여 새로운 행 집합을 만드는 것으로 각 테이블간 의미있는 행들을 연결하는 개념이다. 일반적인 조인은 내부조인(Inner Join)으로 두 테이블의 공통칼럼(조인칼럼)을 기준으로 데이터를 추출하는 것 이며 EQUI JOIN, NON EQUI JOIN이 있다.

조인과 서브쿼리는 유사하지만 중요한 차이는 두테이블간의 관계에 있다. 조인은 동일한 등급, 레벨에서 이루어 지는 것이지만 서브쿼리는 주종관계, 즉 하나는 메인쿼리(MAIN QUERY)이고 하나는 부속쿼리(SUB QUERY) 이다.

EquiJoin : 흔히 사용하는 조인의 형태이며 조건 절에 조인되는 두 테이블의 컬럼을 Equal 연산자(=)로 연결하는 경우 이다. 주로 Primary Key와 Foreign Key 컬럼이 서로 조인될 때 이용되는 형태 이다.

Non EquiJoin : 조인 조건이 Equal 연산자 이외의 >, >=, <, <=, <>, BETWEEN … AND 연산자들을 이용하여 조인을 하는 경우 이다. 한 테이블의 어떠한 칼럼도 조인 할 테이블의 칼럼에 직접적으로 일치하지 않는 경우에 사용 한다.

-- EMP, DEPT 테이블의 DEPTNO라는 공통 컬럼을 Equal(=) 연산자로서 Equi Join 하는 예이다.

-- EMP 테이블에는 부서명(DNAME) 칼럼을 가지고 있지 않으므로 조인을 해야만 부서명을 얻을 수 있다. EMP 테이블의 DEPTNO는 Foreign Key이고 DEPT 테이블에서 DEPTNO는 Primary Key 이다. 아래 예문에서 두 테이블의 공통 칼럼인 DEPTNO가 서로 Primary Key, Foreign Key 관계이므로 USING구를 이용한 형태도 가능하다는 것을 참고로 알아 두자. 아래 4가지 표현은 모두 같은 쿼리문 이다.

SQL> select ename "사원명", dname "부서명"

2 from emp e, dept d

3 where e.job = 'SALESMAN'

4 and e.deptno = d.deptno;

사원명 부서명

---------- --------------

ALLEN SALES

WARD SALES

MARTIN SALES

TURNER SALES

SQL> select ename "사원명", dname "부서명"

2 from emp e join dept d

3 using (deptno)

4 where job = 'SALESMAN';

사원명 부서명

---------- --------------

ALLEN SALES

WARD SALES

MARTIN SALES

TURNER SALES

SQL> select ename "사원명", dname "부서명"

2 from emp e join dept d

3 on e.deptno = d.deptno

4 where e.job = 'SALESMAN';

사원명 부서명

---------- --------------

ALLEN SALES

WARD SALES

MARTIN SALES

TURNER SALES

-- 오라클9i 이후 EQUI JOIN을 자연조인(Natural Join)이라하고 공통 조인칼럼을 자동으로 알아서 내부적인 조인문을 만들어 조인하므로 ON절이나 USING문을 사용하지 않아도 된다. 주의할 점은 SELECT절에 JOIN컬럼이 출현시 테이블 별칭을 사용하면 안 된다.

SQL> select ename "사원명", dname "부서명"

2 from emp e natural join dept d

3 where e.job = 'SALESMAN';

사원명 부서명

---------- --------------

ALLEN SALES

TURNER SALES

MARTIN SALES

WARD SALES

SQL> select ename "사원명", dname "부서명", e.deptno

2 from emp e natural join dept d

3 where e.job = 'SALESMAN';

select ename "사원명", dname "부서명", e.deptno

*

1행에 오류:

ORA-25155: NATURAL 조인에 사용된 열은 식별자를 가질 수 없음

--EMP 테이블에서 10번 부서 사원들의 이름, 급여 , 급여등급(GRADE)을 SALGRADE를 참고하여 출력하는 예문이다. SALGRADE 테이블에는 등급별로 하한 값과 상한 값을 가지고 있기 때문에 각 사원들의 등급을 알기 위해서는 SALGRADE 테이블과 Non-Equi Join을 해야 한다. 즉 조인을 하는 각 테이블의 칼럼이 직접적으로 일치 하는 않는 경우이다.

SQL> select e.ename "이름", e.sal "급여", s.grade "등급"

2 from emp e, salgrade s

3 where e.deptno = 10

4 and e.sal between s.losal and s.hisal;

이름 급여 등급

---------- ---------- ----------

MILLER 1300 2

CLARK 2450 4

KING 5000 5

SQL> select e.ename "이름", e.sal "급여", s.grade "등급"

2 from emp e join salgrade s

3 on e.deptno = 10

4 and e.sal between s.losal and s.hisal;

이름 급여 등급

---------- ---------- ----------

MILLER 1300 2

CLARK 2450 4

KING 5000 5

댓글 없음:

댓글 쓰기

(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...