관계형 질의 언어 (Relational Query Language)
- 질의 언어: 유저가 데이터베이스로부터 정보를 요청할 때 사용되는 언어
- 관계형 질의언어: 관계형 데이터베이스를 위한 질의 언어
- 절차적 언어: 유저가 시스템에게 연산의 과정을 구현하라고 지시
- 비절차적 (선언적) 언어: 유저는 정보를 얻기 위한 구체적인 절차를 주지 않으면서 얻고자 하는 정보를 묘사한다
"순수"한 관계형 질의 언어
- 관계 대수 (Relational Algebra), 튜플 관계형 미적분학 (Tuple Relational Calculus) 등이 해당된다.
- 사람들이 사용하는 질의 언어의 기본 기반을 형성
관계 대수
- 대수학: 연산자와 피연산자
- 관계대수에서는 다음과 같이 구성된다.
- 연산자: 기본 연산자 (+ 추가적인 연산자)
- 피연산자: 관계
- 절차적 언어
- 여섯 개의 기본 연산자
- Select: σ
- Project: Π
- Union: ∪
- Set difference: −
- Cartesian product: ×
- Rename: ρ
- 연산자들은 하나 이상의 관계를 받고 새로운 관계를 결과로 도출한다.
Selection 🔎
관계 r이 왼쪽과 같이 있을 때, A와 B가 같으면서 D가 5보다 큰 값만 조회하면 다음과 같이 된다.

Projection ⏏️
Projection은 필요한 열만 선택하여 새로운 관계를 만드는 것을 뜻한다.
관계 r이 왼쪽과 같이 있을 때, A와 C 속성만을 추출해보면 오른쪽과 같이 된다.

Union 🧺
관계 r과 s가 위와 같이 있을 때, 합치는 연산을 하면 아래와 같이 된다.

Union과 같은 집합 연산은 다음과 같은 조건들이 필수적으로 선행되어야 한다.
- 각 관계의 속성 갯수가 같아야 한다.
- 서로 매칭되는 속성들의 도메인이 같아야 한다.
Set ➖
관계 r과 s가 위와 같이 있을 때, 빼는 연산을 하면 아래와 같이 된다.

교집합 ⌛️
교집합은 기본 연산자가 아님에 주의한다. 그 이유는 충분히 Set만으로 표현할 수 있기 때문이다.

Join - Cartesian Product (데카르트 곱) ✖️
관계 r과 s가 위와 같을 때, r과 s를 join하면 아래와 같은 결과를 얻을 수 있다.

Naming issue ❌
두 관계를 join할 때, 이름이 같은 속성이 있다면 어떤 것의 속성을 결과로 도출해야 할 지 오류가 발생할 수 있다. 이것을 naming issue라고 하며, 각 관계를 구분하기 위해 다음과 같이 작성한다.

Renaming ♻️
자기 자신과의 연산을 하고 싶다고 가정해보자.
r×r과 같은 표현은 올바르지 않다. 이 문제를 해결하기 위해서는 이름을 살짝 바꾸어서 표현해야 한다.
이 경우에는 다음과 같이 표현하면 된다.

연산의 합성 🥙
이 연산들은 합성하는 것이 가능하다. 즉, r과 s를 join한 뒤 A 속성과 C 속성의 값이 같은 것을 추출하도록 계산할 수 있다.

Natural join
Natural join에서는 같은 속성이 있을 경우 축약되어서 나온다.

Natural join 또한 기본 연산자가 아니다!
관계형 언어의 요약
- 각 질의 입력은 테이블이다. (또는 테이블의 집합이다.)
- 각 질의 출력은 테이블이다.
- 출력의 모든 데이터는 하나의 입력 테이블에서 등장된다.
- 관계 대수는 튜링 완전 (turing complete)이 아니다.