본문 바로가기
데이터베이스

8. JOIN

by 김마리님 2020. 4. 1.

데이터베이스를 하다보면 원하는 자료가 다른 테이블에 있는 경우가 있다. 이 테이블에서 다른 테이블로, 일일히 비교하면서 분석하는덴 불편함이 많기 때문에 이를 해결하기 위해 JOIN을 이용한다.

JOIN은 오라클과 기타 프로그램의 문법이 다르다.

-오라클 문법

SELECT a.col1, b.col1
from table1 a, table2 b
where a.col2=b.col2;

JOIN함수는 여러가지가 있다.

 

1. 카티션 곱

카티션 곱은 해당 테이블에 대한 모든 정보를 다 가져오는 것을 말한다. 이 때는, 조건절이 맞지 않거나 아예 기술되지 않았을 때이다.

SELECT *
FROM DEPT D, EMP E;

다음과 같이 모든 데이터가 곱셈이 된 상태로 출력된다.

다만 문제점은 다음과 같다.

이 데이터를 order by로 정리해보면,

SELECT *
FROM DEPT D, EMP E
order by ename;

다음과 같이 같은 이름이 네번 발생하는 것을 볼 수 있다. 이것은 dept의 데이터가 네 종류이기 때문에, 이 네 종류와 일일히 곱해졌기 때문이다. 따라서 카티션 곱은 데이터의 낭비가 일어나서 의도치 않으면 사용을 지양한다.

 

 

2. EQUI join(등가 조인, inner 조인, 동일 조인)

등가 조인은 카티션 곱에 where 절을 통해 조건부로 데이터를 가져오는 것을 의미한다.

SELECT *
FROM DEPT D, EMP E
WHERE D.DEPTNO = E.DEPTNO
order by ename;

다음과 같이 카티션 곱에서 조건(deptno의 일치) 가 맞는 데이터만을 가지고 온 것을 볼 수 있다.

이너 조인도 오라클과 ansi 문법이 다르다

- 오라클 문법

SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO=D.DEPTNO;

-ANSI 문법

SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON E.DEPTNO=D.DEPTNO AND E.DEPTNO=10;

다음처럼 중간에 들어가는 내용이 다르다.

조인되는 값을 오라클은 ,(세미콜론) 으로 표기하지만, ansi는 JOIN으로 적고, WHERE 절을 ON으로 표기한다.

 

 

3. Outer Join(아우터 조인)

이너 조인은 양 테이블에 완벽하게 데이터가 일치하는 경우에만 출력되는데, 아우터 조인은 한 쪽엔 데이터가 있고 다른쪽엔 데이터가 없을 때, 이 불균형하게 주어진 데이터를 마저 호출하는 방식이다.

아우터 조인은 데이터가 부족한 부분에 (+)를 붙여서 만든다.

 

SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO;

 

-inner join

-outer join

확실한 차이가 느껴진다. inner join은 emp에 40번 부서 사람이 없으니 40번 부서를 출력하지 않았지만, outer join의 경우 dept 테이블에 있는 40번 부서를 출력했다. 이렇게, 일치하지 않는 데이터를 출력하는 대상이 오른쪽에 있을 경우, 라이트 아우터 조인이라고 한다.

반대 경우를 보자.

 

SELECT *
FROM EMP E, DEPT D
WHERE D.DEPTNO = E.DEPTNO(+);

 이렇게 왼쪽 테이블에 있는 데이터를 전부 뱉어야 하는 경우를 레프트 라이트 조인이라고 한다.

 

아우터 조인도 마찬가지로 오라클과 ansi 문법이 다르다.

 

-오라클 문법

SELECT *
FROM BOARD B, REPLY R
ON B.ID=R.BOARDid(+);

-ANSI 문법

SELECT *
FROM BOARD B LEFT OUTER JOIN REPLY R
ON B.ID=R.BOARDid;

SELECT *
FROM BOARD B RIGHT OUTER JOIN REPLY R
ON B.ID=R.BOARDid;

SELECT *
FROM BOARD B FULL OUTER JOIN REPLY R
ON B.ID=R.BOARDid;

이 때, 오라클 문법은 FULL OUTER JOIN 이 없지만, ANSI 문법은 FULL OUTER JOIN을 쓸 수 있다.

FULL OUTER JOIN은 서로가 가지고 있는 데이터를 다 뱉어내지만 카티션 곱처럼 모든 데이터를 곱하지는 않는다.

 

4. SELF JOIN

위의 조인들은 서로 다른 테이블에 있을 때 하는 것이지만, 셀프 조인은 한 테이블에 자료가 함께 있을 때 사용한다.

하나의 테이블에서 별명을 두 개로 지정할 뿐이다. 이후는 일반적인 조인과 같다.

(조인 전의 테이블)

SELECT E1.EMPNO, E1.ENAME, E1.JOB, E1.MGR, E2.ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR=E2.EMPNO(+);

다음과 같이 조인함수에 의해 같은 테이블에서 데이터가 추출되서 새로운 행이 조인된 것을 볼 수 있다.

반응형