데이터베이스에서 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만 남기는 방식이다. 이 과정은 다음과 같이 수행된다.
- 먼저 Inner Join을 수행하여 R과 S의 공통되는 속성만 선택한다 (Filtering).
- 데이터의 크기를 확연히 줄인 후, R과 Natural Join을 수행하여 연산의 수를 줄인다.
Join vs Semi Join은 큰 조각이 적게 움직이느냐, 아니면 작은 조각이 여러 번 움직이느냐의 차인데, 데이터베이스 엔진이 최적화된 방법을 선택하여 처리하게 된다.
- Semi Join은 조인 조건에 따라 필요한 데이터만 남기기 때문에 불필요한 연산을 최소화할 수 있다.
- 데이터 양이 많거나 조건이 복잡할수록 효율성이 증가한다.
'DB' 카테고리의 다른 글
[DB] Index Structures for files (Primary, Clustering, Secondary) (0) | 2024.12.14 |
---|---|
[DB] Collision Management in Database Hashing Techniques (0) | 2024.12.14 |
[DB] Searching and Managing Records in Heap and Sorted Files (0) | 2024.12.14 |
[DB/SQL] 데이터 무결성을 유지하기 위해 Assert보다 Check 절을 사용해야 하는 이유 (0) | 2024.11.11 |
[DB/SQL] 중첩 질의 보다 JOIN Query가 더 효율적인 이유 (0) | 2024.10.27 |