Chapter 1: 관계 대수
- 관계 해석
- 관계 대수 개요
- 셀렉션과 프로젝션
- 집합 연산
- 이름 바꾸기
- 조인
Chapter 1: 관계 대수
이 3가지 식 중에서 실행 계획을 구현할 때, 관계 대수식을 가장 많이 사용한다.
- 관계 대수식.
- 관계 해석식.
- 도메인 해석식.
관계 대수 개요
- 관계 대수(Relational Algebra): 관계 모델에 관한 두 가지 형식 질의어 중 하나.
- 관계 대수식 (Relational Algebra Expression): 연산자들의 모임을 사용해서 구성된 대수식.
- 기존의 Relation으로 부터 새로운 Relation을 생성.
필수 관계 연산자
연산자 | 표기법 | 단항 또는 이항 |
셀렉션(selection) | δ | 단항 |
프로젝션(projection) | π | 단항 |
합집합(union) | ∪ | 이항 |
차집합(difference) | - | 이항 |
카티션 프로덕트(cartesian product) | × | 이항 |
유도된 관계 연산자
연산자 | 표기법 | 단항 또는 이항 |
동등 조인(equijoin) | ⋈ | 이항 |
세타 조인(theta join) | ⋈θ | 이항 |
자연 조인 | ⋈N | 이항 |
세미 조인 | ⋉ and ⋊ | 이항 |
외부 조인 Left | ⟕ | 이항 |
외부 조인 Right | ⟖ | 이항 |
외부 조인 Full | ⟗ | 이항 |
셀렉션과 프로젝션
- 단일 Relation에 있는 데이터를 조작하는데 사용.
- 셀렉션 - 연산자 시그마( δ ): 릴레이션에서 투플들을 선택(Selction).
ex) SELECT * FROM 테이블 WHERE 조건; - 프로젝션 - 연산자 파이 ( π ): 필드들을 추출(Projection).
ex) SELECT 열1, 열2 FROM 테이블;
Pilot1
파일럿 번호 | 파일럿 이름 | 등급 | 나이 |
13 | 홍길동 | 1 | 44 |
32 | 이순신 | 10 | 44 |
4 | 안중근 | 7 | 32 |
* Selection
δ등급>5(Pilot1)
파일럿 번호 | 파일럿 이름 | 등급 | 나이 |
32 | 이순신 | 10 | 47 |
44 | 안중근 | 7 | 32 |
* Projection
π파일럿이름,등급(Pilot1)
파일럿 이름 | 등급 |
홍길동 | 1 |
이순신 | 10 |
안중근 | 7 |
집합 연산
- 합집합(Union, U)
- 교집합(Intersection, ∩)
- 차집합(Set-different, – )
- 카디션 프로덕트(Cartisian Product, X) - ex) SELECT * FROM Product, Category;
R X S는 R의 모든 필드와 S의 모든 필드의 모든 경우의 튜플을 반환. ex) R(6) X U(5) = 30
Pilot1
파일럿번호 | 파일럿이름 | 등급 | 나이 |
13 | 홍길동 | 1 | 44 |
32 | 이순신 | 10 | 44 |
44 | 안중근 | 7 | 32 |
Pilot2
파일럿번호 | 파일럿이름 | 등급 | 나이 |
28 | 김영랑 | 9 | 35 |
32 | 이순신 | 10 | 44 |
45 | 김소월 | 5 | 35 |
64 | 안중근 | 7 | 32 |
Flight
파일럿번호 | 비행기번호 | 운항일자 |
13 | 101 | 2022-10-09 |
44 | 102 | 2022-11-23 |
* 합집합 (Union, ∪)
Pilot1 ∪ Pilot2
파일럿번호 | 파일럿이름 | 등급 | 나이 |
13 | 홍길동 | 1 | 44 |
32 | 이순신 | 10 | 44 |
44 | 안중근 | 7 | 32 |
28 | 김영랑 | 9 | 35 |
45 | 김소월 | 5 | 35 |
* 교집합 (Intersection, ∩)
Pilot1 ∩ Pilot2
파일럿번호 | 파일럿이름 | 등급 | 나이 |
32 | 이순신 | 10 | 44 |
44 | 안중근 | 7 | 32 |
* 차집합 (Set-Difference, –)
Pilot1 - Pilot2
파일럿번호 | 파일럿이름 | 등급 | 나이 |
13 | 홍길동 | 1 | 44 |
* 카티션 프로덕트(Cartisian Product, X)
Pilot1 X Flight
파일럿번호 | 파일럿이름 | 등급 | 나이 | 파일럿번호 | 비행기번호 | 운항일자 |
13 | 홍길동 | 1 | 44 | 13 | 101 | 2022-10-19 |
32 | 이순신 | 10 | 44 | 13 | 101 | 2022-10-19 |
44 | 안중근 | 7 | 32 | 13 | 101 | 2022-10-19 |
13 | 홍길동 | 1 | 44 | 44 | 102 | 2022-11-23 |
32 | 이순신 | 10 | 44 | 44 | 102 | 2022-11-23 |
44 | 안중근 | 7 | 32 | 44 | 102 | 2022-11-23 |
이름 바꾸기
- Relation에서 필드의 이름을 변경(Renaming)할 수 있는 연산자 로우(ρ)
Pilot1 인스턴스
파일럿번호 | 파일럿이름 | 등급 | 나이 |
13 | 홍길동 | 1 | 44 |
32 | 이순신 | 10 | 44 |
44 | 안중근 | 7 | 32 |
* 연산자 로우(ρ)
ρ(Pilot3σ등급>5(Pilot1))
결과 릴레이션: Pilot3
파일럿번호 | 파일럿이름 | 등급 | 나이 |
32 | 이순신 | 10 | 47 |
44 | 안중근 | 7 | 32 |
* 필드 이름 변경: 등급 -> Grade
π파일럿이름,ρ(Grade(등급))(σ등급>5(Pilot1))
파일럿이름 | Grade |
이순신 | 10 |
안중근 | 7 |
조인
- 둘 이상의 Relation으로부터 정보를 조합하는 연산(⋈)
- 유도된 연산으로, Cartesian Product와 Projection을 함께 실행하여 얻은 결과와 동일
종류 | 기호 | 기능 |
동등 조인 | ⋈ | 두 릴레이션 간의 동일한 값을 가진 레코드의 집합을 생성. |
세타 조인 | ⋈θ | 두 릴레이션 간의 비교 조건에 만족하는 레코드를 선택하여 집합 생성. |
자연 조인 | ⋈N | 동등 조인에서 중복된 속성을 제거한 결과를 생성. |
세미 조인 | ⋉ / ⋊ | 자연 조인 후 기호의 열린 쪽의 속성을 제거하여 결과 생성. |
외부 조인 Left | ⟕ | 자연 조인 후 왼쪽 릴레이션의 모든 값을 포함하고, 오른쪽 값이 없을 경우 NULL로 채움. |
외부 조인 Right | ⟖ | 자연 조인 후 오른쪽 릴레이션의 모든 값을 포함하고, 왼쪽 값이 없을 경우 NULL로 채움. |
외부 조인 Full | ⟗ | 자연 조인 후 양쪽 릴레이션의 모든 값을 포함하고, 값이 없을 경우 NULL로 채움. |
Pilot 릴레이션
파일럿번호 | 파일럿이름 | 등급 | 나이 |
13 | 홍길동 | 1 | 44 |
32 | 이순신 | 10 | 44 |
44 | 안중근 | 7 | 32 |
Flight 릴레이션
파일럿번호 | 비행기번호 | 운항일자 |
13 | 101 | 2022-10-09 |
44 | 102 | 2022-11-23 |
* 동등 조인(Equijoin)
ex) SELECT * FROM Product INNER JOIN Category ON Product.CategoryNo = Category.CategoryNo;
Pilot⋈pilot.파일럿번호=Flight.파일럿번호Flight
(파일럿번호) | 파일럿이름 | 등급 | 나이 | (파일럿번호) | 비행기번호 | 운항일자 |
13 | 홍길동 | 1 | 44 | 13 | 101 | 2022-10-09 |
44 | 안중근 | 7 | 32 | 44 | 102 | 2022-11-23 |
* 세타 조인(Theta join)
Pilot ⋈θpilot.파일럿번호>Flight.파일럿번호Flight
(파일럿번호) | 파일럿이름 | 등급 | 나이 | (파일럿번호) | 비행기번호 | 운항일자 |
32 | 이순신 | 10 | 44 | 13 | 101 | 2022-10-19 |
44 | 안중근 | 7 | 32 | 13 | 101 | 2022-10-19 |
* 자연 조인(Natural join)
ex) SELECT * FROM Product NATURAL JOIN Category;
자동으로 조인 조건을 설정하는데, 두 relation의 공통된 attribute에 대해 동등 조인을 수행하고, 결과는 두 relation의 공통 열이 일치하는 튜플로 구성되며 중복된 값은 하나만 포함된다.
* 외부조인 Left (Left outer join)
ex) SELECT * FROM Product LEFT OUTER JOIN Category ON Product.CategoryNo = Category.CategoryNo;
Pilot ⟕ pilot.파일럿번호=Flight.파일럿번호 Flight
(파일럿번호) | 파일럿이름 | 등급 | 나이 | (파일럿번호) | 비행기번호 | 운항일자 |
13 | 홍길동 | 1 | 44 | 13 | 101 | 2022-10-19 |
32 | 이순신 | 10 | 44 | NULL | NULL | NULL |
44 | 안중근 | 7 | 32 | 13 | 101 | 2022-10-19 |
* 외부 조인 Right (Right outer join)
ex) SELECT * FROM Product RIGHT OUTER JOIN Category ON Product.CategoryNo = Category.CategoryNo;
Pilot ⟖ pilot.파일럿번호=Flight.파일럿번호 Flight
(파일럿번호) | 파일럿이름 | 등급 | 나이 | (파일럿번호) | 비행기번호 | 운항일자 |
13 | 홍길동 | 1 | 44 | 13 | 101 | 2022-10-19 |
44 | 안중근 | 7 | 32 | 13 | 101 | 2022-10-19 |
* 외부 조인 FULL
Pilot ⟗ pilot.파일럿번호=Flight.파일럿번호 Flight
(파일럿번호) | 파일럿이름 | 등급 | 나이 | (파일럿번호) | 비행기번호 | 운항일자 |
13 | 홍길동 | 1 | 44 | 13 | 101 | 2022-10-19 |
32 | 이순신 | 10 | 44 | NULL | NULL | NULL |
44 | 안중근 | 7 | 32 | 13 | 101 | 2022-10-19 |
* 추가


* 동등 조인(Equijoin)

* 자연 조인(Natural joi)


* 외부 조인 - Left Outer Join

출처: https://github.com/gikpreet/class-relational_database
GitHub - gikpreet/class-relational_database
Contribute to gikpreet/class-relational_database development by creating an account on GitHub.
github.com
'DB' 카테고리의 다른 글
[DB] JPA vs MyBatis (1) | 2024.10.08 |
---|---|
[Relational database] 06. SQL *** (0) | 2024.10.04 |
[Relational database] 04. 파일 조직과 인덱스 (1) | 2024.10.03 |
[Relational database] DB 확장 - Scale Up vs Scale Out (2) | 2024.10.03 |
[Relational database] 03. 디스크와 파일 (1) | 2024.10.03 |