• 검색 결과가 없습니다.

exists 구조는 매개 변수 부 질의가 empty 가 아니면 참 값을 돌려준다

문서에서 집합 연산 (페이지 32-49)

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-loan

values(“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)

은행에 예금이 있거나 대출이 있는 모든 고객을 찾아라 . select customer-name

from (depositor natural full outer join borrower)

문서에서 집합 연산 (페이지 32-49)

관련 문서