핵심 인사이트

  1. 순수 관계 연산자(Pure Relational Operators)는 관계 대수(Relational Algebra)에서 관계형 모델 고유의 셀렉트(σ)·프로젝트(π)·조인(⋈)·디비전(÷) 4가지 연산자로, SQL SELECT의 WHERE/FROM/JOIN 등 모든 절이 이 연산자들을 조합한 것이다.
  2. 조인(⋈)은 두 릴레이션의 카테시안 곱(Cartesian Product) + 셀렉트의 합성으로 실질적으로 가장 비용이 큰 연산이며, DBMS 옵티마이저의 핵심 과제는 어떤 조인 순서(Join Order)와 알고리즘(NL/Hash/Merge)을 선택하느냐다.
  3. 디비전(÷)은 "모든 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줄 비유 설명

  1. σ(셀렉트)는 "키가 170cm 이상인 학생만 골라줘", π(프로젝트)는 "이름과 학년 열만 보여줘"처럼 테이블을 필터링하는 방법이에요.
  2. ⋈(조인)은 두 가지 목록을 공통된 번호(학번 등)로 이어 붙여서 하나의 큰 표를 만드는 것 — 학생 명단과 성적표를 합치기처럼요.
  3. ÷(디비전)은 "모든 조건을 다 만족한 것만 찾기" — 예를 들어 모든 과목 시험에 다 응시한 학생만 찾을 때 사용해요!