관계 대수

강한친구·2021년 9월 23일
0

데이터베이스

목록 보기
4/14

SQL

절차적 방식과 비절차적 방식이 있음
사용자 입장에서는 비절차적 방식이 더 쉬움

But, 컴퓨터는 비절차적 방식을 그냥 주면 실행할 수 없음.
따라서, 절차적 언어로 변환을 해줘야함.

내부에서 비절차적 질의를 변환하는 작업을 관계형 DB엔진이 수행함.

연산과 데이터

연산 : 시스템 입장
데이터 언어 : 사용자 입장

관계 대수

  • 절차적 언어 : How, What
    관계 해석
  • 비절차적 언어: What
     투플 관계 해석(tuple relational calculus)
     도메인 관계 해석 (domain relational calculus)

관계 해석과 관계 대수는 표현과 기능 면에서 동등

관계 대수

릴레이션(튜플의 집합)을 처리하기 위한 연산의 집합

기본연산

  • 일반 집합 연산자
     합집합(UNION, ∪)
     교집합(INTERSECT, ∩)
     차집합(DIFFERENCE, -)
     카티션 프로덕트(CARTESIAN PRODUCT, ×)
    : 카티션 프로덕트는 두 릴레이션의 튜플들을 곱해서 안의 값들을 모두 하나의 집합으로 만드는 것

  • 순수 관계 연산자
     실렉트(SELECT, σ)
     프로젝트(PROJECT, π)
     조인(JOIN, ⋈)
     디비전(DIVISION, ÷)

  • 폐쇄성질 : 피연산자와 연산결과가 모두 릴레이션이다. 따라서 중첩된 수식의 표현이 가능하다.

  • 합병가능(union-compatible)한 릴레이션
     ∪, ∩, - 연산의 피연산자들은 차수가 같아야 함
     대응 애트리뷰트 쌍 별로 도메인이 같아야 함 -> 도메인이 서로 다르면 합병이 불가능함 (이름 학번 학과)

실렉트 (SELECT: σ:sigma)

  • 주어진 튜플에 맞춰 릴레이션 내에서 데이터를 선택하는 것
  • 수평적 부분집합
    EX)
    σ학과 = '컴퓨터' (학생) -> 학생 릴레이션에서 컴퓨터과를 찾음
    σ학번 = 300 σ 과목번호='C312'(등록) -> 등록 릴레이션에서 300번대 학번과 과목번소 C312를 찾음
    σ중간성적<기말성적 (등록) -> 중간성적이 기말성적보다 낮은 튜플을 모두 찾음
  • 선택률 : 선택조건에 의해 검색되는 튜플의 비율

프로젝트 (PROJECT: π: pi)

  • π 뒤에 오는 어트리뷰트를 골라서 보여줌
  • 수직적 부분집합

EX)
학생(학번,이름,학년,학과)에서 π이름,학과(학생) -> 학생 릴레이션에서 이름과 학과 어트리뷰트를 모두 보여줌

  • 결과에 튜플이 중복되는 경우에는 제거 -> 결과도 튜플의 집합 따라서, 릴레이션임. (폐쇄성)

동일조인(Equijoin : ⋈)

Relation 이상현상
이상현상을 막기위해서 relation을 분리하고 표현함
검색연산을 위해서는 결합을 하고 찾아야함

  • 세타조인에서 θ가 '='인 경우, 두 릴레이션(θA=B)에서 A B 에 맞춰서 전부 조인함.

자연조인 (Natural Join : ⋈N)

  • 동일조인에서 중복되는 에트리뷰트를 모두 제거
  • 일반적으로 조인이라하면 자연조인을 의미함

    무작정 만들면 학생 1개의 튜플당 등록의 튜플갯수만큼 만들어지는데 이중에 대부분은 의미없는 튜플이 되어버린다.
    파이션 프로덕트 한다음에 (학생 * 등록) 학생의 학번과 등록의 학번이 동일한것만 의미가 있다. 따라서 의미가 있는것들끼리 추출해서 만만들어낸 것 바로 동일조인이다.

세타조인 (Theta join)

  • 등호만 가지고 와서 조인하는 것이 아니라 일반적인 조인은 세타값으로 등호말고 다른것도 올 수 있음. 이를 통칭하여 세타조인이라 부름
  • 조인을 하고 나면 결과 차수 = R 차수 + S 차수
    혹은 자연조인을 하게 되면 두 합 – 공통값

에트리뷰트의 이름이 달라도 의미가 같으면 세타조인 가능함

디비전 (Division % )

R÷S={ t | t∈πD(R) ∧ t · s∈R for all s∈S }

학번으로 프로젝션하고 S (과목번호)와 파티션을 함
그 후 SC와 비교를 하여 필요없는것는 것은 다 지움

이런식으로 모든 과목을 다 듣는 학생을 찾을 수 있음

개명 연산(Rename ρ: rho)

  • 중간 처리 결과 릴레이션에 이름을 지정하거나, 애트리뷰트 이름을 변경할 때 사용
    ρS(E)
     관계 대수식 E의 결과 릴레이션의 이름을 S로 지정

ρS(B1,B2, … ,Bm )(E)
 관계 대수식 E의 결과 릴레이션의 이름을 S로 지정하고
애트리뷰트 이름은 각각 B1,B2, … ,Bm 으로 지정

