하나의 테이블 만으로 원하는 결과를 얻을 수 있다면 정말 좋겠지만, 우리는 대체로 아주 복잡한 서비스를 구축하고 사용합니다.
… 그렇다면 당연히 테이블의 개수도 늘어나고 복잡해지겠죠.
간단한 서비스라고 하더라도 유지보수, 중복방지 등의 목적으로 테이블을 분리해서 사용하기도 합니다.(정규화)
반대로 성능을 목적으로 테이블을 병합하는 등 중복된 데이터를 하용하기도 하죠(반정규화)
우리는 정규화를 통해 나눠진 테이블 간의 조합을 통해 원하는 결과를 도출해낼 수 있습니다.
바로, 조인(JOIN)이라는 방법으로 말이죠!
여러분들이 조금의 SQL 공부를 하셨다면 기본적으로 JOIN의 종류를 알고 계실 것입니다.
JOIN은 두 개의 테이블을 서로 묶어서 원하는 결과를 도출해내는 것을 말합니다.
기본적으로 알고있는 JOIN의 종류는 아래와 같습니다.
OverView
- INNER JOIN: 두 테이블 간, 공통으로 존재하는 데이터를 기반으로 행을 결합
- EQUAL-JOIN: 일반적인 INNER JOIN → 두 테이블의 열이 같은 값을 가지는 경우
- NON-EQUAL-JOIN: 두 테이블의 열이 특정 관계를 만족하는 경우(크기 비교)
- NATURAL JOIN: 공통 열을 자동으로 찾아서 JOIN 수행
- SELF JOIN: 같은 테이블 내에서 자신을 참조하여 JOIN 수행
- SEMI JOIN: 한 테이블의 특정 조건을 만족하는 행과 매칭되는 다른 테이블의 일부만을 반환
- ANTI JOIN: 한 테이블의 특정 조건을 만족하지 않는 행을 기준으로 다른 테이블에서 관련 없는 데이터를 반환
- OUTER JOIN
- Left OUTER JOIN: 왼쪽 테이블을 기준으로 조인 조건에 부합하지 않는 오른쪽 테이블의 행은 NULL로 반환.
- Right OUTER JOIN: 오른쪽 테이블을 기준으로 조인 조건에 부합하지 않는 왼쪽 테이블의 행은 NULL로 반환.
- FULL OUTER JOIN: 양 테이블을 모두 기준으로 하여 서로 조인 조건에 부합하지 않는 행은 NULL로 반환
- CROSS JOIN: 두 테이블의 행을 모두 조합하여 결과를 반환
- 오늘의 파트 → SELF JOIN (보통 INNER JOIN이나 OUTER JOIN의 특수한 경우로 포함됨)
- JOIN 기술
- HASH JOIN: 해시 테이블을 사용하여 JOIN을 수행합니다. 대규모 데이터에 효율적
- MERGE JOIN: 두 테이블의 데이터를 정렬하여 병합하는 방식으로 JOIN을 수행
- NESTED LOOP JOIN: 한 테이블의 각 행에 대해 다른 테이블의 모든 행을 순차적으로 비교하여 JOIN을 수행
너무 많은 종류의 조인이 있죠..? 참 어렵습니다ㅠ
그렇기 때문에 하나씩 자세히! 알아가보겠습니다.
오늘 포스팅에서 알아 볼 JOIN은
- SELF JOIN
입니다!
1편에 비해서 다루는 내용이 적기 때문에 편할 것 같습니다!
예시 테이블
직원(Employees)
id | name | manager_id |
1 | Alice | NULL |
2 | Bob | 1 |
3 | Charlie | 1 |
4 | David | 2 |
SELF JOIN
셀프 조인은 데이터베이스의 한 테이블 내에서 자기 자신을 참조하는 특이한 조인 케이스입니다.
💡 어떨 때 사용하나요?
동일한 테이블 내에서 데이터를 비교, 연관 지을 때 사용합니다.
특징
1. 동일한 테이블 사용
2. 비교 및 관계 설정 </aside>
SELECT e1.name AS EMPLOYEE, e2.name AS MANAGER
FROM Employees e1
LEFT JOIN Employees e2
ON e1.manager_id = e2.id;
해설
e1의 ManagerID와 e2의 ID를 기준으로 LEFT JOIN을 수행하여 각 직원의 관리자 정보를 가져옵니다.
- Alice는 관리자가 없으므로 Manager 열은 NULL
- Bob은 Alice가 관리자이므로 Manager 열에 Alice가 표시,
- Charlie는 Alice가 관리자이므로 Manager 열에 Alice가 표시,
- David는 Bob이 관리자이므로 Manager 열에 Bob이 표시됩니다.
결과
Employee | Manager |
Alice | NULL |
Bob | Alice |
Charlie | Alice |
David | Bob |
'데이터베이스_Database > SQL' 카테고리의 다른 글
[SQL] 집합 연산자, 헷갈리지 않기! (UNION, UNION ALL, INTERSECT, EXCEPT또는 MINUS) (0) | 2024.08.06 |
---|---|
[SQL] 쉬워지는 JOIN 1편 - INNER, OUTER, CROSS (0) | 2024.08.06 |
[SQL] 순위와 관련된 함수(윈도우 함수 알아보기 - 1) (0) | 2024.08.02 |
[SQL] 함수 종속성 규칙 (0) | 2024.08.02 |
[SQL] 그룹함수(ROLLUP, CUBE, GROUPING SET) 예시를 통해 완전 습득하기! (0) | 2024.08.02 |