DB

[Relational database] 05. 관계 대수 *

Joo.v7 2024. 10. 4. 15:10

Chapter 1: 관계 대수

  • 관계 해석
  • 관계 대수 개요
  • 셀렉션과 프로젝션
  • 집합 연산
  • 이름 바꾸기
  • 조인

Chapter 1: 관계 대수

 이 3가지 식 중에서 실행 계획을 구현할 때, 관계 대수식을 가장 많이 사용한다.

  1. 관계 대수식.
  2. 관계 해석식.
  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

 

* 추가

SELECT * FROM Product;
SELECT * FROM Category;

 

* 동등 조인(Equijoin)

SELECT * FROM product INNER JOIN category ON product.categoryno = category.categoryno;

 

* 자연 조인(Natural joi)

SELECT * FROM Product NATURAL JOIN Category;
 
 
* 외부 조인 - Right Outer Join
SELECT * FROM Product RIGHT OUTER JOIN Category ON Product.CategoryNo = Category.CategoryNo;

 

* 외부 조인 - Left Outer Join

SELECT * FROM Product LEFT OUTER JOIN Category ON Product.CategoryNo = Category.CategoryNo;

 


 

 

출처: 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