Database

DATABASE #3. Relation Algebra

Frisbeen 2025. 4. 27. 22:46

관계대수(Relational Algebra) 개념 정리와 실전 예시

관계대수는 관계형 데이터베이스를 수학적으로 표현하는 언어로, 절차적인 언어입니다. 즉, 데이터를 어떤 방식으로 추출할지를 단계별로 명시합니다. SQL과는 달리 연산의 순서가 중요하고, 연산 결과도 항상 릴레이션(테이블)입니다.


1. 관계대수의 6가지 기본 연산

  1. Select (σ): 수평 부분집합, 조건에 맞는 튜플만 선택
  2. Project (π): 수직 부분집합, 특정 속성만 선택 (중복 제거)
  3. Union (∪): 두 릴레이션의 합집합
  4. Set Difference (-): 차집합 (A에서 B를 뺀 것)
  5. Cartesian Product (×): 두 릴레이션의 곱집합
  6. Rename (ρ): 릴레이션이나 속성 이름 변경

※ 모든 연산 결과는 새로운 릴레이션입니다.


2. 연산별 상세 설명

▸ Select (σ)

  • 형식: σ조건(Relation)
  • 설명: 조건을 만족하는 튜플만 선택 (가로방향 필터링)
  • 스키마 변화 없음
  • 조건식 사용 가능: AND, OR, NOT 등 포함 가능

▸ Project (π)

  • 형식: π속성(Relation)
  • 설명: 특정 열만 선택 (세로방향 필터링)
  • 스키마 변화 있음
  • 중복 제거 자동 수행

▸ Union (∪)

  • 조건: 두 릴레이션의 스키마(속성 개수 및 타입)가 동일해야 함
  • 중복 자동 제거

▸ Set Difference (-)

  • 형식: R - S
  • 설명: R에 있고 S에는 없는 튜플만 선택
  • 조건: 스키마 동일해야 함
  • A ⊇ B일 필요 없음

▸ Cartesian Product (×)

  • 형식: R × S
  • 설명: 두 릴레이션의 모든 튜플 조합
  • 튜플 수: |R| × |S|
  • 스키마가 겹치면 Rename 필요 (예: R.A, S.A 식으로 표기)

▸ Rename (ρ)

  • 형식: ρNewName(E)
  • 설명: 연산 결과에 새 이름을 부여하거나 속성명을 변경

3. 관계대수는 왜 괄호를 사용하는가?

관계대수는 절차적 언어이기 때문에, 연산의 순서가 중요합니다. 따라서 괄호를 통해 연산 우선순위를 명확하게 표현합니다.


실전 예시: Banking 데이터셋

🔎 문제 1: 페리릿지(Perryridge) 지점에서 대출을 받은 고객의 이름 찾기

π customer-name (
  σ branch-name = "Perryridge" (loan)
  ⨝ loan.loan-number = borrower.loan-number
  borrower
)

🔎 문제 2: 페리릿지에 대출은 있으나, 어떤 계좌도 갖고 있지 않은 고객

perry_Loan ← π customer-name (
  σ branch-name = "Perryridge" (loan)
  ⨝ loan.loan-number = borrower.loan-number
  borrower
)

Has_acc ← π customer-name (
  perry_Loan
  ⨝ depositor.customer-name = borrower.customer-name
  borrower
)

no_acc ← π customer-name (perry_Loan) − Has_acc
  • 차집합은 두 릴레이션의 스키마가 동일해야 하며, A - B에서 A ⊇ B일 필요는 없습니다.

4. 최대값 구하기 (Find the Largest Account Balance)

관계대수에는 집계 함수가 없으므로, self-join과 차집합을 사용해 최대값을 구합니다.

Dup_acc ← account

less_Balance ← π balance (
  account ⨝ account.balance < Dup_acc.balance Dup_acc
)

max_Balance ← π balance (account) − less_Balance

실전 예시: 학교 시스템

🔎 교수 이름과 그 교수가 가르치는 과목을 찾기

π name, course_id (
  instructor ⨝ ID = teaches.ID
)

🔎 CS 학과에서 개설한 과목들의 course_id와 title 출력

π course_id, title (
  σ dept_name = "CS" (course)
)

마무리

관계대수는 관계형 데이터베이스의 질의 처리를 수학적으로 기술할 수 있는 강력한 도구입니다. SQL과 달리 절차적인 방식으로 연산이 수행되며, 복잡한 질의도 순차적 연산으로 나누어 표현할 수 있다는 점이 큰 장점입니다. 실무에서 SQL을 쓰더라도, 관계대수에 대한 이해는 쿼리 최적화와 논리적 질의 계획 수립에 큰 도움이 됩니다.

'Database' 카테고리의 다른 글

DATABASE #6. SETTING SQL DEVELOPER at MAC  (0) 2025.04.28
DATABASE #5. TO SQL  (0) 2025.04.28
DATABASE #4. Relational Algebra 2  (0) 2025.04.27
DATABASE #2. RELATIONAL DATABASE  (0) 2025.04.27
DATABASE #1. WHY DB?  (0) 2025.04.27