관계형 데이터베이스에서 사용되는 언어는 두가지 종류가 있다.
ex) and, or, ....
ex) selection, projection, ....
오늘은 알아볼 것은 관계대수이다. 관계대수는 sql의 근간이 되는 언어로, 알아놓으면 나중에 SQL을 사용하기 훨씬 쉬워진다.
이제 관계 대수를 이용해서 DB에서 원하는 데이터만 쏙쏙 뽑아낼 것이다.
뭐가 많다. 하나씩 알아보자.
셀렉션 조건(프레디키트)를 만족하는 튜플을 뽑아낸다.
셀렉션 조건? (=, >=, <=, <>(같지 않다), AND, OR, NOT, ...)
한 릴레이션의 애트리뷰트의 부분집합을 구함.
R∪S일 때, R또는 S에 속한 튜플들의 릴레이션
R∩S일 때, R과 S 모두에 속한 튜플들의 릴레이션
R - S일 때, R에는 속하지만 S엔 속하지 않는 튜플들의 릴레이션
※ 두 릴레이션이 합집합 호환일 때만 집합연산이 가능하다.
합집합 호환 : 두 릴레이션의 애트리뷰트 수와 각각의 도메인이 같아야함.
예시처럼 EMPLOYEE × DEPARTMENT를 하게되면 모든 가능한 조합이 추출된다.
하지만 결과의 크기가 매우크고, 실제 필요한건 일부분인 경우가 대부분이므로 잘 사용되지 않는다.
예시처럼, AB(A#, B#) ÷ C(b#)를 하게되면,
C의 모든 튜플값과 쌍을 이룰수 있는 릴레이션 AB(A#)의 값이 추출된다.
기본적으로 조인연산자는 두 릴레이션으로부터 연관된 튜플들을 결합하는 연산자이다.
릴레이션 R(A1,A2,...,An)과 릴레이션 S(B1,B2,...,Bm)이 있을 때, 세타조인의 형태는
R.Ai □ S.Bj의 형태이다. ( □은 =, <>, <=, <, >=, >중 하나 )
세타조인중 연산자가 = 인 조인을 동등조인이라고 한다.
Ex) EMPLOYEE 릴레이션과 DEPARTMENT 릴레이션을 동등조인하라.
형태는 R*S로, 가장 많이 사용된다. 위에 동등조인과 동일한데, 결과 릴레이션에서 공통된 릴레이션을 제외한다. 위 동등조인을 보면 DNO, DEPTNO가 중복되는데 둘 중 하나를 없애는 것이다.
조인연산을 확장한 것으로, 왼쪽 외부조인(⟕), 오른쪽 외부조인(⟖), 완전 외부조인이 있다.
두 릴레이션을 결합하면서 대응되지 않는 튜플을 갖지 않은 튜플, 조인 애트리뷰트에 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))))