본문 바로가기

DataBase

SQL - natural join, cross join, self join

natural join은 Equi join과 유사하다.

natural join에서는 조인 조건을 기술하지 않아도 자동으로 두 테이블의 이름과 자료형이 같은 공통 컬럼을 찾아서 조인(equi join)한다. 또 select 절에 테이블 명을 기술하지 않고 검색하는 것이 가능하다. 아래의 사진을 살펴보자.

 

<Equi join>
<natural join>

natural join에서는 equi join과 같이 테이블을 조인시킬 조건을 명시해주지 않아도 알아서 공통 컬럼을 찾아서 조인해주어, 두 쿼리문의 결과가 일치하는 것을 볼 수 있다.

 

하지만 natural join에는 하나의 제약이 따른다. natural join은 테이블을 조인 시킬 때, 이름이 같은 모든 컬럼을 조인 조건으로 사용한다. 만약 두개의 테이블에서 두개의 컬럼이 공통된다면, 두개의 컬럼 모두를 이용해서 테이블을 조인시킨다. 이때 테이블 내에서 해당 컬럼들의 이름과 자료형이 똑같을 뿐, 사용되는 목적이 전혀 다르더라도, 이러한 점을 무시한다. 따라서 조회된 결과가 내가 생각한 결과와 다를 수 있다.

이러한 문제를 해결하기 위해 만약 공통되는 컬럼이 두개 이상일 경우, join~using 키워드를 사용한다.

아래 사진을 보자.

 

<join~using 키워드>

SID 컬럼을 조인 기준으로 사용하겠다고 using 키워드에 명시해준 것을 확인할 수 있으며, 실제로도 Sid를 이용하여 Equi join을 한 쿼리문의 결과와 동일한 것을 확인할 수 있다.

 

다음으로 Cross Join을 살펴보자.

Cross join은 Cartesian product(곱 집합)라고도 알려져 있으며, equi 조인과 같이 where절에 따로 조인 조건을 명시해 주지 않아, 조인에 이용된 테이블의 모든 데이터가 조회된다.

당연히 cross join를 통해 조회된 데이터의 개수는 조회에 이용된 테이블의 행 개수의 곱과 동일하다.

아래 사진을 보자.

 

<cross join을 시킬 두개의 테이블>

 

<cross join>
<cross join을 통해 조회된 데이터의 개수>

위 결과를 살펴보면 두 테이블의 cross join 결과는 student 테이블의 행 개수 12, apply 테이블의 행 개수 19의 곱인 228개가 조회된 것을 확인할 수 있다.

 

마지막으로 Self join이다.

self join은 말 그대로 자기 자신과 조인을 시킨다는 의미이다.

보통 self join은 조회하고자 하는 테이블의 정보가 하나의 테이블안에 모두 포함되어 있을 경우 사용된다.

이때 주의할 점은 self join에서는 반드시 별칭을 사용해야 한다. 아래 사진을 보자.

 

<self join에서 alias를 사용하지 않은 경우>
<self join에서 alias를 사용한 경우>

위 결과를 확인해보면 self join에서 테이블에 alias를 주지 않으면 쿼리문을 실행시켰을 때, 오류가 발생하는 것을 확인할 수 있다.