절차적 방식과 비절차적 방식이 있음
사용자 입장에서는 비절차적 방식이 더 쉬움
But, 컴퓨터는 비절차적 방식을 그냥 주면 실행할 수 없음.
따라서, 절차적 언어로 변환을 해줘야함.
내부에서 비절차적 질의를 변환하는 작업을 관계형 DB엔진이 수행함.
연산 : 시스템 입장
데이터 언어 : 사용자 입장
관계 대수
관계 해석과 관계 대수는 표현과 기능 면에서 동등
릴레이션(튜플의 집합)을 처리하기 위한 연산의 집합
일반 집합 연산자
합집합(UNION, ∪)
교집합(INTERSECT, ∩)
차집합(DIFFERENCE, -)
카티션 프로덕트(CARTESIAN PRODUCT, ×)
: 카티션 프로덕트는 두 릴레이션의 튜플들을 곱해서 안의 값들을 모두 하나의 집합으로 만드는 것
순수 관계 연산자
실렉트(SELECT, σ)
프로젝트(PROJECT, π)
조인(JOIN, ⋈)
디비전(DIVISION, ÷)
폐쇄성질 : 피연산자와 연산결과가 모두 릴레이션이다. 따라서 중첩된 수식의 표현이 가능하다.
합병가능(union-compatible)한 릴레이션
∪, ∩, - 연산의 피연산자들은 차수가 같아야 함
대응 애트리뷰트 쌍 별로 도메인이 같아야 함 -> 도메인이 서로 다르면 합병이 불가능함 (이름 학번 학과)
EX)
학생(학번,이름,학년,학과)에서 π이름,학과(학생) -> 학생 릴레이션에서 이름과 학과 어트리뷰트를 모두 보여줌
Relation 이상현상
이상현상을 막기위해서 relation을 분리하고 표현함
검색연산을 위해서는 결합을 하고 찾아야함
무작정 만들면 학생 1개의 튜플당 등록의 튜플갯수만큼 만들어지는데 이중에 대부분은 의미없는 튜플이 되어버린다.
파이션 프로덕트 한다음에 (학생 * 등록) 학생의 학번과 등록의 학번이 동일한것만 의미가 있다. 따라서 의미가 있는것들끼리 추출해서 만만들어낸 것 바로 동일조인이다.
에트리뷰트의 이름이 달라도 의미가 같으면 세타조인 가능함
R÷S={ t | t∈πD(R) ∧ t · s∈R for all s∈S }
학번으로 프로젝션하고 S (과목번호)와 파티션을 함
그 후 SC와 비교를 하여 필요없는것는 것은 다 지움
이런식으로 모든 과목을 다 듣는 학생을 찾을 수 있음
ρS(B1,B2, … ,Bm )(E)
관계 대수식 E의 결과 릴레이션의 이름을 S로 지정하고
애트리뷰트 이름은 각각 B1,B2, … ,Bm 으로 지정
ρ(B1,B2, … ,Bm )(R)
릴레이션 R의 애트리뷰트 이름을 각각 B1,B2, … ,Bm 으로변경
다른 연산으로 대체할 수 없는 하나의 논리적 기능을 수행하는 연산
몇 개의 기본 연산으로 대체할 수 있는 연산
교집합(∩), 조인(⋈), 디비전(÷)
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에서 존재하지않는것을 빼면 존재하는것만 남음
각 사이트가 스키마 정보는 서로 파악하고 있음
S가 R정보를 다운로드 받아야하는데 그 양을 줄이기 위함임
그래서 미리 알고있는 중복되는 어트리뷰트 정보를 S가 R로 보냄 혹은 반대로 보냄
left outerjoin
- 왼쪽에 있는 R에서 조인에 참여하지 않는 것들을 포함(S는 미포함
right outerjoin
- 오른쪽에 있는 S에서 조인에 참여하지 않는 것들을 포함(R은 미포함)
일반 형식 : GAFB(E)
E : 관계 대수식
F : 집계 함수 ( SUM, AVG, MAX, MIN, COUNT) > 일반적인 5개
B : 집계 함수의 적용 대상 애트리뷰트
G : 그룹 함수 GROUP
A : 그룹 함수가 적용할 애트리뷰트
GROUP[과목번호]AVG성적
실행 순서는 GROUP, AVG 순서임
=>각각의 그룹별로 통계를 구하기 위해 집계연산을 함
모든 학생의 '이름'과 '학과'를 검색하라.
π 이름, 학과 (학생)
'과목번호'가 C413인 과목에 등록한 학생의 '이름'과 '성적'은 무엇인가?
π이름,성적(σ과목번호='C413' (학생 ⋈N 등록))
학생과 등록을 자연결합한 후, C413 과목코드를 선택한다. 그 후, 이름 성적을 프로젝트.
'파일구조' 과목을 가르치는 '담당교수'를 검색하라.
π담당교수(σ과목이름 = '파일구조'(과목))
과목 릴레이션에서 과목이름이 파일구조인 것을 검색하고 거기서 담당교수를 프로젝트.
모든 과목에 수강한 '학번'과 '이름'을 검색하라
π학번,이름((π학번,과목번호(등록) ÷ π과목번호(과목)) ⋈N학생)
(π학번,과목번호(등록) ÷ π과목번호(과목) 이 디비전 계산을 통해 모든 과목을 듣는학번이 구해짐. 이는 과목번호를 하나씩 탐색하면서 남는 학번만 남기기 떄문. 그 후, 학번과 학생을 조인하고 이름과 학번을 프로젝트.
'학번'이 600, '이름'이 '김영호', '학년'이 4, '학과'가 컴퓨터인 학생을 삽입하라
학생 ∪ { <600, '김영호', 4, ‘컴퓨터’> }
학생 릴레이션에 튜플을 만들고 튜플을 가진 집합을 만든다. 그 후, 학생릴레이션과 합집합 하면 추가.
'데이터베이스'과목을 삭제하라
과목 - (σ과목이름='데이타베이스'(과목))
과목이름에서 '데이터베이스'를 가진 항목을 찾고, 과목 릴레이션에서 제거함.