╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Data Base/Data Base 기초

[DB] Join 문 (Natural Join, Outer Join, Self Join)

재안안 2022. 7. 13. 16:47

지난번에는 Inner Join에 대해 알아보았다.

 

복습을 해보자면,

 

두 테이블을 Join 시키면 Join의 결과로 각 테이블의 튜플에 대한 Cartesian Product가 생성된다. (새로운 테이블)

이후 Inner Join이면 해당 테이블에서 join condition에서 참이 나오는 튜플만 반환된다고 했다.

 

만약 해당 Join이 Equi Join이라면 join condition에서 =을 사용한 것이고 이때 USING을 사용할 수 있다고 했다.

 

USING을 사용하면 각각의 테이블에서 추출한 튜플중

같은 컬럼명을 갖고있는 튜플들에 대해서, 튜플들의 컬럼 데이터 값이 같을 때,

join condition은 true가 되어 두 튜플은 하나의 새로운 튜플로 만들어지는데 이때

join conditon에서 사용됬던 중복된 컬럼들은 하나의 컬럼으로 합쳐진다고 했다.

 

아래의 쿼리를 이해하는데 문제가 없다면 다 이해한 것이다.

 

복습 예제

 

복습 예제

 

복습 예제 실행결과

 

실행결과는 정직하게 나왔다.

 

um 테이블과 ud 테이블을 JOIN과 USING을 통해 정직하게 새로운 테이블을 만들고

새로 만들어진 테이블과 au 테이블을 JOIN과 USING을 통해 다시한번 새로운 테이블을 만들었다.

 

어떤 어떤 일을 실행하라고 정직하게 다 설명한 것이다. 

 

그러나 이때 Inner Join 대신 Natural Join을 사용하면 쿼리를 훨씬 더 짧게 만들 수 있다.

 

바로 사용해 보겠다.

 

Natural Join

 

Natural Join 예제 1

 

Natural Join 1 실행결과

 

이처럼 동일한 컬럼명을 갖는 컬럼이 각 테이블에 있다는 사실을 알고 있을 때

Equi Join을 수행하고 싶을 때 Natural Join을 사용하면 좋겠다.

 

하지만 이때 주의해야할 사항이 있다.

 

Natural Join을 사용할 때,

Equi Join을 수행하려는 두 개의 테이블에서 중복된 컬럼이 하나만 있어야 한다는 것이다. 

 

만약 중복된 컬럼이 여러개라면

OR 연산처럼 각각의 match가 따로 적용되어 true를 반환하기 때문에

예기치 못한 결과를 반환할 수도 있다. (너무 많은 튜플)

 

이럴 땐 USING을 사용하는 것이 좋겠다.

 

 

Outer Join

 

드디어 Outer Join을 알아볼 차례이다.

 

Inner Join과 Outer Join은 되게 반대되는 개념이라고 생각할 수 있다.

그런데 생각보다 그렇게 다르지 않다는 것을 알 수 있을 것이다.

 

Equi Join을 수행 할 때,

 

Inner Join은 두 테이블의 튜플로 만들 수 있는 모든 pair들 중

join condition을 수행 할 수 있는 중복된 column이 있는 pair에서

각 column 값이 null이 아니며 column의 값이 같을 때 true가 되었다.

 

Outer Join은 두 테이블의 튜플로 만들 수 있는 모든 pair들 중

join condition을 수행 할 수 있는 중복된 column이 있는 pair에서

어떠한 column의 값이 null이더라도 column이 튜플 내부에 존재하면  true가 되는 것이다.

 

이때 어떤 테이블을 기준으로 할 지 선택해 주어야한다.

 

만약 왼쪽 테이블을 기준으로 하고 싶을 땐 LEFT OUTER JOIN

오른쪽 테이블을 기준으로 하고싶을 땐 RIGHT OUTER JOIN 을 사용한다.

 

Left Outer Join

 

Left Outer Join 예제 1

 

Left Outer Join 1 실행결과

 

Left Outer Join을 통해 um과 ud를 Natural Join한 새로운 테이블을 기준으로

Outer Join을 실행하였다.

 

실행결과에서 create_date에 null이 나와서 확인해보니

놀랍게도 plz 사용자는 authotiry 테이블에 업데이트 된적이 없었다.

authorities 테이블에는 4개의 행만이 있었다.

 

plz라는 username이 authorities 테이블에 존재하지 않아도 Left Outer Join은 다른 튜플을 null값으로 채워서 반환한 것을 알 수 있다.

Cross Join의 모든 pair에는 null 튜플도 포함되는 것을 알 수 있다.

 

반대로 같은 쿼리에서 Right Outer Join도 사용해 보았다.

 

 

Right Outer Join

 

Right Outer Join 예제 1

 

Right Outer Join 1 실행결과

 

Outer Join을 실행할 때 기준을 오른쪽 테이블인 au로 잡으니 결과가 다르게 나왔다.

총 4개의 튜플만 반환되었는데

이는 au 테이블에는 4개의 행만 존재하기에

au 테이블을 기준으론 plz는 존재하지 않는 사용자 인것이다.

 

그 외의 다른 튜플들은 join condition을 만족하는 튜플들 끼리 잘 join 되었다. 

 

INNER JOIN과 OUTER JOIN의 차이점,

LEFT OUTER JOIN과 RIGHT OUTER JOIN의 차이점에 대해서도 알아보았다.

 

이제 마지막으로 SELF JOIN에 대해 알아보겠다.

 

 

SLEF JOIN

 

사실 Self Join도 그냥 Join과 별차이는 없다.

SELF JOIN이라는 키워드도 없다

 

그냥 같은 테이블을 두번 선택하는 것인데

두 테이블에서 join condition을 만족하는 튜플만 반환한다는 개념을 똑같다.

 

Self Join 예제 1

 

Self Join 예제 1

 

비밀번호가 같은 사용자들끼리 pair를 만들었는데 사실 모든 사용자의 비밀번호는 1234이다.

그러니 Cross Join과도 같은 결과가 나왔다. 왜냐하면 모든 pair에 대해 join cindition에 대한 false가 없기 때문이다.

 

Self Join 예제 1 실행결과

 

USING을 사용할 때도 똑같다.

 

Self Join 예제 2

 

Self Join 예제 2
Self Join 예제 2 실행결과

 

테이블만 같은 테이블을 선택한거지 지금까지 알아봤던 . . . JOIN . . . USING과 다르지 않다.

 

이렇게 Self Join은 특별한 Join이 아니라하고 하고 끝낼 수 있지만

하나만 더 해보겠다.

 

Natural Join 예제 2

 

Natural Join 예제 2

 

um1과 um2는 완전히 같은 테이블이다.

그러므로 모든 column이 중복되는데 이때 Natural Join을 사용하면 아래와 같은 결과가 나온다.\

(중복되는 column이 여러개 일 때)

 

Natural Join 예제 2 실행결과

 

실행결과에는 0개의 튜플이 반환되었다고 나온다.

 

그래서 Natural Join을 사용할 때는 중복된 컬럼이 하나인지 확인을 꼭하고 사용해야겠다.