[DB] #2. 관계대수

<div>elop·2022년 4월 19일
0
post-custom-banner

관계형 데이터베이스에서 사용되는 언어는 두가지 종류가 있다.

1. 관계 해석

  • 원하는 데이터만 명시하고 질의를 어떻게 수행할 것인가는 명시하지 않는 선언적 언어.

ex) and, or, ....

2. 관계 대수

  • 어떻게 질의할 것인가를 수행하는 절차적 언어
  • SQL의 기초가됨

ex) selection, projection, ....


오늘은 알아볼 것은 관계대수이다. 관계대수는 sql의 근간이 되는 언어로, 알아놓으면 나중에 SQL을 사용하기 훨씬 쉬워진다.
이제 관계 대수를 이용해서 DB에서 원하는 데이터만 쏙쏙 뽑아낼 것이다.


뭐가 많다. 하나씩 알아보자.

1. 셀렉션(σ)

셀렉션 조건(프레디키트)를 만족하는 튜플을 뽑아낸다.
셀렉션 조건? (=, >=, <=, <>(같지 않다), AND, OR, NOT, ...)

2. 프로젝션(π)

한 릴레이션의 애트리뷰트의 부분집합을 구함.

3. 합집합(∪)

R∪S일 때, R또는 S에 속한 튜플들의 릴레이션

4. 교집합(∩)

R∩S일 때, R과 S 모두에 속한 튜플들의 릴레이션

5. 차집합 (-)

R - S일 때, R에는 속하지만 S엔 속하지 않는 튜플들의 릴레이션


※ 두 릴레이션이 합집합 호환일 때만 집합연산이 가능하다.

합집합 호환 : 두 릴레이션의 애트리뷰트 수와 각각의 도메인이 같아야함.


5. 카티션곱(×)

예시처럼 EMPLOYEE × DEPARTMENT를 하게되면 모든 가능한 조합이 추출된다.
하지만 결과의 크기가 매우크고, 실제 필요한건 일부분인 경우가 대부분이므로 잘 사용되지 않는다.

6. 디비전

예시처럼, AB(A#, B#) ÷ C(b#)를 하게되면,
C의 모든 튜플값과 쌍을 이룰수 있는 릴레이션 AB(A#)의 값이 추출된다.

7. 세타조인

기본적으로 조인연산자는 두 릴레이션으로부터 연관된 튜플들을 결합하는 연산자이다.
릴레이션 R(A1,A2,...,An)과 릴레이션 S(B1,B2,...,Bm)이 있을 때, 세타조인의 형태는
R.Ai □ S.Bj의 형태이다. ( □은 =, <>, <=, <, >=, >중 하나 )

8. 동등조인

세타조인중 연산자가 = 인 조인을 동등조인이라고 한다.

Ex) EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 동등조인하라.

9. 자연조인(★★★)

형태는 R*S로, 가장 많이 사용된다. 위에 동등조인과 동일한데, 결과 릴레이션에서 공통된 릴레이션을 제외한다. 위 동등조인을 보면 DNO, DEPTNO가 중복되는데 둘 중 하나를 없애는 것이다.

10. 외부조인

조인연산을 확장한 것으로, 왼쪽 외부조인(⟕), 오른쪽 외부조인(⟖), 완전 외부조인이 있다.
두 릴레이션을 결합하면서 대응되지 않는 튜플을 갖지 않은 튜플, 조인 애트리뷰트에 null값을 갖는 튜플도 결과에 포함시킨다. 그림으로 보면 이해가 빠르다.


마지막으로 예제를 풀어보며 연습해보자.

Q. 아래와 같은 관계데이터베이스 스키마를 보고 각 질의를 관계대수식으로 표현하라.

CUSTOMER(CUSTOMER_ID, NAME, ADDRESS, PHONE)
VIDEO(VIDEO_ID, TITLE, GENRE)
RESERVED(CUSTOMER_ID, VIDEO_ID, DATE)


a. 제목이'반지의제왕'인 비디오테이프의 장르를 검색하라.

π[GENRE](σ TITLE='반지의제왕')(VIDEO)

b. 예약된 비디오테이프의 ID를 검색하라.

π[VIDEO_ID](RESERVED)

c. 예약되지 않은 비디오테이프 의ID를 검색하라.

π[VIDEO_ID](VIDEO)-π[VIDEO_ID](RESERVED)

d. 예약된 모든 비디오테이프의 제목을 검색하라.

π [TITLE](VIDEO (* VIDOEID=VIDEO_ID) RESERVED)

e. 비디오테이프를 예약한 고객의 이름을 검색하라.

π[NAME](CUSTOMER * RESERVED)

f. 장르가 ‘액션'인 비디오테이프를 예약한 고객의 주소를 검색하라.

π[ADDRESS](CUSTOMER (RESERVED (σ GENRE='액션'(VIDEO)))

g. 장르가 ‘다큐멘터리’인 비디오테이프를 모두 예약한 고객의 이름을 검색하라.

π[NAME](CUSTOMER * (π[CUSOMER_ID,VIDEO_ID](RESERVED) / π[VIDEO_ID](σ GENRE='다큐멘터리'(VIDEO))))

profile
기록장
post-custom-banner

0개의 댓글