sql natural join 은 무엇일까요? 두 테이블에서 정보를 뽑아낼 때 join 을 한다고 했어요. 이 때 자연 조인은 아래와 같이 처리합니다.
- 두 테이블에 공통으로 나타나는 속성들의 값들이
- 모두 같은 것에 대해 join
이게 무슨 이야기인가? 예제를 보면서 이해해 보겠습니다.
2개의 테이블 자연 조인
먼저, a, c 테이블이 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_1.png)
먼저, a에는 3개의 레코드가 있습니다. 속성 값으로 id, a, b를 가지고 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_2.png)
다음, c에도 3개의 레코드가 있습니다. 속성 값으로 id, a, c를 가집니다. 테이블 a와 c를 natural join 했을 때 어떤 결과가 나올까요? 위에서 자연 조인은 아래와 같이 동작한다고 했어요.
- 두 테이블에 나타난 공통된 속성들이
- 같은 값을 가지는 것에 대해 조인
단계별로 봅시다. 먼저, 두 테이블 a, c에 나타난 공통된 속성들을 먼저 봅시다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_3.png)
a에는 id, a, b가 나타났고, c에는 id, a, c가 나타났습니다. 테이블 a와 c에 나타난 공통된 속성은 id, a입니다. 속성 b는 테이블 a에서만, 속성 c는 테이블 c에서만 나타났습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_4.png)
이제 2번째 단계. 두 테이블에서 공통된 속성 id와 a가 같은 값들을 가지는 것끼리 join 합니다.
- 테이블 a의 1번째 레코드는 id 값이 1이고, a 값이 1입니다.
- 테이블 c에서 id가 1이고 a 값이 1인 레코드는 1번째 뿐입니다.
- 따라서, a 테이블의 1번째와, c 테이블의 1번째 것이 join 됩니다.
- 테이블 a의 2번째 레코드는 id 값이 2이고, a 값이 2입니다.
- 테이블 c에서 이 조건을 만족하는 것이 없으니 continue
- 테이블 a의 3번째 레코드는 id 값이 3이고, a 값이 1입니다.
- 테이블 c에서 조건을 만족하는 레코드를 찾으니까 3번째 것이지요?
- 따라서, a 테이블의 3번째와, c 테이블의 3번째 것이 join 됩니다.
최종적인 결과는 아래와 같습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_5.png)
이제, 실제 결과를 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_6.png)
2개의 레코드가 결과로 나옵니다.
3개의 테이블 자연 조인하기
이제 sql natural join 3개를 해 봅시다. a natural join c natural join d. 이렇게 해 볼까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_7.png)
먼저, 테이블 d에 있는 속성과 데이터를 봅시다. d에는 id, b, c가 있습니다. 우리는 a와 c를 자연 조인하고, 그 다음에 또 d를 자연조인 하라고 했어요. 그러므로, 상황은 아래와 같이 그려집니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_8.png)
위 그림과 같은 테이블을 2개 자연 조인합니다. 이것도 똑같이 해석해 봅시다.
- 먼저 왼쪽 테이블 (결과 view)속성은 id, a, b, c가 있고
- 오른쪽 테이블 속성은 id, b, c가 있습니다.
따라서, 공통된 속성은 id, b, c입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_9.png)
이제, 두 테이블에서 id와 b와 c가 같은 것들만 join 합시다. 그러면, b의 2번째 레코드와 c의 3번쨰 레코드만 join이 됨을 알 수 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/09/natu_10-2.png)
따라서, 결과는 1개의 레코드만 나오게 됩니다.