여니의 프로그래밍 study/Oracle

[Oracle] 조인에 대해 알아보자

여니's 2023. 5. 8. 11:37

 

조인

: 두 개 이상의 테이블을 가로로 연결하여 

하나의 테이블처럼 출력할 때 사용하는 방식

 

참고로 집합 연산자는 SELECT문의 결과값을 세로로 연결한다.

 


SELECT *
	FROM EMP, DEPT

만약 EMP 테이블에 15개의 행,
DEPT 테이블에 4개의 행이 있다면
총 15*4=60개의 행이 조회된다.

하지만 위 출력값에는 문제가 있다.

사원 데이터와 부서 데이터가 정확하게 떨어지지 않는 데이터도

모두 출력되기 때문이다.

 

조인 할 때, WHERE절이 중요한 역할을 한다. 

SELECT *
	FROM EMP, DEPT
  WHERE EMP.DEPTNO=DEPT.DEPTNO

 


조인의 종류

1. 등가 조인(=내부조인, 단순조인)

: 위에서 EMP, DEPT 테이블을 열 기준으로 조인했는데

이 방식이 바로 등가 조인이다.

테이블을 연결한 후, 출력행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식이다.

 

 

테이블끼리 겹치치 않는 열 이름이어도

대부분 테이블이나 별칭을 명시한다.

조인 테이블 개수가 몇십개가 되기 때문에.

 

 

기본적으로 테카르트 곱 현상이 일어나지 않도록 하기 위해

필요한 조건식의 최소 개수는 조인 테이블 개수에서 하나를 뺀 값이다. 

 

 

만약 테이블이 A,B,C라면

A와 B를 연결해줄 열 하나,

A와 B가 연결된 상태에서 C를 연결해줄 열 하나!

 

 

WHERE절 조건식을 사용해 테이블 조인할 때

반드시 각 테이블을 정확히 연결하는 조건식이

최소한 전체 테이블 수보다 하나 적은 수 만큼은 있어야한다. 

 

+ SQL-99 표준 문법으로 배우는 조인 (WHERE절이 아닌 FROM절에서 외부 조인 선언)

1. NATURAL JOIN

: 두 테이블에 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가조인을 해준다.

SELECT E.EMPNO, E.ENAME, E.JOB, 
	DEPTNO, D>DNAME
	FROM EMP E NATURAL JOIN DEPT D

이때 조인 기준 열인 DEPTNO를

테이블에 명시할 때 테이블 이름을 붙이면 안된다.

 

2. JOIN ~ USING

NATURAL JOIN이 자동으로 조인 기준 열을 지정하는 것과 다르게

USING 키워드에 명시해야 한다.

SELECT E.EMPNO, E.ENAME, E.JOB, 
	DEPTNO, D>DNAME
	FROM EMP E JOIN DEPT D USING (DEPTNO)

 

3. JOIN ~ ON

: 기존 WHERE 절에 있는 조인 조건식을 ON 키워드 옆에 작성함

FROM TABLE1 JOIN TABLE2 ON (조인 조건식)

SELECT E.EMPNO, E.ENAME, E.JOB, 
	E.DEPTNO, D.DNAME
	FROM EMP E JOIN DEPT D ON (E.DEPTNO=D.DETPNO)

 


2. 비등가 조인

: 등가 조인 방식 외의 방식을 의미한다.

 

EMP 테이블과 급여 등급 데이터를 가지고 있는 SALGRADE 테이블을 조인하고자 한다.

EMP 테이블에서는 SAL

SALGRADE에서는 LOSAL, HISAL만 존재한다. (최소 급여와 최대 급여)

 

이럴때 BETWEEN A AND B 연산자를 이용하면

EMP 테이블과 SALGRADE 테이블 조인을 쉽게 처리할 수 있다.

 

SELECT *
	FROM EMP E, SALGRADE S
  WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL

 

단, 이 방식은 등가 조인 방식에 비해

그리 자주 사용하는 방식은 아니다. 


3. 자체 조인

: 하나의 테이블을 여러개의 테이블처럼 활용하여 조인하는 방식으로FROM절에 같은 테이블을 여러 번 명시하되테이블의 별칭만 다르게 해서 사용하는 방식이다. 

 

SELECT E1.EMPNO, E1.ENAME, E1.MGR
	E2.EMPNO AS M_EMPNO,
    E2.ENAME AS M_ENAME
  FROM EMPNO E1, EMPNO E2
WHERE E1.MGR=E2.EMPNO

 


4. 외부 조인

:조인 조건 데이터 중 어느 한쪽이 NULL임에도

