exists r r
not exists r r =
예제 질의
Brooklyn 에 위치한 모든 지점에 예금이 있는 고객을 찾아라 . select distinct S.customer-name
from depositor as S where not exists (
(select branch-name from branch
where branch-city = “Brooklyn”) except
(select R.branch-name
from depositor as T, account as R
where T.account-number = R.account-number and S.customer-name = T.customer-name))
X - Y =
X Y 임을 유의하라중복 튜플의 부재 검사
unique 구조는 부 질의가 그 결과내에 중복 튜플을 가지고 있는지 여 부를 검사한다 .
Perryridge 지점에 하나의 계좌만 가진 모든 고객을 찾아라 . select T.customer-name
from depositor as T where unique (
select R.customer-name
from account, depositor as R
where T.customer-name = R.customer-name and
R.account-number = account.account-number and account.branch-name = “Perryridge”)
예제 질의
Perryridge 지점에 적어도 두 개의 계좌를 가진 모든 고객을 찾아라 . select distinct T.customer-name
from depositor T where not unique (
select R.customer-name
from account, depositor as R
where T.customer-name = R.customer-name and
R.account-number = account.account-number and account.branch-name = “Perryridge”)
유도 릴레이션
평균 예금 잔고가 1,200 불을 초과하는 지점들의 평균 예금 잔고를 찾아라 .
select branch-name, avg-balance
from (select branch-name, avg(balance) from account
group by branch-name)
as result (branch-name, avg-balance) where avg-balance > 1200
from 절 내에서 임시 릴레이션 result 를 계산하고 애트리뷰트가 where 절에서 직접 사용될 수 있으므로 , having 절을 사용할 필요 가 없음에 유의하라 .
뷰
어떤 사용자의 뷰로부터 어떤 데이터를 숨기는 방법을 제공한다 . 뷰 를 생성하려면 다음과 같은 명령을 사용한다 .
create view v as < 질의 표현식 >
여기서 :
- < 질의 표현식 > 은 적법한 표현식이다 . - 뷰명은 v 로 표현된다 .
예제 질의
지점과 그들의 고객으로 구성된 뷰 create view all-customer as
(select branch-name, customer-name from depositor, account
where depositor.account-number = account.account-number) union
(select branch-name, customer-name from borrower, loan
where borrower.loan-number = loan.loan-number)
Perryridge 지점의 모든 고객을 찾아라 . select customer-name
from all-customer
where branch-name = “Perryridge”
데이터베이스의 수정 - 삭제
Perryridge 지점의 모든 예금 레코드를 삭제하라 . delete from account
where branch-name = “Perryridge”
Needham 에 위치한 각 지점의 모든 예금 계좌를 삭제하라 . delete from account
where branch-name in (select branch-name from branch
where branch-city = “Needham”) delete from depositor
where account-number in (select account-number from branch, account
where branch-city = “Needham”
and branch.branch-name = account.branch-name)
예제 질의
은행의 평균에 미달하는 잔고를 가진 모든 예금 계좌 레코드를 삭제 하라 .
delete from account
where balance < (select avg (balance) from account)
- 문제점 : deposit 에서 튜플들을 삭제하므로 평균 잔고가 변한다 . - SQL 에서 사용되는 해결책 :
1. 먼저 , avg balance 를 계산하고 삭제할 모든 튜플을 찾는다 . 2. 다음 , 위에서 찾은 모든 튜플을 삭제한다 (avg 를 다시 계산하
거나 튜플을 재 검사하지 않고 ).
데이터베이스의 수정 - 삽입
account 에 새로운 튜플을 삽입하라 . insert into account
values(“Perryridge”, A-9732, 1200) 위와 동등한 표현은 아래와 같다 .
insert into account (branch-name, balance, account-number) values(“Perryridge”, 1200, A-9732)
account 에 balance 값이 널로 지정된 튜플을 삽입하라 . insert into account
values (“Perryridge”, A-777, null)
데이터베이스의 수정 - 삽입
Perryridge 지점의 모든 대출 고객에게 200 불의 저축 예 금 계좌를 제공한다 . 새로운 저축 예금의 계좌 번호는 대 출 번호로 한다 .
insert into account
select branch-name, loan-number, 200 from loan
where branch-name = “Perryridge”
insert into depositor
select customer-name, loan-number from loan, borrower
where branch-name = “Perryridge”
and loan.account-number = borrower.account-number
데이터베이스의 수정 - 갱신
10,000 불을 초과하는 모든 예금 계좌에는 6% 를 다른 계좌에는 5%
의 이자를 지급하라 .
- 두 개의 update 문으로 작성하라 . update account
set balance = balance * 1.06 where balance > 10000
update account
set balance = balance * 1.05 where balance 10000
- 순서가 중요하다 .
- case 문장을 사용하면 더 좋다 ( 연습문제 4.11).
뷰의 갱신
amount 애트리뷰트를 제외한 loan 릴레이션내의 모든 대출 데이터의 뷰를 생성하라 .
create view branch-loan as
select branch-name, loan-number from loan
branch-loan 에 새로운 튜플을 삽입하라 .
insert into branch-loanvalues(“Perryridge”, “L-307”)
이 삽입은 loan 릴레이션에 다음과 같은 튜플의 삽입으로 표현되어야 한다 . (“Perryridge”, “L-307”, null)
보다 복잡한 뷰에의 갱신은 변환하기가 어렵거나 불가능해 허용되지 않는다
.
죠인 릴레이션
죠인 연산은 두 릴레이션을 취해 또 다른 릴레이션을 결과로 돌려준다 .
이들 부가적인 연산은 일반적으로 from 절 내의 부 질의 표현식으로 사용된 다 .
죠인 조건 - 두 릴레이션내의 어떤 튜플들이 부합하고 죠인 결과에 어떤 애 트리뷰트가 나타날지를 정한다 .
죠인 유형 - 다른 릴레이션의 어떤 튜플과 부합하지 않는 튜플들을 어떻게 취급할 것인가 ( 죠인 조건에 근거해 ) 를 정한다 .
<
죠인 유형 죠인 조건
inner join left outer join right outer join
natrual on 술어>
using(A , A , . . . , A)
죠인 릴레이션 - 예제 데이터 집합
릴레이션 loan
릴레이션 borrower
branch-name loan-number amount Downtown
Redwood Perryridge
L-170 L-230 L-260
3000 4000 1700
customer-name Jones
Smith Hayes
L-170 L-230 L-155
loan-number
죠인 릴레이션 - 예제
loan inner join borrower on
loan.loan-number = borrower.loan-number
loan left outer join borrower on
loan.loan-number = borrower.loan-number
branch-name loan-number amount customer-name loan-number Downtown
Redwood
L-170 L-230
3000 4000
Jones Smith
L-170 L-230
branch-name loan-number amount customer-name loan-number Downtown
Redwood
L-170 L-230
3000 4000
Jones Smith
L-170 L-230
죠인 릴레이션 - 예제
loan natural inner join borrower
loan natural right outer join borrower
branch-name loan-number amount customer-name Downtown
Redwood
L-170 L-230
3000 4000
Jones Smith
branch-name loan-number amount customer-name Downtown
Redwood null
L-170 L-230 L-155
3000 4000 null
Jones Smith Hayes
죠인 릴레이션 - 예제
loan full outer join borrower using(loan-number)