4장: 관계 대수 2

부가 연산 (additional operations)


연산 예시

c속성의 합은 28이다.

B속성으로 그룹핑 -> 알파,베타로 그룹핑 & C속성으로 평균 구하기
-> 알파의 평균은 7, 베타의 평균은 (8+3+10/3=7)

branch_name으로 그룹핑 -> Perryridge, Brighton, Redwood로 그룹핑 & balance속성 합 구하기
-> Perryridege지점의 합은 1300, Brighton은 1500, Redwood는700


변경 연산 (modification operations)

Deletion

원래 릴레이션(r)에서 E에 해당하는 튜플을 빼고 남은 릴레이션을 새로운 릴레이션으로 하시오.


Deletion Examples

문제: Perryridge에 대한 정보를 데이터베이스에서 삭제하시오.

account릴레이션에서 Selection한 것(branch_name이 “Perryridge”인 튜플)을 빼고 남은 릴레이션을 새로운 릴레이션으로 하시오.


Insertion

원래 릴레이션(r)에서 E에 해당하는 튜플을 추가한 릴레이션을 새로운 릴레이션으로 하시오.


Insertion Examples

  • account: 거래 정보
    customer: 고객 정보
    depositor: 예금자 정보 (account_number:계좌번호) // 계좌는 두 개 이상 만들 수 있음

문제: Perrybridge지점에서 계좌번호가 A-973인 고객인 smith가 $1200를 썼다는 사실을 데이터베이스에 추가하시오.

account릴레이션에서 (“A-973”,”Perryridge”,1200)튜플을 추가한 릴레이션을 새로운 릴레이션으로 하시오.
depositor릴레이션에서 (“Smith”,”A-973”)튜플을 추가한 릴레이션을 새로운 릴레이션으로 하시오.


Updating

원래 릴레이션(r)에서 Fi(i번째 attribute)가 업데이트되지 않으면 그대로 두고 그렇지 않으면 속성값을 변경한 릴레이션을 새로운 릴레이션으로 하시오.


Updating Examples

문제: 모든 balance에 대해 이자를 5% 주시오.

튜플들의 account_number와 brance_name 속성은 그대로 두고 balance속성에만 1.05를 곱한 것을 새로운 릴레이션으로 하시오.


질의를 관계대수로 표현하기

문제: 103번 보트를 예약받은 항해사의 이름을 구하시오.

Reserves와 Sailors를 곱집합한 뒤 reserves.sid와 sailors.sid가 같고 bid가 103인 튜플을 선택한 뒤 sname속성의 값을 구하기

Reserves와 Sailors를 natural join한 뒤 bid가 103인 튜플을 선택하고 sname속성의 값을 구하기

Reserves릴레이션에서 bid가 103인 튜플을 고르고 Sailors를 natural join한 뒤 sname속성의 값을 구하기 -> 연산의 시간이 반으로 줄어들음


문제: 빨간색 보트를 예약한 항해사의 이름을 구하시오.

Boats릴레이션에서 color가 ‘red’인 튜플을 선택한 뒤 Reserves릴레이션과 natural join을 한다.

이후 sailors릴레이션과 natural join을 한다. 그렇게 나온 테이블에서 sname의 속성 값을 구한다.


<효율적인 솔루션>

Boats릴레이션에서 color가 ‘red’인 튜플을 선택한 뒤 bid속성만 선택하고 Reserves릴레이션과 natural join을 한다. 이후 sid속성만 선택한 뒤 sailors릴레이션과 natural join을 한다. 그렇게 나온 테이블에서 sname의 속성 값을 구한다.

-> selection으로 필요한 튜플만 선택하고 projection으로 필요한 속성만 선택한 뒤 natural join을 하면 연산량이 훨씬 줄어든다.


문제: 빨간색 또는 초록색 보트를 예약한 항해사의 이름을 구하시오.

Boats릴레이션에서 color가 ‘red’이거나 ‘green’인 튜플을 선택한 뒤 Tempboats라는 이름으로 테이블을 만든다. 이후 Reserves릴레이션과 natural join -> sailors릴레이션과 natural join을 한다. 그렇게 나온 테이블에서 sname의 속성 값을 구한다.

<Union연산을 이용해서 구하기>

Boats릴레이션에서 color가 ‘red’인 튜플을 선택하고 Reserves릴레이션과 natural join한 뒤 sid속성으로만 이루어진  Tempred라는 테이블을 만든다.

Boats릴레이션에서 color가 ‘green’인 튜플을 선택한 뒤 Reserves릴레이션과 natural join한 뒤 sid속성으로만 이루어진  Tempgreen이라는 테이블을 만든다.

Tempred와 Tempgreen테이블을 합친 뒤 sailors릴레이션과 natural join을 한다. 그렇게 나온 테이블에서 sname의 속성 값을 구한다.


문제: 빨간색 보트와 초록색 보트를 예약한 항해사의 이름을 구하시오.

<주의>

Boats릴레이션에 red이면서 green인 튜플은 없기 때문에 결과가 나오지 않는다.


<Intersection 연산을 이용해서 구하기>

Boats릴레이션에서 color가 ‘red’인 튜플을 선택하고 Reserves릴레이션과 natural join한 뒤 sid속성으로만 이루어진  Tempred라는 테이블을 만든다.

Boats릴레이션에서 color가 ‘green’인 튜플을 선택한 뒤 Reserves릴레이션과 natural join한 뒤 sid속성으로만 이루어진  Tempgreen이라는 테이블을 만든다.

Tempred와 Tempgreen테이블을 교집합한 뒤 sailors릴레이션과 natural join을 한다. 그렇게 나온 테이블에서 sname의 속성 값을 구한다.

문제: 모든 보트를 예약한 항해사의 이름을 구하시오.

모든 속성을 만족하는 것을 찾을 때는 나눗셈 연산을 이용하면 된다.

나눗셈 연산은 sid와 bid가 있는 테이블에 bid만 있는 테이블을 나누면 모든 bid를 만족하는 sid만 남는다.

같은 이치로 sid,bid,day가 있는 테이블에 bid만 있는 테이블을 나누면 모든 bid를 만족하는 sid,day가 남는다.

(Sailors릴레이션이랑 natural join하기 전에) 우리는 모든 bid속성을 만족하는 sid만 알고 싶다. 따라서 Reseves릴레이션에서 sid와 bid속성만 남기고 Boats릴레이션은 bid속성만 남긴 뒤 나눈다. 그러면 sid(22,22,22,22)만 남을텐데 이것을 Tempsids테이블이라고 한다. 마지막으로 sailors릴레이션이랑 natural join을 한 뒤 sname속성 값을 알아내면 된다.


문제: Interlake라고 불리는 모든 보트를 예약한 항해사의 이름을 구하시오.  

앞의 문제와 솔루션은 거의 같다. 다만 Boats릴레이션에서 bid속성만 남기기 전에 Interlake인 튜플들만 남기고 진행한다.

Leave a Reply

Your email address will not be published. Required fields are marked *