Procedural dml
Non-procedural dml
가운데에 and 기호가 있다. A=B 가 참이고 D>5 인 튜플을 찾는 것이다.
선택되는 튜플은 1번, 4번 튜플이 될 것이다!
정의를 다시해보면 다음과 같다.
r에 속한 원소 튜플 t에 대해 조건 p를 만족하는 튜플을 선택하는 것이다.
r 에서 뽑아내려고 하는 어트리뷰트의 리스트를 쓰고 뽑는다.
A,C만 뽑으면 된다. 단 뽑은 결과가 중복 튜플이라면 버린다. 위의 연산에서도 (알파, 1)이 중복되어 뽑히므로 하나만 선택했다. 중복된 튜플이 나오는 건 project 만이므로 잘 기억해두자.
두 연산을 모두 포함할 수 있다.
이를 Composition of Operations라 한다.
다음을 간추리면 해리슨 시티에 거주하는 고객의 이름만 찾아라! 가 된다.
합집합을 뜻한다!
r에 속해있는 튜플이거나 s에 속해있는 튜플이면 모두 선택한다.
역시나 중복 튜플은 허용하지 않는다. 또한 합하려면
depositor 에 어트리뷰트와 borrower 의 어트리뷰트 모두 달라(도메인도 당연히 달랐다) 무작정 합할 수 없다. 그러나 customer_name 은 공통되므로 project 연산을 각각 적용시키면 합할 수는 있다. 위 식은 먼저 project 한 다음 합했으므로 연산 가능!
조건
두 테이블 간 어트리뷰트(이름, 개수)와 도메인이 같아야 한다.
예금 고객에서 대출 고객을 뺀, 예금만 가지고 있는 고객을 뽑는 연산.
다음과 같이 곱해주듯이 (2 X 4) 연산해주는 것이 Catesian-Product 이다.
🤔 공통된 이름의 어트리뷰트가 포함된 경우에는 어떻게 할까?
한 테이블에 같은 이름의 어트리뷰트가 있으면 안된다 > r.B/s.B으로 구분
공식에 따라 A + B개 어트리뷰트 / A * B개 튜플 수 유지
r과 s의 각 스키마 = 어트리뷰트의 집합 = r의 어트리뷰트 집합 , s의 어트리뷰트의 집합은 서로 교집합이 없다고 가정.
교집합이 있다면 리네이밍 필요!
d 테이블에 account 을 cartesian product 해준다. (자기 자신을 곱하기 위해 이름을 바꿔줬다.) > account.account_number, account.balance, d.account_number, d.balance 가 된다. / 튜플은 7 X 7 = 49개가 된다.
select로 account.balance < d.balance 인 튜플을 골라준다. 예컨대 account가 500일 경우 700, 900, 750, 700이 살아남는다. 또다시 account 가 700일 경우 900, 750이 살아남는다. 900의 경우는 살아남을 수 없다.
project 로 account.balance 만 뽑으면 정리하며 중복 제거가 가능하다. 따라서 900만 뺀 결과가 남는다. 만약 900만 남기고 싶다면 원래 테이블의 balance 집합에서 위 전체 연산을 빼준다.
350만 빼고 싶다면 비교 연산을 뒤집자!
스키마(=어트리뷰트 집합) 다이어그램
Perryridge 지점의 대출 계좌를 가지고 있는 모든 고객의 이름을 찾으시오
branch_name, loan_nubmer, customer_name 이 필요하다.
loan 테이블에서 L-15,16 을 찾고 borrower 에서 customer_name 과 연결시킨다.
borrower(customer_name, loan_number)
loan(loan_number, branch_name, amount)
borrower X loan (Cartesian 연산, 총 5개 어트리뷰트)
Perryridge 를 뽑으면 (select 연산) 16개가 나온다. > 사실과 달라지는 문제
borrower.loan_number = loan.loan_number 을 확인하면 사실과 같은 튜플이 추출된다. (select 연산)
이름만 추출, customer_name (project 연산)
의 끝에 project customer_name 을 추가해준다!
++
56 > 16개로 cartesian 의 결과가 줄어들었다. 당연히 2번 쿼리가 더 좋은 쿼리다. (비교 횟수와 메모리 측면에서) 이를 최적화Optimization이라고 한다.