논리적 joins #

논리적 join은 크게 아래의 네 가지로 나뉘어집니다. 오늘은 이 중에서 Cross Join에 대해 알아보겠습니다.

  1. Inner Join
  2. Outer ️Join
  3. Cross Join
  4. Self Join ⭐

Self Join이란 #

Self Join은 단일 테이블을 자기 자신과 조인하는 것을 의미합니다.

  • 조인은 Binary Operation입니다. 즉 피연산자가 둘이 필요합니다.
  • Inner, Outer, Cross는 모두 각각 서로 다른 테이블을 두 개 사용해 하나의 조인된 결과를 만들었습니다.
  • Self Join은 테이블 하나로 조인합니다.

테이블 하나로 조인하는 방법 #

하나의 테이블로 자기 자신과 조인하는 방법은

하나의 테이블에 별칭을 붙여 두 번 참조하는 것으로 Binary Operation인 join을 수행합니다.

예시 #

아래와 같은 직원 테이블이 있습니다.

직원 테이블 #

직원ID 이름 상사ID
1 노튼 소장 NULL
2 캡틴 해들리 1
3 레드 레딩 1
4 앤디 2

상사ID와 직원ID는 서로 관련된 행입니다. 직원은 상사ID를 속성으로 가지며 상사는 직원ID를 속성으로 갖습니다. 튜플의 상사ID가 NULL인 경우 상사가 없는 것을 의미합니다.

SQL 쿼리 (Self Join) #

SELECT A.이름 AS 직원, B.이름 AS 상사
FROM 직원 A # Alias 직원 테이블 = A
JOIN 직원 B ON A.상사ID = B.직원ID; # Alias 직원 테이블 = B

위 쿼리를 통해 하나의 테이블로 조인을 할 수 있습니다.

결과 #

직원 상사
캡틴 해들리 노튼 소장
레드 레딩 노튼 소장
앤디 캡틴 해들리

직원 테이블을 A, B로 한 쿼리에서 두 번 참조함으로써 join의 테이블 두 개 참조 조건을 달성했습니다.

사용례 #

같은 테이블을 두 번 참조하는 self join은 아래와 같은 용도로 사용됩니다.

  • 위의 예와 같이 테이블 내에서의 연관 관계를 확인하는 용도, 혹은 데이터 분석등을 위해 사용합니다.

  • 동일한 테이블 내의 행들을 서로 비교할 때 사용합니다. 같은 테이블 내 다른 행들의 데이터 값을 비교해 차이점을 찾을 수 있습니다.

Alias 별칭 #

아래 쿼리에서 별칭을 부여하는 방식에 대해 알아보겠습니다.

SELECT A.이름 AS 직원, B.이름 AS 상사
FROM 직원 A
JOIN 직원 B ON A.상사ID = B.직원ID;

직원이라는 하나의 테이블에서 A, B로 별칭을 붙여주었는데요

별칭이 붙은 포인트를 짚어보겠습니다.

...
FROM <테이블명> A
JOIN <테이블명> B ...

별칭을 붙일 테이블의 이름을 FROM과 JOIN 뒤에 붙이고 별칭을 붙여줍니다.

이 외에도 AS 등의 키워드로 참조를 하는 등의 방법이 있습니다.

정리 #

  • self join은 하나의 테이블을 별칭을 통해 두 개의 테이블인 것 처럼 join하는 것입니다.
  • 다른 테이블과 조인하지 않아 쿼리는 간소화됩니다.
  • 여러 테이블에 데이터를 중복 저장하지 않습니다. (왜나면 이미 하나거든요!)
  • 동일한 테이블 내에서 행들을 서로 비교하는 경우 유용합니다.