본문 바로가기
DB

[DB/SQL] Cartesian Product, Theata, Equi, Natual, Outer, Semi JOIN의 모든 것

by persi0815 2024. 11. 11.

데이터베이스에서 JOIN은 관계형 데이터를 결합하고 유용한 정보를 얻는 데 필수적인 역할을 하는 기능이다. 이번 포스팅에서는 다양한 JOIN 유형과 개념을 상세히 살펴보도록 하겠다.

 

Cartesian Product

: 두 집합의 모든 원소를 대응시키는 Tuple 쌍들의 집합이다.

예를 들어, 집합 S1과 S2를 Cartesian Product 한다면, 결과는 각 집합 원소의 개수의 곱만큼 Tuple이 생성된다.

Join에서 Cartesian Product

: JOIN 조건은 FROM 절에 있는 테이블을 모두 Cartesian Product한 후, WHERE 절에 지정된 조건을 만족하는 Tuple만 필터링하는 방식으로 작동한다.

 

다양한 JOIN 유형

1. Theta Join

: 일반적인 = 연산이 아닌, !=, >, <, >=, <=와 같은 연산자를 사용하여 수행하는 JOIN이다.

SELECT *
FROM employees e
JOIN departments d ON e.salary > d.budget;

 

2. Equi Join

: Theta Join의 부분집합으로, = 연산자를 사용하는 JOIN이다

SELECT *
FROM employees e
JOIN departments d ON e.department_id = d.id;

 

3. Natural Join (*)

: 두 테이블에서 이름이 같은 Attribute Pair에 대해 암시적으로 Equi Join 조건이 생성된다.

이러한 각 Attribute Pair는 결과 Relation에 "한 번만" 포함된다.

SELECT *
FROM employees
NATURAL JOIN departments;

 

4. Inner Join

: 다른 Relation에 일치하는 Tuple이 있는 경우에만 결과에 포함되는 JOIN이다.

JOIN의 기본 유형이며, 일반적으로 명시하지 않아도 Inner Join으로 동작한다.

SELECT *
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

 

5. Outer Join

: Outer Join은 현재 조건 외에 누락된 정보를 포함하는 데 사용된다.

JOIN의 기본 유형이 아니기에, 사용하려면 명시적으로 작성해줘야 한다.

(1) Full Outer Join

: 두 테이블의 모든 Tuple을 포함하며, 매칭되지 않는 경우 NULL을 반환한다.

SELECT *
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;

(2) Left Outer Join

: 왼쪽 테이블의 모든 Tuple을 포함하며, 매칭되지 않는 오른쪽 테이블의 값은 NULL로 채운다.

SELECT *
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.id;

(3) Right Outer Join

: 오른쪽 테이블의 모든 Tuple을 포함하며, 매칭되지 않는 왼쪽 테이블의 값은 NULL로 채운다.

SELECT *
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.id;

 

6. Outer Union

: Outer Union은 두 테이블의 모든 Tuple을 결합하고 중복을 제거하지 않는 UNION 연산이다.(외부 합집합)

일반적인 UNION과 달리, Outer Union은 두 테이블에서 공통으로 존재하지 않는 열에 대해 NULL 값을 추가하여 데이터를 결합한다.즉, 두 Relation에서 union compatible하지 않은 속성은 결과에 유지된다. (-> 모든 속성 유지)

SELECT column1, column2
FROM table1
UNION ALL
SELECT column1, column2
FROM table2;

* 위 쿼리는 Outer Union과 비슷한 결과를 제공하지만, 특정 DBMS에서는 Outer Union이라는 키워드를 별도로 지원하기도 한다.

7. Semi Join

: 한 테이블의 데이터 중 다른 테이블과 조건을 만족하는 데이터만 반환하는 JOIN이다. Semi Join은 일반적으로 EXISTS 서브쿼리로 구현된다.

SELECT e.name
FROM employees e
WHERE EXISTS (
    SELECT 1
    FROM departments d
    WHERE e.department_id = d.id
);

 

R Semi Join S는 R 테이블에서 S와의 Inner Join이 되지 않는 부분을 제거하고, Join에 필요한 Tuple만 남기는 방식이다. 이 과정은 다음과 같이 수행된다.

  1. 먼저 Inner Join을 수행하여 R과 S의 공통되는 속성만 선택한다 (Filtering).
  2. 데이터의 크기를 확연히 줄인 후, R과 Natural Join을 수행하여 연산의 수를 줄인다.

Join vs Semi Join은 큰 조각이 적게 움직이느냐, 아니면 작은 조각이 여러 번 움직이느냐의 차인데, 데이터베이스 엔진이 최적화된 방법을 선택하여 처리하게 된다.

  • Semi Join은 조인 조건에 따라 필요한 데이터만 남기기 때문에 불필요한 연산을 최소화할 수 있다.
  • 데이터 양이 많거나 조건이 복잡할수록 효율성이 증가한다.