관계대수와 관계해석
요약
정보처리기사 실기 시험의 핵심 개념인 관계 대수의 연산자와 특징을 알아봅니다. 절차적 언어와 비절차적 언어의 차이점을 이해하고, 실제 기출문제 유형을 통해 시험을 완벽하게 대비하세요.
관계 대수(Relational Algebra)란?
관계 대수는 관계형 데이터베이스에서 원하는 데이터를 찾는 방법을 기술하는 절차적 정형 언어입니다. 하나 이상의 릴레이션(테이블)을 입력으로 받아 결과적으로 새로운 릴레이션을 생성하는 연산들의 집합으로 구성됩니다.
관계 대수 vs. 관계 해석: 절차적 언어와 비절차적 언어
데이터베이스 언어는 크게 절차적 언어와 비절차적(선언적) 언어로 나뉩니다.
-
절차적 언어 (Procedural Language)
- "어떻게(How)" 데이터에 접근하고 가져올 것인지를 명시합니다.
- 원하는 결과를 얻기 위한 구체적인 처리 절차와 순서를 단계별로 기술합니다.
- 관계 대수가 대표적인 예입니다.
SELECT을 먼저 할지,JOIN을 먼저 할지 등 순서가 정해져 있습니다.
-
비절차적 언어 (Non-procedural Language)
- "무엇(What)" 을 원하는지만을 명시합니다.
- 원하는 결과가 무엇인지만 선언하고, 그것을 얻는 구체적인 방법이나 절차는 시스템(DBMS)에 위임합니다.
- 관계 해석과 SQL이 대표적인 예입니다. 사용자는
SELECT * FROM ... WHERE ...와 같이 원하는 데이터의 조건만 명시하면, 내부적인 처리 절차는 DBMS의 옵티마이저가 결정합니다.
따라서 관계 대수는 '과정'을, 관계 해석은 '목표'를 중심으로 기술하는 언어라고 이해할 수 있습니다.
관계 대수 연산자
관계 대수 연산자는 크게 일반 집합 연산자와 순수 관계 연산자로 나뉩니다.
일반 집합 연산자
수학의 집합 이론을 기반으로 하며, 두 릴레이션이 합병 가능(Union-compatible) 해야 한다는 전제 조건이 있습니다. (두 릴레이션의 애트리뷰트 개수가 같고, 대응되는 애트리뷰트의 도메인이 같아야 함)
| 연산자 | 기호 | 설명 |
|---|---|---|
| 합집합 | ∪ | 두 릴레이션의 튜플을 모두 포함하는 릴레이션을 반환합니다. (중복 제외) |
| 교집합 | ∩ | 두 릴레이션에 공통으로 존재하는 튜플만으로 구성된 릴레이션을 반환합니다. |
| 차집합 | - | 첫 번째 릴레이션에는 속하지만 두 번째 릴레이션에는 속하지 않는 튜플을 반환합니다. |
| 카티션 프로덕트 | × | 두 릴레이션의 튜플들을 순서쌍으로 조합하여 만들 수 있는 모든 튜플을 반환합니다. |
카티션 프로덕트 (Cartesian Product) 예시
릴레이션 R
| 이름 |
|---|
| 김감자 |
| 이고구마 |
릴레이션 S
| 과목 |
|---|
| DB |
| 네트워크 |
| 보안 |
R × S 의 결과: R의 각 튜플과 S의 각 튜플을 모두 조합합니다. (2 × 3 = 6행)
| 이름 | 과목 |
|---|---|
| 김감자 | DB |
| 김감자 | 네트워크 |
| 김감자 | 보안 |
| 이고구마 | DB |
| 이고구마 | 네트워크 |
| 이고구마 | 보안 |
카티션 프로덕트는 조건 없이 모든 조합을 만들기 때문에, 결과의 튜플 수는 R의 튜플 수 × S의 튜플 수가 됩니다. 합병 가능 조건이 필요한 합집합·교집합·차집합과 달리, 카티션 프로덕트는 속성이 달라도 사용할 수 있습니다.
순수 관계 연산자
관계형 데이터베이스 모델을 위해 특별히 만들어진 연산자입니다.
조인 (Join) 연산 예시
조인은 두 릴레이션에서 공통 애트리뷰트 값이 같은 튜플끼리 결합하여 하나의 릴레이션으로 만드는 연산입니다.
예시: 학생 릴레이션 ⋈ 수강 릴레이션
릴레이션 R (학생)
| 학번 | 이름 |
|---|---|
| 100 | 김감자 |
| 200 | 이고구마 |
| 300 | 박옥수수 |
릴레이션 S (수강)
| 학번 | 과목 |
|---|---|
| 100 | DB |
| 100 | 네트워크 |
| 200 | DB |
공통 애트리뷰트는 학번입니다. R ⋈ S 의 결과: 학번이 같은 튜플끼리 결합됩니다.
| 학번 | 이름 | 과목 |
|---|---|---|
| 100 | 김감자 | DB |
| 100 | 김감자 | 네트워크 |
| 200 | 이고구마 | DB |
- 학번 100(김감자)은 수강 테이블에 2개 튜플이 있으므로 결과에 2행
- 학번 200(이고구마)은 수강 테이블에 1개 튜플이 있으므로 결과에 1행
- 학번 300(박옥수수)은 수강 테이블에 일치하는 튜플이 없으므로 결과에서 제외
위 예시는 공통 애트리뷰트 값이 같은 튜플만 결합하는 자연 조인(Natural Join) 입니다. 이 외에도 조건을 직접 지정하는 세타 조인(Theta Join), 동등 조건을 사용하는 동등 조인(Equi Join) 등이 있습니다.
디비전 (Division) 연산 예시
디비전은 다른 연산자에 비해 직관적이지 않아 예시로 이해하는 것이 좋습니다.
"B 릴레이션의 모든 값과 짝을 이루는 A의 값만 골라내라" 라고 이해하면 됩니다.
예시: 수강 릴레이션 ÷ 과목 릴레이션
릴레이션 R (수강)
| 학생 | 과목 |
|---|---|
| 김감자 | DB |
| 김감자 | 네트워크 |
| 김감자 | 보안 |
| 이고구마 | DB |
| 이고구마 | 보안 |
| 박옥수수 | DB |
| 박옥수수 | 네트워크 |
릴레이션 S (필수 과목)
| 과목 |
|---|
| DB |
| 네트워크 |
R ÷ S 의 결과: S의 모든 과목(DB, 네트워크)을 둘 다 수강한 학생만 남깁니다.
| 학생 |
|---|
| 김감자 |
| 박옥수수 |
- 김감자: DB ✓, 네트워크 ✓ → 포함
- 이고구마: DB ✓, 네트워크 ✗ → 제외 (네트워크 미수강)
- 박옥수수: DB ✓, 네트워크 ✓ → 포함
디비전의 핵심은 "모든(ALL)" 입니다. S의 튜플 중 하나라도 빠지면 결과에 포함되지 않습니다.
디비전은 속성이 2개일 때만 가능한가?
아닙니다. A 릴레이션이 B 릴레이션의 모든 속성을 포함하기만 하면, 속성이 몇 개든 디비전이 가능합니다. 결과 릴레이션의 속성은 A의 속성에서 B의 속성을 뺀 나머지가 됩니다.
예를 들어 A가 (학생, 과목, 학기) 3개 속성이고, B가 (과목, 학기) 2개 속성이면:
릴레이션 A
| 학생 | 과목 | 학기 |
|---|---|---|
| 김감자 | DB | 1학기 |
| 김감자 | 네트워크 | 2학기 |
| 이고구마 | DB | 1학기 |
릴레이션 B
| 과목 | 학기 |
|---|---|
| DB | 1학기 |
| 네트워크 | 2학기 |
A ÷ B 의 결과: B의 모든 (과목, 학기) 조합과 짝을 이루는 학생만 남깁니다.
| 학생 |
|---|
| 김감자 |
- 김감자: (DB, 1학기) ✓, (네트워크, 2학기) ✓ → 포함
- 이고구마: (DB, 1학기) ✓, (네트워크, 2학기) ✗ → 제외
이처럼 결과의 속성은 A에만 있고 B에는 없는 학생 하나만 남게 됩니다.