핵심 인사이트
- 순수 관계 연산자(Pure Relational Operators)는 관계 대수(Relational Algebra)에서 관계형 모델 고유의 셀렉트(σ)·프로젝트(π)·조인(⋈)·디비전(÷) 4가지 연산자로, SQL SELECT의 WHERE/FROM/JOIN 등 모든 절이 이 연산자들을 조합한 것이다.
- 조인(⋈)은 두 릴레이션의 카테시안 곱(Cartesian Product) + 셀렉트의 합성으로 실질적으로 가장 비용이 큰 연산이며, DBMS 옵티마이저의 핵심 과제는 어떤 조인 순서(Join Order)와 알고리즘(NL/Hash/Merge)을 선택하느냐다.
- 디비전(÷)은 "모든 B에 대해 A가 포함하는 튜플"을 찾는 연산으로 SQL에 직접 문법이 없어 이중 NOT EXISTS 서브쿼리로 구현하며, 관계 대수 완전성(Relational Completeness)을 보장하는 마지막 핵심 연산이다.
Ⅰ. 셀렉트 (σ, Select)
σ (Sigma, 셀렉트):
목적: 조건을 만족하는 행(Row) 추출
문법: σ_조건(릴레이션)
예시:
σ_나이>25(학생)
-> 학생 테이블에서 나이가 25 초과인 행만 반환
SQL 대응: WHERE 절
SELECT * FROM 학생 WHERE 나이 > 25;
특성:
- 입력과 출력의 스키마(열) 동일
- 행 수 감소 (조건 만족 행만)
- 단항 연산 (하나의 릴레이션에 적용)
- 조건: 비교 연산(=, <, >, ≤, ≥, ≠) + 논리(AND, OR, NOT)
📢 섹션 요약 비유: σ(셀렉트)는 데이터 테이블의 행 필터기 — 체를 통과하는 입자처럼 조건에 맞는 행만 아래로 내려옴.
Ⅱ. 프로젝트 (π, Project)
π (Pi, 프로젝트):
목적: 특정 열(Column) 추출 (수직적 분할)
문법: π_속성목록(릴레이션)
예시:
π_이름, 학과(학생)
-> 학생 테이블에서 이름, 학과 열만 반환
SQL 대응: SELECT 절의 컬럼 목록
SELECT 이름, 학과 FROM 학생;
특성:
- 열 수 감소 (명시된 열만)
- 행 수 변동: 중복 제거 가능 (집합 기반)
- 단항 연산
셀렉트와 조합:
π_이름(σ_나이>25(학생))
-> 나이 25 초과 학생의 이름만 추출
SQL: SELECT 이름 FROM 학생 WHERE 나이 > 25;
📢 섹션 요약 비유: π(프로젝트)는 스프레드시트에서 특정 열만 복사하기 — 관심 있는 정보 열만 남기고 나머지는 숨기기.
Ⅲ. 조인 (⋈, Join)
조인 (Join, ⋈):
목적: 두 릴레이션을 공통 속성으로 결합
기본: 카테시안 곱(×) + 셀렉트(σ)
종류:
1. 자연 조인 (Natural Join, ⋈):
공통 속성 이름으로 자동 결합 + 중복 열 제거
2. 세타 조인 (Theta Join, ⋈_θ):
임의 조건으로 결합 (=, <, > 등)
3. 동등 조인 (Equi Join):
세타 조인 중 = 조건만 사용
4. 외부 조인 (Outer Join):
매칭 안 되는 행도 NULL로 포함
LEFT, RIGHT, FULL OUTER JOIN
예시:
학생 ⋈ 수강 (학번 공통 속성)
-> 학번이 일치하는 학생-수강 쌍 모두 반환
비용:
조인은 가장 비용이 큰 연산
DBMS 옵티마이저의 핵심 최적화 대상
알고리즘: NL Join, Hash Join, Merge Join
📢 섹션 요약 비유: 조인은 학생 명부와 수업 등록부를 학번으로 연결하는 작업 — 두 장부에 모두 있는 학번만 연결해 새 표 만들기.
Ⅳ. 디비전 (÷, Division)
디비전 (Division, ÷):
목적: "모든 B에 대응하는 A" 찾기
문법: R ÷ S
예시:
수강(학번, 과목) ÷ 과목(과목)
-> 모든 과목을 수강한 학생의 학번
직관적 의미:
"S의 모든 튜플과 쌍을 이루는 R의 투플"
SQL 구현 (이중 NOT EXISTS):
SELECT DISTINCT 학번 FROM 수강 s1
WHERE NOT EXISTS (
SELECT 과목 FROM 과목 p
WHERE NOT EXISTS (
SELECT * FROM 수강 s2
WHERE s2.학번 = s1.학번
AND s2.과목 = p.과목
)
);
활용 예:
- "모든 부서에서 일한 직원"
- "모든 상품을 주문한 고객"
- "모든 과목 합격한 수험생"
📢 섹션 요약 비유: 디비전은 "모든 선생님의 수업을 들은 학생 찾기" — 단 한 선생님이라도 빠지면 제외.
Ⅴ. 실무 시나리오 — 쿼리 최적화
쿼리 최적화 관점의 관계 연산 순서:
원래 쿼리:
σ_학과='컴퓨터'(학생 ⋈ 수강 ⋈ 과목)
비효율적 실행:
1. 학생 × 수강 × 과목 (카테시안 곱, 매우 큼)
2. 조인 조건 적용
3. 학과 = '컴퓨터' 필터
최적화 규칙 적용:
1. σ_학과='컴퓨터'(학생) 먼저 실행 <- 행 수 줄임
2. 줄어든 학생 ⋈ 수강 <- 작은 테이블 먼저
3. 결과 ⋈ 과목
옵티마이저 전략:
Predicate Pushdown: σ를 조인보다 먼저
Join Reordering: 작은 테이블 먼저 조인
Index 활용: σ 조건에 인덱스 적용
결과: 수백 배 성능 차이 가능
📢 섹션 요약 비유: 쿼리 최적화는 요리 순서 최적화 — 재료를 먼저 손질(필터)하고 조리(조인)하면 전체 시간이 훨씬 단축.
📌 관련 개념 맵
순수 관계 연산자
+-- σ 셀렉트 (행 필터)
+-- π 프로젝트 (열 선택)
+-- ⋈ 조인 (릴레이션 결합)
| +-- 자연 조인
| +-- 세타/동등 조인
| +-- 외부 조인
+-- ÷ 디비전 (모든 조건 만족)
+-- 관련 개념
+-- 관계 대수 (Relational Algebra)
+-- 집합 연산자 (∪, ∩, -, ×)
+-- SQL 매핑 (WHERE, SELECT, JOIN, NOT EXISTS)
+-- 쿼리 옵티마이저 (실행 계획)
📈 관련 키워드 및 발전 흐름도
[Codd 관계 모델 논문 (1970)]
"A Relational Model of Data for Large Shared Data Banks"
관계 대수 8개 연산 정의
|
v
[System R, Ingres (1970s)]
관계 대수 기반 쿼리 처리기 구현
|
v
[SQL 표준화 (ANSI 1986)]
관계 대수 -> SQL 문법 변환
|
v
[쿼리 옵티마이저 발전 (1980~2000s)]
비용 기반 최적화 (CBO)
Join 알고리즘 다양화
|
v
[현재: 분산 SQL 엔진]
Spark SQL, Presto: 관계 대수 분산 실행
AI 기반 쿼리 최적화 연구
👶 어린이를 위한 3줄 비유 설명
- σ(셀렉트)는 "키가 170cm 이상인 학생만 골라줘", π(프로젝트)는 "이름과 학년 열만 보여줘"처럼 테이블을 필터링하는 방법이에요.
- ⋈(조인)은 두 가지 목록을 공통된 번호(학번 등)로 이어 붙여서 하나의 큰 표를 만드는 것 — 학생 명단과 성적표를 합치기처럼요.
- ÷(디비전)은 "모든 조건을 다 만족한 것만 찾기" — 예를 들어 모든 과목 시험에 다 응시한 학생만 찾을 때 사용해요!