ρ(B1,B2, … ,Bm )(R)
 릴레이션 R의 애트리뷰트 이름을 각각 B1,B2, … ,Bm 으로변경

기본연산

다른 연산으로 대체할 수 없는 하나의 논리적 기능을 수행하는 연산

복합 연산 (composite operations)

 몇 개의 기본 연산으로 대체할 수 있는 연산
 교집합(∩), 조인(⋈), 디비전(÷)
 R ∩ S = R – (R – S)
 R ⋈AθB S = AθB (R × S)
 R(Z, Y)÷S( Y )= R[Z] - ((R[Z] × S) - R)[Z]
 연산력 보다는 표현력을 증대

ex)
Z = {학번, 과목번호}
Y = {과목번호}
Z, Y = {학번, 과목번호}
R(Z, Y) = R(X) / S(Y) = R[Z] – ((R[Z] * S)) – R[Z]

Y = {D, E, F}
Z = {A, B, C}
Y = R과 S의 공통된 Attribute
(R[Z] * S) - Z, Y의 모든 가능한 조합
-R[Z] > 실제로 존헤하지 않는 모든것을 뺌
그 다음 Z를 프로잭션하면 Z에 할당하는것만 빠지고 존재하지 않는 것에 있는 Z만 뽑아냄. 그 후 실제 데이터 R에서 존재하지않는것을 빼면 존재하는것만 남음

다양한 조인

세미조인(semijoin: ⋉)

  • R⋉S : S와 자연 조인이 가능한 R의 튜플 집합
  • 네트워크 전송량을 줄이기 위해서 만들었음

    각 사이트가 스키마 정보는 서로 파악하고 있음
    S가 R정보를 다운로드 받아야하는데 그 양을 줄이기 위함임
    그래서 미리 알고있는 중복되는 어트리뷰트 정보를 S가 R로 보냄 혹은 반대로 보냄

외부 조인(outerjoin, ⋈+)

  • 한 릴레이션에 있는 투플이 조인 할 상대 릴레이션에 대응되는 투플이 없을 경우, 상대를 널(null) 투플로 만들어 결과 릴레이션에 포함
  • 누락 정보를 처리하기 위한 조인의 확장
  • 두 조인 릴레이션의 튜플들이 전부 결과 릴레이션에 포함됨

left outerjoin

  • 왼쪽에 있는 R에서 조인에 참여하지 않는 것들을 포함(S는 미포함

right outerjoin

  • 오른쪽에 있는 S에서 조인에 참여하지 않는 것들을 포함(R은 미포함)

외부합집합 (outer-union, ∪+)

  • 합병 가능하지 않은(not unioncompatible)두 릴레이션의 모든 애트리뷰트를 포함하는 확장된 릴레이션으로 만듦
  • 확장된 릴레이션에 해당하는 애트리뷰트 값이 없을 때는 널 값으로 채움

집계(Aggregation) 연산

일반 형식 : GAFB(E)
 E : 관계 대수식
 F : 집계 함수 ( SUM, AVG, MAX, MIN, COUNT) > 일반적인 5개
 B : 집계 함수의 적용 대상 애트리뷰트
 G : 그룹 함수 GROUP
 A : 그룹 함수가 적용할 애트리뷰트

GROUP[과목번호]AVG성적
실행 순서는 GROUP, AVG 순서임

=>각각의 그룹별로 통계를 구하기 위해 집계연산을 함

예제

  1. 모든 학생의 '이름'과 '학과'를 검색하라.

    π 이름, 학과 (학생)

  2. '과목번호'가 C413인 과목에 등록한 학생의 '이름'과 '성적'은 무엇인가?

    π이름,성적(σ과목번호='C413' (학생 ⋈N 등록))

    학생과 등록을 자연결합한 후, C413 과목코드를 선택한다. 그 후, 이름 성적을 프로젝트.

  3. '파일구조' 과목을 가르치는 '담당교수'를 검색하라.
    π담당교수(σ과목이름 = '파일구조'(과목))

    과목 릴레이션에서 과목이름이 파일구조인 것을 검색하고 거기서 담당교수를 프로젝트.

  4. 모든 과목에 수강한 '학번'과 '이름'을 검색하라
    π학번,이름((π학번,과목번호(등록) ÷ π과목번호(과목)) ⋈N학생)

    (π학번,과목번호(등록) ÷ π과목번호(과목) 이 디비전 계산을 통해 모든 과목을 듣는학번이 구해짐. 이는 과목번호를 하나씩 탐색하면서 남는 학번만 남기기 떄문. 그 후, 학번과 학생을 조인하고 이름과 학번을 프로젝트.

  5. '학번'이 600, '이름'이 '김영호', '학년'이 4, '학과'가 컴퓨터인 학생을 삽입하라
    학생 ∪ { <600, '김영호', 4, ‘컴퓨터’> }

    학생 릴레이션에 튜플을 만들고 튜플을 가진 집합을 만든다. 그 후, 학생릴레이션과 합집합 하면 추가.

  6. '데이터베이스'과목을 삭제하라
    과목 - (σ과목이름='데이타베이스'(과목))

    과목이름에서 '데이터베이스'를 가진 항목을 찾고, 과목 릴레이션에서 제거함.

0개의 댓글