코딩스토리

SQL JOIN 쿼리 정리 본문

데이터베이스

SQL JOIN 쿼리 정리

kimtaehyun98 2021. 11. 28. 21:14

SQL Join을 이번 기회에 완벽하게 이해해보려고 포스팅을 남긴다.

 

Join은 아래와 같이 큰 틀로 구분할 수 있다.

 

(일반적으로 우리가 사용하는 JOIN ON 구문은 Inner Join이 Default 값이다.)

 

먼저 Join을 크게 Inner Join과 Outer Join으로 나눈다.

이 둘의 차이점은 Join에 참여하지 않는 테이블을 결과 테이블에 보여줄 것인지 아닌지이다.

(여기서 Join에 참여하지 않는다는 것은 Join Condition에 일치하는 Tuple이 양 쪽 테이블에 없다는 말이다.

즉 예를 들어 1번 테이블의 1번 Tuple의 주민번호가 1인데 Join Condition이 주민번호가 2라면 1번 Tuple은 Join에 참여하지 않게 되고 Inner Join을 사용한다면 결과 테이블에 보이지 않을 것이다.)

 

Inner Join은 오직 Join에 참여하는 테이블만 결과 테이블에 보이고

Outer Join은 Join에 참여하지 않는 테이블도 Left, Right, Full에 따라 결과 테이블로 보여준다.

 

결국 우리가 이해해야 되는 건 Join이 어떤 과정으로 일어나는가이고 Inner든 Outer든, Equi든 Left든 결국 어떤 방식으로 표현되느냐의 차이인 것이다.

 

이제 큰 틀을 알았으니 하나씩 살펴보자.

 

Equi Join

Join Condition이 "=", 즉 동일한 값을 가진 Tuple들을 조인할 때 사용된다.

이 Join 역시 Seta Join의 한 종류이다.

 

ex) SELECT *

     FROM EMPLOYEE AS E, DEPARTMENT AS D

     WHERE E.SSN = D.Mgr_ssn

 

해당 Join Condition은 E.Ssn = D.Mgr_ssn이고 같은 값이어야만 Join이 된다는 것을 알 수 있다.

이때 해당 쿼리를 JOIN ON 구문으로 바꾸어보면 아래와 같다.

 

SELECT *

FROM EMPLOYEE AS E JOIN DEPARTMENT AS D ON E.SSN = D.Mgr_ssn

 

즉 Where 절을 사용하지 않고 FROM 절에서 표현도 가능하다.

 

해당 Join은 Inner Join이기 때문에 Join에 참여한 테이블만 결과에 나타날 것이다.

 

 

 

Natural Join

Equi Join의 특수한 종류로 Attribute Name이 같다면 하나로 표현한다.

 

예를 들어 R(A, B, C, D)와 S (B, C, D, E)란 Relation이 있을 때 둘을 Natural Join 한다면 (A, B, C, D, E) 이렇게 나온다는 것이다.

즉 같은 Name을 가지고 있는 Attr은 한 번만 나온다는 것이다.

 

예시로 봐야 이해가 쉽다.

 

아래와 같은 두 테이블이 있다고 해보자.

이 두 테이블을 단순하게 Equi Join을 하게 된다면 아래와 같은 결과가 나온다.

SELECT *
FROM STUDENT S JOIN DBBasic B ON S.sno = B.sno

하지만 Natural Join을 하게 된다면 아래와 같은 결과가 나온다.

SELECT *
FROM STUDENT NATURAL JOIN DBBasic

 

설명이 더 필요 없다.라고 하지만 그래도 혹시 모르니..

각각의 테이블이 Sno란 Attr를 가지고 있기 때문에 결과적으로 한 번만 등장하게 된 것이다.

 

이 Natural Join은 특수한 경우에만 사용되기 때문에 활용도가 높지는 않아 보인다.

 

 

 

Outer Join

Outer Join은 한 번에 설명하려고 한다.

 

위에서 Outer Join은 Join에 참가하지 않는 Tuple들도 결과 테이블로 나온다고 하였다.

 

그렇다면 LEFT와 RIGHT, FULL의 차이점은 뭘까?

 

여기서 눈치가 얼마나 빠른지가 나옵니다.

 

말 그대로

LEFT는 왼쪽 테이블의 Tuple은 Join에 참여하지 않아도 결과에 나오고

RIGHT는 오른쪽 테이블의 Tuple은 Join에 참여하지 않아도 결과에 나오고

FULL은 양 쪽 테이블의 Tuple은 Join에 참여하지 않아도 결과에 나온다는 것이다.

 

예시로 살펴보자.

 

먼저 일반적인 INNER JOIN이다.

SELECT *
FROM EMPLOYEE E JOIN EMPLOYEE S ON E.super_ssn = S.ssn;

 

 

다음으로 LEFT OUTER JOIN이다.

SELECT *
FROM EMPLOYEE E LEFT OUTER JOIN EMPLOYEE S ON E.super_ssn = S.ssn;

 

하나의 Tuple이 늘었다.

이는 Super_ssn이 없어도 결괏값에 존재하게 된다.

당연히 JOIN에 참여하지 못하였기 때문에 NULL 값을 가지는 Tuple들을 확인할 수 있다.

 

다음으로 RIGHT OUTER JOIN이다.

 

SELECT *
FROM EMPLOYEE E RIGHT OUTER JOIN EMPLOYEE S ON E.super_ssn = S.ssn
ORDER BY S.FNAME

(편의상 ORDER BY 구문을 통해 정렬시켰다.)

오른쪽 테이블의 모든 값들이 결과 테이블에 존재한다.

 

다음으로 FULL OUTER JOIN이다.

SELECT *
FROM EMPLOYEE E FULL OUTER JOIN EMPLOYEE S ON E.super_ssn = S.ssn

뭐... 그렇다. 

 

더 이상 설명이 필요 없을 정도로 간단하다.

 

나는 처음에 JOIN에 대해서 어려울 것 같으니 나중에 다시 공부해야지~ 하고 넘어갔는데

음.. 막상 공부해보니 그렇게 어렵지 않은 것 같다.

아니 어렵지 않은 게 아니라 이해가 잘 된다.

(이게 커피의 효과인가 ㄷㄷ)

 

이제 앞의 기본적인 SQL문들과 JOIN에 대해서 이해했으니 모든 쿼리를 짤 수 있는 능력을 갖추게 되었다! 🎁

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

ER Model 그리기  (0) 2021.11.30
Basic SQL  (0) 2021.11.26
Relation Model Constraints (관계형 모델 제약조건)  (0) 2021.11.23
Access denied for user 'root'@'localhost' (using password: YES)  (7) 2021.11.17
QUICK DBD 사용 후기  (0) 2021.10.12
Comments