내가 한 노력들

[DB] 등가 조인, 비등가 조인, 자체 조인, 외부 조인 본문

IT 공부/DB

[DB] 등가 조인, 비등가 조인, 자체 조인, 외부 조인

JONGI-N CHOI 2021. 11. 29. 18:49

조인

두 개 이상의 테이블을 연결하여 하나의 테이블로 만들어 출력할 때 사용한다. 

 

사용방법

SELECT 열1, 열2, ...., 열N
FROM 테이블1, 테이블2, ..., 테이블N
WHERE 조건식;

그 밖에, GROUP BY, ORDER BY절 등 사용가능합니다.

 

여기서 WHERE 절을 사용했을 때와, 사용하지 않았을 때의 차이점이 있는데 

 

WHERE절을 사용하지 않았을 때

테이블1과 테이블2가 가로로 조합되어 출력되어 원하지 않는 행까지 모두 출력이 됩니다. 

예) 테이블1의 행의 수가 6개이고 테이블2는 3개일 경우 - 총 출력되는 행의 수는 6*3 = 18개가 됩니다. 


등가 조인

 

SELECT *
FROM 학생, 학과
WHERE 학생.학과번호 = 학과.학과번호;

위와 같이 WHERE를 사용해서 동일한 학과번호인 값만 출력되도록 하는 것, 이러한 조인을 등가 조인이라고 합니다.

또한, 등가조인은 내부조인/단순조인 이라고도 합니다. (즉, 등가조인 = 내부조인 = 단순조인)

 


비등가 조인

SELECT *
FROM 학생 S, 학비표 P
WHERE S.학비 BETWEEN P.최저 AND P.최고;

비등가 조인은 등가 조인처럼 열의 일치 여부를 기준으로 테이블을 조인하는 것이 아닙니다.

위의 쿼리문처럼 학비가 학비표의 최대 학비와 최소 학비 사이에 있는지 없는지를 확인하여 조인을 합니다. 


자체 조인

학생이라는 테이블안에 멘티학생의 정보와 멘토학생의 정보가 포함되어 있고

멘토학생의 정보와 멘티학생의 정보를 같이 보고 싶은 경우는 어떻게 해야하나?? 

 

방법 1

학생 테이블을 카피해서 해결한다. 

SELECT *
FROM 학생 S, 카피_학생 C
WHERE S.멘토 = C.학번;

이 방법의 문제점이 두 가지 있다. 

1.  같은 테이블을 복사하기 때문에 저장공간에 대한 문제점 

2.  하나의 테이블에서 수정이 일어나면, 다른 테이블의 내용도 수정을 해야 한다는 점 (연산시간이 늘어남)

 

 

방법 2

자체 조인을 사용한다. 

SELECT S1.학번, S1.이름, S1.멘토, S2.학번 AS 멘토_학번, S2.이름 AS 멘토_이름
FROM 학생 S1, 학생 S2
WHERE S1.멘토 = E2.학번;

같은 테이블의 별칭을 다르게 지정함으로 써, 테이블을 복사한 것 같은 효과를 낼 수 있다. 

 


외부 조인

위의 자체 조인의 예를 보면, 멘토인 학생은 멘토가 없기 때문에 출력 결과에서 제외 됩니다. 

즉, 멘토 속성의 값이 NULL이기 때문에 출력 결과에서 제외

이 때, 조인 기준 열의 어느 한쪽이 NULL이어도 강제로 출력하는 방식을 외부 조인이라고 해요.

 

 

종류

외부 조인의 종류는 왼쪽 외부 조인/ 오른쪽 외부 조인/ 전체 외부 조인 이 있습니다.

 

왼쪽 외부 조인

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

(+)기호가 오른쪽에 붙어있으면 왼쪽 외부 조인 

SELECT *
FROM 학생 S1, 학생 S2
WHERE S1.멘토 = S2.학번(+);

왼쪽 외부 조인은 왼쪽 열을 기준으로 오른쪽 열의 데이터가 NULL이어도 (존재와 상관없이) 출력이 됩니다. 

 

 

오른쪽 외부 조인

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

(+)기호가 왼쪽에 붙어있으면 왼쪽 외부 조인 

SELECT *
FROM 학생 S1, 학생 S2
WHERE S1.멘토(+) = S2.학번;

오른쪽 외부 조인은 오른쪽 열을 기준으로 왼쪽 열의 데이터가 NULL이어도 (존재와 상관없이) 출력이 됩니다.