# 33강. 관계형 모델
- 관계형 모델을 기반으로 작성된 데이터베이스가 `관계형 데이터베이스`이다.
- SQL은 관계형 모델에 의해 구축된 데이터베이스를 조작하는 체계적인 명령의 집합이다.
- 관계형 모델에서 SQL이 만들어졌지만 유감스럽게도 관계형 모델에서 사용하는 용어와 SQL의 용어는 일치하지 않는다.
- SQL을 사용하는 이상 관계형 모델의 용어를 몰라도 딱히 어려움은 없지만 알아두는 것이 좋다.

---

## 1. 관계형 모델
- `관계형 모델(Relational Model)`의 기본적인 요소는 `릴레이션(Relation)`이다.
- 이 릴레이션이라는 말 자체는 `관계`를 뜻하지만 관계형 모델에서는 약간 다른 의미를 가진다.
- 결합에 관해 설명할 때 `일반적인 시스템의 데이터베이스에는 복수의 테이블이 있어 테이블 간의 관계가 중요하다`고 했다.
- 관계형 모델의 릴레이션은 SQL에서 말하는 `테이블`에 해당한다. 테이블끼리의 관계가 아니다.

##### 릴레이션은 테이블을 말한다!

- 관계형 모델의 릴레이션에는 몇 가지 `속성(attribute)`이 있다.
- 이 속성은 속성 이름과 형 이름으로 구성된다.
- 속성은 SQL에서 말하는 열에 해당한다.
- 그리고 SQL에서의 행은 관계형 모델에서 `튜플(tuple)`이라 불린다.
- 정리하자면 릴레이션은 테이블, 속성은 열, 행은 튜플에 해당한다.
- 관계형 모델은 데이터 구조에 관해 정의한다. 릴레이션은 튜플의 집합이며, 릴레이션에 대한 연산이 집합에 대한 연산에 대응된다는 이론을 `관계대수`라고 한다.
- 이 같은 관계대수의 기본규칙은 다음과 같다.
    - 하나 이상의 관계를 바탕으로 연산한다.
    - 연산한 결과, 반환되는 것 또한 관계이다.
    - 연산을 중첩 구조로 실행해도 상관없다.
- `UNION`이나 테이블의 결합을 익힌 만큼, 연산한 결과도 관계(릴레이션 = 테이블)이다.

---

## 2. 관계형 모델과 SQL
- 관계대수에서는 자주 사용될 것 같은 릴레이션의 연산 방법을 몇 가지 규정한다.

### 합집합
- `합집합(union)`은 릴레이션끼리의 덧셈을 말한다.
- SQL에서는 `UNION`에 해당한다.
- `SELECT * FROM A UNION SELECT * FROM B`

### 차집합
- `차집합(difference)`은 릴레이션끼리의 뺄셈을 말한다.
- SQL에서는 `EXCEPT`에 해당한다.
- `SELECT * FROM A EXCEPT SELECT * FROM B`

### 교집합
- `교집합(intersection)`은 릴레이션끼리의 공통부분(교집합)을 말한다.
- SQL에서는 `INTERSECT`에 해당한다.
- `SELECT * FROM A INTERSECT SELECT * FROM B`

### 곱집합
- `곱집합(cartesian product)`은 릴레이션끼리의 대전표를 조합하는 연산을 말한다.
- SQL에서는 `FROM` 구에 복수의 테이블을 지정한 경우 곱집합으로 계산된다.
- 이때 `CROSS JOIN`으로 교차결합을 하면 곱집합을 구할 수 있다.
- `SELECT * FROM A, B`
- `SELECT * FROM A CROSS JOIN B`

### 선택
- `선택(selection)`은 튜플의 추출을 말하며, 선택은 제한이라 불리기도 한다.
- 튜플은 SQL에서 행을 말하기 때문에 `WHERE` 구에 조건을 지정해 데이터를 검색하는 것에 해당된다.
- `SELECT * FROM A WHERE no < 3`

### 투영
- `투영(projection)`은 속성의 추출을 말한다.
- SQL에서 속성은 열을 말하기 때문에 `SELECT` 구에 결과로 반환할 열을 지정하는 것에 해당된다.
- `SELECT a FROM A`

### 결합
- `결합(join)`은 릴레이션끼리 교차결합해 계산된 곱집합에서 결합조건을 만족하는 튜플을 추출하는 연산이다.
- SQL에서는 내부결합에 해당한다.
- 관계대수에도 내부결합과 외부결합이 있다.
- `SELECT a FROM A INNER JOIN B ON A.no = B.no`

---