결과를 출력할 때 포함시켜야 하는 경우가 있다. 

이떄 강제로 출력하는 방식이 외부 조인이다.

 

아우터 조인을 사용하는 이유는 기준 테이블의 데이터가 모두 조회(누락 없이) 되고,

 대상 테이블에 데이터가 있을 경우 해당 컬럼의 값을 가져오기 위해서!

 

외부 조인은 좌우를 따로 나누어 지정하고

조인 기줄 열 중 한쪽에 (+) 기호를 붙여준다. 

 

 

 

왼쪽 외부 조인

WHERE TABLE1.COL1=TABLE2.COL1(+)

-> 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력

즉, 왼쪽 테이블의 한 개의 레코드에 여러 개의 오른쪽 테이블 레코드랑 일치할 경우

해당 왼쪽 레코드를 여러번 표시를 하게 된다. 

만약 오른쪽 레코드에 값이 NULL이면 NULL로 표시가 된다

 

 

오른쪽 외부 조인

WHERE TABLE1.COL1(+)=TABLE2.COL1(+)

-> 오른쪽 열을 기준으로 왼쪽 열 데이터의 존재와 상관없이 데이터 출력

 

 

 

단, (+) 기호를 붙이는 외부 조인 방식으로는

양쪽 모든 열이 외부 조인되는 전체 외부 조인 사용은 불가능하다. 

 

https://m.post.naver.com/viewer/postView.naver?volumeNo=32800084&memberNo=25379965 

 

[SQL 기초] 벤다이어그램으로 보는 JOIN

[BY 한빛미디어] 하나의 테이블에 원하는 데이터가 모두 있다면 참 좋겠지만, 두 개의 테이블을 엮어야 ...

m.post.naver.com

https://gent.tistory.com/289

 

[Oracle] 오라클 아우터 조인 (외부조인) 쉽게 설명 (Outer Join, Ansi Join)

오라클 쿼리문 작성이 익숙하지 않을 때 가장 헷갈렸던 부분이 아우터 조인(Outer Join)이다. 오라클 아우터 조인 시 대상 컬럼에 "(+)" 기호를 붙여서 조인을 하면된다. 아우터 조인을 사용하는 이

gent.tistory.com

 

왼쪽 외부 조인을 포함한 외부 조인은 여러 테이블의 데이터를 결합하

지정된 쿼리에 대한 모든 관련 데이터를 검색하는 데 유용합니다.

NULL 값은 무의미해 보일 수 있지만

데이터베이스 관리의 중요한 부분이며

누락되거나 알 수 없는 데이터를 나타낼 수 있습니다.

 

 

+ SQL-99 표준 문법으로 배우는 조인 (WHERE절이 아닌 FROM절에서 외부 조인 선언)

1. OUTER JOIN

: 왼쪽 외부 조인

[기존] WHERE TABLE1.COL1=TABLE2.COL1(+)

[SQL-99] FROM TABLE1 LEFT OUTER JOIN TABLE2 ON (조인 조건식)

-> 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력

 

 

오른쪽 외부 조인

[기존] WHERE TABLE1.COL1(+)=TABLE2.COL1(+)

[SQL-99] FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON (조인 조건식)

-> 오른쪽 열을 기준으로 왼쪽 열 데이터의 존재와 상관없이 데이터 출력

 

전체 외부 조인

[기존] x

[SQL-99] FROM TABLE1 FULL OUTER JOIN TABLE2 ON (조인 조건식)


 

여러 테이블 JOIN

FROM TABLE1 JOIN TABLE2 ON (조건식)

JOIN TABLE3 ON (조건식)

 

 

만약 오른쪽 외부 조인을 했는데

오른쪽 테이블의 총 데이터 수보다 조회된 데이터의 수가 큰 경우는?

오른쪽 조인에서 검색된 행 수가 오른쪽 테이블의 총 행 수보다 크면

오른쪽 테이블의 일부 행에 대해 일치하는 행이 왼쪽 테이블에 여러 개 있음을 나타낼 수 있습니다.

특정 조인 조건이 불충분합니다.

이로 인해 결과 집합에 중복 행이 생길 수 있습니다.


내부 조인 - 등가 조인, 자체 조인

출처 https://m.post.naver.com/viewer/postView.naver?volumeNo=32800084&memberNo=25379965

외부 조인

출처 https://m.post.naver.com/viewer/postView.naver?volumeNo=32800084&memberNo=25379965

 

 

참고문헌 : Do it 오라클로 배우는 데이터베이스 입문