본문 바로가기

데이터베이스

오라클실습 (JOIN)

RDB ?  JOIN ? RDBMS의 꽃

 

JOIN은 데이터의 수평적 결합

집합연산자 수직적 결합

 

1번의 결과는 다음과 같다

SELECT DNAME, ENAME, JOB, SAL FROM EMP, DEPT WHERE DEPTNO=DEPTNO;

 

2번의 결과는 다음과 같다

SELECT DNAME, ENAME, JOB, SAL FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

데이터가 집합연산자와 다르게 수평적으로 결합되는 것을 확인할 수 있다.

JOIN의 구분은 FROM 절에 복수의 테이블이 왔을 때 JOIN임을 의미한다.

 

데이터를 기반으로 연결고리를 갖는다? 필요시에만 연산을 통해 연결을 해보자...

emp.deptno = dept.deptno 이것이 연산이 이루어지는 과정임.

 

RDBMS 이전에는 무엇으로 연결고리를 가졌을까요? 계층형, 망형은 물리적인 point로 연결함

장점은 굉장히 빠르다... 단점은 유연성이 떨어짐.

 

 

3번의 경우

데이터를 필터링하고 JOIN을 하는 경우가 더욱 효율적이다. -> 데이터의 수가 줄어든다

EQUI JOIN : 두 집합이 정확히 일치하는 값을 가지고 조회하는 것.

 

TABLE ALIAS의 용도 

1. 편의성

2. 가독성

3. SELF JOIN시에는 필수적으로 사용

4. 동일 칼럼명이 존재하는 경우

 

ANSI 같은 경우를 명시적 기법이라고 하는 이유는 ON 에 JOIN을 말하는 구문이 들어가기 때문이고,

WHERE에 필터링 조건절이 들어간다.

 

5번의 경우 FROM절에 테이블 세 개가 온 것.

E D S 라는 테이블이 있다.

DBMS는 세 개의 테이블을 동시에 JOIN 하지 못한다.

 

1. 세 개 중에 두 개를 먼저... JOIN 하면 JOIN의 결과 집합이 만들어진다.

2. 이 결과 집합을 가지고 나머지 테이블과 JOIN 연산을 한다.

 

3개의 테이블을 JOIN 하기 위해 2개의 JOIN 조건이 필요하다.

즉 N-1개 (단, N은 테이블의 갯수)

 

 

 

ORACLE DBMS에서는 양방향 아우터 조인을 지원하지 않지만

최대한 ANSI 를 지원하기 위해 노력한다.

그래서 

ANSI 표준처럼 SQL을 기입하면 다음과 같이 나옴

 

 

LEFT OUTER JOIN / RIGHT OUTER JOIN 의 예시를 살펴본다.

 

EMP TABLE

DEPT TABLE

 

 

DEPT 테이블에는 40번 부서가 있지만, EMP 테이블에는 40번 부서에 근무하는 EMPLOYEE가 없다.

 

 

SELECT D.DNAME, E.ENAME, E.JOB, E.SAL
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
ORDER BY D.DNAME;

SELECT D.DNAME, E.ENAME, E.JOB, E.SAL 
FROM EMP E, DEPT D 
WHERE E.DEPTNO = D.DEPTNO(+) 
ORDER BY D.DNAME;

 

3번의 경우

오라클 옵티마이저는 OR을 싫어함

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Carteisian product ? JOIN을 잘못 사용할 경우 발생한다.

 

여러 명령어들 순차적으로 실행하고, 반복 실행하기 위해 쉘 스크립트 파일을 만들었음.

SQL SCRIPT 파일을 만드는 이유도 이와 같음.

변경한 사항을 데이터베이스에 영구히 저장하는 것을 commit

 

 

 

 

JOIN을 처리하는 내부 알고리즘

1. NESTED LOOP JOIN 

2. SORT MERGE JOIN ; SORT를 우선적으로 한 후, MERGE를 하는 JOIN

3. HASH JOIN ( 2번의 SORT MERGE JOIN을 개선해서 나온 것)

 

 

 

 

'데이터베이스' 카테고리의 다른 글

오라클과제 (190508)  (0) 2019.05.08
오라클과제 (190507)  (0) 2019.05.07
오라클실습 (190507)  (0) 2019.05.07
ROWNUM  (0) 2019.05.03
널 (null), 디코드 (decode), 케이스 (case)  (0) 2019.05.03