DataBase에 정보를 요청하는 언어를 Query Language 라고 한다.
이 Query Language에는 다음과 같이 추상적인 개념인 Pure Query Language가 존재한다.
현재 2, 3번째는 잘 사용되지 않고 있고, 따라서 여기서는 Relational algebra에 대해 알아보자.
먼저 Algebra는 다들 알고 있듯이, 수학적 구조들의 일반적인 성질을 연구하는 수학의 한 분야이다.
예를 들면 선형대수에서 행렬의 성질 즉, "행렬간 곱셈의 결과를 어떻게 도출할 것인가" 라던지 "행렬의 차원을 어떻게 정의할까" 라는 것을 생각해 볼 수 있을 것이다.
즉, Relational Algebra는 말 그대로 Table을 대상으로 한 대수학인데, 한개 혹은 두개의 Table(=Relation)을 입력으로 받았을 때 할 수 있는 계산(연산)들을 연구하는 것이라고 생각해 볼 수 있을 것이다.
이 Relational Algebra는 Functional Language라는 특징이 있다.
여기서 Functional Language와 Procedural Language를 헷갈릴 수 있는데 다음 예문을 보면 이해하기 쉬울 것이다.
- a = 1+2+3
- a = 1+add(2, 3)
- assign(a, add(1, 2, 3))
우선 결과부터 보면 첫번째와 두번째는 Procedural Language이고, 세번째는 Functional Language이다.
Procedural Language는 Procedural과 Function을 조합해서 사용하는 방법을 뜻하고, Functional Language는 모든 표현이 Function으로 이루어져 있는 것이다.
그렇다고 Functional이라는 것이 Procedural하지 않다는 것이 아니다. 이 함수 안에는 당연히 Procedural한 코드가 작성되어 있을 것이기 때문이다.
(참고: Procedural Language로 표현할 수 있는 수식은 전부 Functional Language로 표현이 가능하다.)
다음은 다른 Operator로는 구현할 수 없는 Basic Operator이다.
먼저, 하나의 입력만 필요한 단항연산자를 살펴보자.
- 기호
![]()
- p: 선택할 N-Tuple의 조건을 입력하는 자리
- r: Relation을 입력하는 자리
- 정의
입력받은 Relation에서 조건을 맞는 N-Tuple들을 선택해 새로운 Relation을 만드는 연산
- (Attribute: 주어진 Relation의 Attribute와 같음)
- (Tuple: 조건에 맞는 Tuple만 선택)
- 예시
- 기호
![]()
- A: 선택할 Attribute를 입력하는 자리
- r: Relation을 입력하는 자리
- 정의
입력받은 Relation에서 특정 Attribute를 뽑아내 새로운 Relation을 만드는 연산
- (Attribue: 특정 Attribute만 선택)
- (Tuple: 주어진 Relation Tuple과 같음)
- 예시
(여기서 Relational Algebra는 중복된 값이 없다는 것을 가정하기 때문에 따로 중복을 제거해줄 필요는 없다)
(반면에 SQL은 실제 DB를 대상으로 작동하므로 Project 연산 후에 반드시 중복을 제거해 주자.)
- 기호
![]()
- x: 바꾸고 싶은 Relation의 이름
- A: 바꾸고 싶은 Attribute의 이름 (순서 조심)
- E: 이름을 바꿀 Relation을 입력하는 자리
- 정의
입력받은 Relation에서 Relation Name 혹은 Attribute Name을 바꾸어 새로운 Relation을 만드는 연산
- 예시
다음으로는 연산시 두개의 입력이 필요한 이항연산자를 살펴보자
- 기호
![]()
- r과 s는 모두 Relation
- 정의
Relation Schema가 같은 두 Table에 대해 합집합을 수행하여 새로운 Relation을 만드는 연산
- (Attribute: 주어진 Relation의 Attribute )
- (Tuple: 두 Relation의 Tuple들의 합집합)
(
조건
: Relation의 Schema가 같아야 한다는 조건을 잊지말자)
- 예시
- 기호
![]()
- r과 s는 모두 Relation
- 정의
Relation Schema가 같은 두 Table에 대해 차집합을 수행하여 새로운 Relation을 만드는 연산
- (Attribute: 주어진 Relation의 Attribute )
- (Tuple: 두 Relation의 Tuple들의 차집합)
(
조건
: 합집합과 마찬가지로 Relation의 Schema가 같아야 한다.)
- 예시
- 기호
![]()
- r과 s는 모두 Relation
- 정의
입력받은 두 Relation의 Attribute를 합치고, 그 Instance는 두 Relation의 모든 조합을 표현하는 새로운 Relation을 만드는 연산
- (Attribute: 두 Relation의 Attribute를 중복은 포함되게 합침)
- (Tuple: Attribute의 모든 조합에 대한 값들을 표현)
- 예시
(예를 들어 만약 r의 Attribute에 C까지 포함 되어 있다고 가정해 보자, 이 때에는
r x s
의 Attribute는A
,B
,r.C
,s.C
,D
,E
가 될 것이다.)
다음은 Basic Operator를 적당히 조합해서도 만들 수 있는 Operator 중에서 자주 사용되는 연산자를 알아보자.
- 기호
![]()
- r과 s는 모두 Relation
- 정의
입력받은 두 Relation의 Attribute를 중복이 없도록 합치고, 그 Instance는 중복된 Attribute에서 Domain이 같은 경우만 표현하는 새로운 Relation을 만드는 연산
- (Attribute: 두 Relation의 Attribute를 중복을 제거하고 합침)
- (Tuple: 중복된 Attribute에서 Domain이 같은 경우의 값만 표현)
- 예시
- 기호
![]()
- r과 s는 모두 Relation
- Theta: 선택할 조건
- 정의
입력받은 두 Relation을 Catesian Product를 통해 합친 후에 주어진 조건에 해당하는 Tuple만 표현하는 새로운 Relation을 만드는 연산
- (Attribute: 두 Relation의 Attribute를 중복을 포함하여 합침)
- (Tuple: Catesian Product후에 주어진 조건에 해당하는 것만 선택)
- 예시
Data Base에는 변수라는 개념이 존재하지 않는다. 즉, 어떤 값을 저장해 두고 활용할 수 없다는 것이다.
이 때문에 다음과 같은 문제(Self Join문제)를 해결할 때에 문제가 발생할 수 있다.
이 경우 ID가 12121인 Instructors의 수익을 저장해 놓고 다른 Instructor들과 비교해야 하기 때문이다.
이러한 문제를 Rename으로 해결 해볼 수 있다.
다음과 같이 원래 Table에서 이름을 바꾸고 ID가 12121인 Instructors만 골라낸 새로운 Table을 만들어 서로 비교하면 되기 때문이다.
원하지 않게 겹치는 부분 때문에 위 문제를 해당 수식으로 잘못 도출할 수 있음