---
title: "질의를 연산으로 분해하는 언어: 관계 대수"
author: "Lee"
published_at: "2026-10-01T07:00:03.745Z"
updated_at: "2026-09-30T09:24:39.815Z"
tags: ["컴퓨터공학","데이터베이스"]
canonical_url: "https://ariser.io/@writer_a1cd615ab19e/%EC%A7%88%EC%9D%98%EB%A5%BC-%EC%97%B0%EC%82%B0%EC%9C%BC%EB%A1%9C-%EB%B6%84%ED%95%B4%ED%95%98%EB%8A%94-%EC%96%B8%EC%96%B4-%EA%B4%80%EA%B3%84-%EB%8C%80%EC%88%98"
ai_assisted: false
---

# 질의를 연산으로 분해하는 언어: 관계 대수

[원문](https://ariser.io/@writer_a1cd615ab19e/%EC%A7%88%EC%9D%98%EB%A5%BC-%EC%97%B0%EC%82%B0%EC%9C%BC%EB%A1%9C-%EB%B6%84%ED%95%B4%ED%95%98%EB%8A%94-%EC%96%B8%EC%96%B4-%EA%B4%80%EA%B3%84-%EB%8C%80%EC%88%98)

관계 대수는 관계를 입력받아 새로운 관계를 만드는 연산들의 체계다. 데이터를 절차적 반복문으로 한 행씩 처리하는 대신, 선택·투영·조인 같은 연산을 결합해 원하는 결과를 표현한다. 관계형 데이터베이스의 논리적인 질의 처리와 쿼리 최적화를 이해하는 기본 언어다.

![학생 관계에서 조건으로 행을 고른 뒤 이름 열만 투영하는 관계 대수 연산 그림](/api/v1/media/68c32e90-dbaf-4fad-9dbb-3f1e90a96b8e)

*선택은 조건에 맞는 튜플을 남기고 투영은 필요한 속성을 남긴다.*

### 행을 고르는 일과 열을 고르는 일
학생 관계에서 학과가 CS인 튜플만 남기는 것이 선택 연산이다. 선택은 조건에 맞는 행을 고르며, 보통 시그마 기호로 표현한다. 그 결과에서 이름 속성만 남기는 것이 투영이며 파이 기호를 사용한다. 일상 표현에서 둘 다 선택이라고 부르기 쉬워도 관계 대수에서는 서로 다른 동작이다.

이론적인 관계가 집합이라는 조건에서는 투영 후 중복 튜플이 제거된다. CS 학생 두 명의 이름이 같다면 이름만 투영한 집합에는 하나의 이름 튜플만 남을 수 있다. SQL의 SELECT name이 기본적으로 중복을 유지하는 것과 차이가 있으므로 실제 SQL과 비교할 때 DISTINCT 여부를 확인해야 한다.

카티션 곱은 한 관계의 각 튜플을 다른 관계의 모든 튜플과 조합한다. 행이 각각 m개와 n개면 결과는 m×n개의 조합을 갖는다. 학생과 수강 기록의 곱을 만든 뒤 학번이 같은 조합만 선택하면 등가 조인을 표현할 수 있다. 다만 실제 DBMS가 언제나 거대한 곱을 먼저 물리적으로 만들 필요는 없다.

### 작은 식이 큰 실행 차이를 만든다
학생과 수강을 조인한 뒤 CS 학생만 남기는 질의를 생각해 보자. 조건이 학생 관계의 속성만 사용하고 의미가 보존되는 경우, CS 학생을 먼저 선택한 뒤 수강과 조인하는 식으로 바꿀 수 있다. 이 선택 밀어넣기는 중간 결과를 줄일 가능성이 있다. 논리적인 동등성과 실제 물리 실행 비용은 구분해야 한다.

합집합과 차집합처럼 관계를 결합하는 연산에는 호환되는 속성 구조가 필요하다. 이름 하나만 있는 관계와 학번·이름을 가진 관계를 같은 형식처럼 합칠 수는 없다. 관계 대수는 연산 결과도 관계가 되는 폐쇄성을 가지므로, 타입과 속성 조건을 지키면 여러 연산을 계속 연결할 수 있다.

속성 이름이 겹치거나 같은 관계를 두 번 사용할 때는 이름 변경이 필요하다. 예를 들어 선후수 과목을 같은 과목 관계와 두 번 연결한다면 두 역할을 구별할 별칭이 있어야 한다. 이름 변경은 데이터를 바꾸는 연산이라기보다 식에서 어떤 속성과 관계를 가리키는지 명확하게 만드는 수단이다.

기본 관계 대수의 집합 의미만으로 실제 SQL의 모든 기능을 그대로 설명하지는 못한다. 중복, NULL, 집계, 외부 조인과 순서 처리에는 추가 규칙이나 확장이 필요하다. 특히 외부 조인은 매칭되지 않은 튜플도 남기므로 내부 조인에서 가능한 식 변환을 아무 조건 없이 적용하면 결과가 달라질 수 있다.

식을 연습할 때는 먼저 입력 관계의 스키마를 쓰고 각 연산 뒤의 스키마와 예상 행 수를 적어 보면 좋다. 선택 뒤 열이 사라진다고 생각하거나 투영 뒤 정렬된다고 생각하는 오해를 쉽게 찾을 수 있다. 관계 대수의 장점은 기호를 많이 외우는 데 있지 않고, 질의의 의미를 작은 변환으로 확인하고 실행 계획의 근거를 설명할 수 있다는 데 있다.

### 참고 자료

- [CMU 15-445 Relational Algebra notes](https://15445.courses.cs.cmu.edu/fall2025/notes/01-relationalmodel.pdf)
- [PostgreSQL table expressions](https://www.postgresql.org/docs/current/queries-table-expressions.html)
