본문 바로가기

데이터베이스 Database

Chapter 5 관계 대수와 관계 해석

릴레이션 조작을 위한 연산의 종류

  • 관계 대수(Relational Algebra): 절차 언어(Procedural language)
    • 릴레이션 = Set of tuples (릴레이션에 대한 연산의 결과는 릴레이션)
    • 연산자의 종류
      • 일반 집합 연산자(Set operator): 합집합(union, ∪), 교집합(intersect, ∩), 차집합(difference, -), 카티션 프로덕트(cartesian product, ×)
      • 순수 관계 연산자(Relational operator): 실렉트(select, 소문자 시그마), 프로젝트(project, 대문자 파이), 조인(join), 디비전(division, ÷)

※ ∨(or), ∧(and)

 

(수식과 예는 강의 자료 참고)

실렉트(σ) 연산: 수평적 부분집합(Horizontal subset)

프로젝트(Π) 연산: 수직적 부분집합(Vertical Subset)

조인(Join, ⋈):

  • 세타 조인(theta join): 비교연산자(=, >, < 등)를 이용하여 표현된 조인
  • 동일 조인(Equi-join): 비교연산자가 '='인 조인
  • 자연 조인(Natural join): 양쪽 릴레이션에서 중복된 속성에 대해 동일 조인을 수행하고, 조인 결과에서 중복된 속성을 한번만 나타낸 조인, 일반적으로 '조인'이라고 하면 '자연 조인'을 의미함

디비전(Division, ÷)

디비전 연산의 예

개명 연산(Rename, ρ): 강의 자료 참고

 

기본 연산과 복합 연산

  • 기본 연산(Primitive operation): 합집합, 차집합, 카티션 프로덕트, 실렉트, 프로젝트
  • 복합 연산(Composite operation): 조인, 교집합, 디비전
    • 복합 연산은 기본 연산으로 표현 가능(강의 자료 참고)

세미 조인: 왼편 릴레이션의 투플들 중에서 오른편 릴레이션과의 자연조인에 참여하는 투플들만 추려내는 것

  • 자연 조인과 세미 조인의 비교(강의 자료 참고)

외부 조인(+): 조인 과정에서 대응되는 투플이 없는 투플들도 조인 결과에 포함시키는 조인

  • 외부 조인으로 추가되는 투플들의 속성 값은 null을 가짐

외부 합집합(Outer-Union, U+): 완전하게 합병가능하지 않은 두 릴레이션을 합집합으로 만드는 것

  • 합집합은 합병 가능한 두 릴레이션에 적용

집계 연산

  • 집계 함수: SUM, AVG, MAX, MIN, COUNT
  • 그루핑 함수: GROUP

관계 대수를 이용한 질의문 표현 예: (강의 자료 참고)

 

  • 관계 해석(Relational Calculus): 비절차 언어(Non-procedural language)
    • 투플 관계 해석(Tuple relation calculus)라고도 함
    • 투플 단위의 연산을 나타내는 관계해석식으로 질의문을 표현
    • 기능적으로는 관계 대수와 동등
    • 비절차적 특성 ↔ 관계대수는 절차적

관계 해석식으로 나타낸 질의문의 예

  • 과목 'C413'에서 성적이 'A'인 학생의 학번을 모두 검색하여라
    • { e.sno|ENROL(e) ∧ e.cno = 'C413' ∧ e.grade = 'A' }
  • '컴퓨터'과 과목을 적어도 한 과목 등록한 학생의 이름을 모두 검색하여라
    • { s.sname|STUDENT(s) ∧ (∃e)ENROL(e) ∧ s.sno = e.sno ∧ (∃c)COURSE(c) ∧ e.cno = c.cno ∧ c.dept = '컴퓨터' }

도메인 관계 해석(Domain Relation Calculus)

  • 도메인 해석(Domain Calculus)이라고도 함
  • 질의문을 도메인 해석식으로 나타냄
  • 도메인 변수를 사용하여 해석식을 표현
    • 관계 해석 → 투플 변수 사용

도메인 관계 해석식을 이용한 질의문 표현

  • 과목 'C413'에서 성적이 'A'인 학생의 학번을 모두 검색하여라
    • { xsno|(∃xcno)(∃xgrade)(ENROL(xsno,xcno,xgrade,xmidterm,xfinal) ∧ xdept='컴퓨터' ∧ xgrade='A') }
  • '컴퓨터'과 과목을 적어도 한 과목 등록한 학생의 이름을 모두 검색하여라
    • { xsname|(∃xsname)(STUDENT(xsno,xsname,xyear,xdept) ∧ (∃xcno)(∃xxdept)(COURSE(xcno,xcname,xcredit,xxdept,xprname) ∧ (∃xxsno)(∃xxcno)(ENROL(xxsno,xxcno,xgrade,xmidterm,xfinal)∧xxdept='컴퓨터' ∧ xcno=xxcno∧xsno=xxsno))) }