Hi yoahn 개발블로그

#5 JOIN 본문

데이터베이스/Oracle

#5 JOIN

hi._.0seon 2020. 6. 8. 17:48
반응형

정규화

- 하나의 테이블을 더 작은 테이블로 분리하여 중복을 최소화한다.

- 다수의 컬럼으로 구성된 테이블을 논리 덩어리별로 작은 테이블로 분할

- 장점: 데이터베이스 변경시 이상 현상 제거

 

비정규화

- 정규화의 반대, 중복 허용

- 장점: 조회 성능 향상

-> 중복을 허용해서 자주쓰이는 결과물들을 미리 테이블에 만들어서 컬럼화 해둠

    -> 조회 성능 극단적으로 좋아질 수 있다.

 

JOIN: 정규화 후 여러 테이블에 흩어진 데이터들을 조합해서 가져오는 기술

 

*** 선행, 후행 테이블

조인 수행 시 둘 중 하나의 테이블을 먼저 읽고 조인 조건절을 확인하여 첫번째 테이블을 먼저 읽고 각 행마다 조인 조건절을 확인하여 나머지 테이블에서 데이터를 가져옴

 

1. 카티션 곱

조인 대상 테이블들의 조건이 누락되었을 경우 발생하는 현상, 해당 조인에 참여하는 모든 대상 행을 다 출력

(선행, 후행 테이블의 모든 조합)

- join 조건절을 잘못 적었거나 join 조건이 없는 경우

 

사용하는 경우

1) 데이터를 복제해서 원본 테이블을 반복해서 읽는 것을 피하기 위함

2) 실수로 조인조건 컬럼 일부를 빠뜨린 경우

 

2. EQUI JOIN

등가 조인, 조건절에서 = 연산자 사용

 

ex)

select e.empno, e.ename, d.dname

from emp e, dept d

where e.deptno=d.deptno;

 

[ANSI JOIN]

SELECT e.empno, e.ename, d.dname

from emp e JOIN dept d

ON e.deptno = d.deptno;

 

*** 컬럼명이 양쪽 테이블에서 겹치는 경우 테이블 이름을 지정해준다

table이름.col이름

 

INNER JOIN은 양쪽 테이블에 모두 데이터가 존재해야 결과로 나옴

(한쪽에 없는 데이터까지 다 보려면 OUTER JOIN을 사용)

 

- SQL이 실행 되면 먼저 검색 조건이 실행되어 조인할 테이블의 크기를 줄여준다.(스캔할 테이블의 양 감소)

조인 조건: 두 컬럼을 등호로 연결 (s.profno=p.profno)

검색 조건: 테이블의 컬럼 값을 제약하는 조건 (deptno = 101)

 

3. NON-EQUI JOIN

비등가 조인

조인 조건이 = 가 아닌 것

EQUI JOIN과 사용법 같고 조건 연산자만 다름

 

3개 이상의 테이블 조인 방법

[ANSI JOIN]

SELECT s.name, o.total, h.grade

from student s JOIN score o

ON s.studno = o.studno

JOIN hakjum h

ON o.total >= h.min_point

AND o.total <= h.max_point;

 

4. OUTER JOIN

INNER JOIN은 모든 테이블에 데이터가 존재해야 결과로 나옴

OUTER JOIN은 데이터가 한쪽에만 있어도 됨

 

**OUTER JOIN 방식은 DB 성능에 아주 나쁜 영향을 줄 수 있다.

A, B 테이블을 OUTER JOIN 하는 경우 A 테이블에 인덱스가 있어도 인덱스를 쓰지 않고 FULL SCAN을 하기 때문이다.

 

4.1 LEFT OUTER JOIN

- 왼쪽 테이블에 있는 모든 행을 다 출력

(오른쪽 테이블에 매칭되는 것이 없어도 왼쪽 테이블에 모든 항목을 출력)

 

문법

SELECT s.name, p.name

FROM student s, professor p

WHERE s.profno = p.profno(+);

 

-> 매칭되는 데이터가 없으면 오른쪽 테이블 컬럼을 NULL값으로 왼쪽 테이블 항목을 다 가져옴

NULL로 가져올 테이블의 컬럼에 (+) 를 붙임 

 

[ANSI OUTER JOIN]

SELECT s.name, p.name

FROM student s LEFT OUTER JOIN professor p

ON s.profno = p.profno;

 

 

4.2 RIGHT OUTER JOIN

문법

SELECT s.name, p.name

FROM student s, professor p

WHERE s.profno(+) = p.profno;

 

[ANSI OUTER JOIN]

SELECT s.name, p.name

FROM student s RIGHT OUTER JOIN professor p

ON s.profno = p.profno;

 

4.3 FULL OUTER JOIN

- FULL OUTER JOIN은 LEFT OUTER JOIN의 결과 + RIGHT OUTER JOIN의 결과를 합친것과 같다.

 

ORACLE 에서는 지원하지 않으므로 UNION으로 합쳐야 한다.

문법

SELECT s.name, p.name

from student s, professor p

where s.profno(+) = p.profno

UNION

select s.name, p.name

from student s, professor p

where s.profno=p.profno(+);

 

[ANSI FULL OUTER JOIN]

SELECT s.name, p.name

from student s FULL OUTER JOIN professor p

ON s.profno = p.profno;

 

5. ORACLE / ANSI OUTER JOIN

오라클 아우터 조인 주의사항

- WHERE 절의 아우터 조인이 되는 컬럼들에 대해서는 전부 아우터 조인 연산자(+)를 붙여야 함

- 하나라도 빠지면 일반 조인과 동일하게 됨

select d.deptno, d.dname, d.loc, e.empno, e.ename, e.sal
from dept d, emp e
where d.deptno = e.deptno(+)
and e.deptno(+) = 20
order by 1;

 

ANSI OUTER JOIN 주의사항

- WHERE 절에 기술한 조건은 기준 테이블의 집합 수를 결정 -> 출력되는 행 수에 영향

- ON 절에 기술한 조건은 아우터 조인 대상이 되는 집합을 말하는 것, 전체 결과 집합에는 아무런 영향을 주지 않음

 

6. SELF JOIN

- 하나의 테이블에 원하는 데이터가 다 들어있는 경우

- 자기 자신을 join

 

select e1.ename "ename", e2.ename "mgr_ename"

from emp e1, emp e2

where e1.mgr = e2.empno;

 

[ANSI SELF JOIN]

SELECT e1.ename, e2.ename "mgr_ename"

FROM emp e1 JOIN emp e2

ON e1.mgr = e2.empno;

 

 

반응형
Comments