• 검색 결과가 없습니다.

집합 연산

N/A
N/A
Protected

Academic year: 2023

Share "집합 연산"

Copied!
60
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

제 4 장 SQL

기본 구조

집합 연산

집성 함수

널 값

중첩 부 질의

유도 릴레이션

데이터베이스의 수정

죠인 릴레이션

데이터 정의어

내포 SQL

(2)

기본 구조

SQL 은 집합과 수정 및 강화된 관계형 연산에 기초를 두고 있다 .

전형적인 SQL 질의는 다음과 같은 형식을 갖는다 . select A1, A2, , An

from r1, r2, , rm where P

- Ai 는 애트리뷰트이다 . - ri 는 릴레이션이다 . - P 는 술어이다 .

이 질의는 다음 관계형 대수 표현식과 동등하다

A1, A2, , An (P(r1  r2    rm))

(3)

select 절

select 절은 관계형 대수의 추출 연산에 대응한다 . 질의의 결과로 바 라는 애트리뷰트를 나열하는데 사용한다 .

loan 릴레이션내의 모든 지점명을 찾아라 . select branch-name

from loan

순수 관계형 대수 구문에서는 이 질의는 다음과 같다 .

branch-name (loan)

select 절의 * 는 “모든 애트리뷰트”를 의미한다 . select *

(4)

select 절 ( 계속 )

SQL 은 질의 결과와 함께 릴레이션내의 중복을 허용한다 .

중복을 제거하려면 select 다음에 키워드 distinct 를 기입한다 . loan 릴레이션내의 모든 지점명을 찾아 중복은 제거하라 .

select distinct branch-name from loan

키워드 all 은 중복이 제거되지 않도록 한다 . select all branch-name

from loan

(5)

select 절 ( 계속 )

select 절에는 연산자 +,-,* 및 / 를 내포한 산술 표현식과 상수 또는 튜플의 애트리뷰트 상의 연산을 내포할 수 있다 .

질의 :

select branch-name, loan-number, amount* 100 from loan

위의 질의는 애트리뷰트 amount 에 100 이 곱해진 것을

제외하고는 loan 릴레이션과 같은 릴레이션을 돌려준다 .

(6)

where 절

where 절은 관계형 대수의 선택 술어에 대응한다 . from 절에 나타 나는 릴레이션의 애트리뷰트를 내포하는 술어로 구성된다 .

대출액이 1,200 불을 초과하는 perryridge 지점에서 이루어진 대출 의 대출 번호를 찾아라 .

select loan-number from loan

where branch-name = “Perryridge” and amount >1200

SQL 은 논리 연산자 and, or 및 not 을 사용한다 . SQL 은 비교 연산 자에 오퍼랜드로서 산술 표현식의 사용을 허용한다 .

(7)

where 절 ( 계속 )

SQL 에는 어떤 값보다 작거나 같고 다른 값보다 크거나 같음을 나타내는 where 절을 단순히 하기 위해

between 비교 연산자를 포함한다 .

대출액이 90,000 불에서 100,000 불 사이인 대출의 대출 번호를 찾아라 .

select loan-number from loan

where amount between 90000 and 100000

(8)

from 절

from 절은 관계형 대수의 카티전 곱 연산에 대응한다 . 표현식의 계

산에서 검색될 릴레이션들을 나열한다 .

카티전 곱 borrower  loan 을 찾아라 . select *

from borrower, loan

Perryridge 지점에 대출이 있는 모든 고객명과 대출 번호를 찾아라 . select distinct customer-name, borrower.loan-number

from borrower, loan

where borrower.loan-number = loan.loan-number and branch-name = “Perryridge”

(9)

재명명 연산

릴레이션과 애트리뷰트의 재명명을 위한 SQL 기법은 as 절로 이루어진다 .

old-name as new-name

Perryridge 지점에 대출이 있는 모든 고객명과 대출 번호를 찾아라 ; 열 이름 loan-number 를 loan-id 로 대치하라 .

select distinct customer-name, borrower.loan-number as loan-id from borrower, loan

where borrower.loan-number = loan-number and branch-name = “Perryridge”

(10)

튜플 변수

튜플 변수는 as 절의 사용을 통해 from 절에서 정의된다 .

같은 지점에 대출이 있는 모든 고객명과 대출 번호를 찾아라 . select distinct customer-name, T.loan-number

from borrower as T, loan as S

where T.loan-number = S.loan-number

Brooklyn 에 위치한 어떤 지점보다 더 많은 자산을 가진 모든 지점명 을 찾아라 .

select distinct T.branch-name from branch as T, branch as S

where T.assets > S.assets and S.branch-city=“Brooklyn”

(11)

스트링 연산

SQL 에는 문자열 비교를 위한 문자열 - 매칭 연산자를 내포한다 . 패 턴은 두 개의 특수 문자를 사용해 기술한다 .

- % 는 어떠한 부 문자열과 부합한다 . - _ 는 어떤 문자와 부합한다 .

거리명에 부 문자열 “ Main” 을 내포한 모든 고객명을 찾아라 . select customer-name

from customer

where customer-street like “%Main%’

이름 “ Main%” 와 부합하는 것

(12)

튜플 출력의 순서화

Perryridge 지점에 대출이 있는 모든 고객명을 알파벳 순서로 나열하 라 .

select distinct customer-name from borrower, loan

where borrower.loan-number = loan.loan-number and branch-name = “Perryridge”

order by customer-name

각 애트리뷰트에 대해 내림차순으로는 desc 를 오름차순으로는 asc 를 지정한다 . 오름차순이 기본 값이다 .

SQL 은 order by 요청을 받으면 정렬을 수행해야 한다 . 많은 수의 튜플을 정렬하는데 비용이 많이 들어가므로 , 필요할 때만 정렬하는 것이 바람직하다 .

(13)

중복

중복이 있는 릴레이션에서 SQL 은 결과에 얼마나 많은 튜플 사본이 나타나 게 할 지를 정할 수 있다 .

관계형 대수 연산자의 어떤 다중 집합 버전 - 다중 집합 릴레이션 r

1

과 r

2

가 주어지면

1. r

1

내의 튜플 t

1

의 사본이 c

1

개 있고 t

1

이 선택 

를 만족하면 , 

(r

1

) 내에 c

1

개의 t

1

사본이 존재한다 .

2. r

1

내의 튜플 t

1

의 각 사본에 대해 , 

A

(t

1

) 의 사본이 존재한다 . 여기서

A

(t

1

) 은 단일 튜플 t

1

의 추출을 의미한다 .

3. r

1

에 튜플 t

1

이 c

1

사본이 있고 r

2

에 튜플 t

2

가 c

2

사본이 있으면 , r

1

 r

2

에 튜플 t · t 의 c  c 개의 사본이 존재한다 .

(14)

중복 ( 계속 )

스키마 (A,B) 를 가진 릴레이션 r

1

과 스키마 (C) 를 가진 릴레이션 r

2

가 다 음과 같은 다중 집합이라 하자 .

r

1

= {(1,a),(2,a)} r

2

= {(2),(3),(3)}

B

(r

1

) 은 {(a),(a)} 가 되고 , 

B

(r

1

)  r

2

는 아래와 같이 된다 . {(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}

아래와 같은 SQL 중복 시맨틱은

select A1

, A

2

, , A

n

from r1

, r

2

, , r

m where P

다음과 같은 표현식의 다중 집합 버전과 동등하다 .

A1

,

A2

, ,

An

(

P

(r

1

, r

2

, , r

m

))

(15)

집합 연산

집합 연산 union, intersect 및 except 는 릴레이션에 연산 하며 관계형 대수 연산  ,  및  에 대응한다 .

위의 각 연산은 자동으로 종복을 제거한다 . 모든 중복을 유지하려면 상응하는 다중 집합 버전 union all, intersect all 및 except all 을 사용한다 . 어떤 튜플이 r 에서 m 번 나타나고 s 에서 n 번 나타난다고 가정하면 다음과 같이 나타난다 .

- r union all s 에 m + n 번

- r intersect all s 에 min(m,n) 번

- r except all s 에 max(0, m-n) 번

(16)

집합연산 ( 계속 )

대출 , 예금 또는 모두를 가진 고객을 찾아라 . (select customer-name from depositor) union

(select customer-name from borrower)

대출과 예금을 모두 가진 고객을 찾아라 . (select customer-name from depositor) intersect

(select customer-name from borrower)

예금은 있으나 대출은 없는 고객을 찾아라 . (select customer-name from depositor) except

(select customer-name from borrower)

(17)

집성 함수

이들 함수는 릴레이션의 행의 다중 집합 값에 연 산하여 단일 값을 돌려준다 .

avg: 평균 값 min: 최소 값 max: 최대 값 sum: 총 계

count: 값의 개수

(18)

집성함수 ( 계속 )

Perryridge 지점의 평균 예금 잔고를 찾아라 . select avg(balance)

from account

where branch-name = “Perryridge”

customer 릴레이션의 튜플 수를 찾아라 . select count(*)

from customer

은행의 예금자 수를 찾아라 .

select count(distinct customer-name)

from depositor

(19)

집성함수 - Group By

각 지점의 예금자 수를 찾아라 .

select branch-name, count(distinct customer-name) from depositor, account

where depositor.account-number = account.account-number group by branch-name

유의 : 집성 함수 외부의 select 절에 있는 애트리뷰트는

group by 리스트 내에 나타나야 한다 .

(20)

집성함수 - Having 절

평균 예금 잔고가 1,200 불을 초과하는 모든 지점명을 찾 아라 .

select branch-name, avg(balance) from account

group by branch-name

having avg(balance) > 1200

유의 : having 절의 술어는 그룹이 이루어진 후에 적용

된다 .

(21)

널 값

어떤 애트리뷰트에 대해 튜플이 null 로 표시되는 널 값을 가질 수 있다 . 널은 알려지지 않은 값이나 존재하지 않는 값을 나타낸다 .

널을 내포한 산술 표현식의 결과는 널이다 .

대략 말하면 , 널을 내포한 모든 비교는 거짓을 돌려준다 . 보다 정확히 말하면 ,

- 널을 가진 어떤 비교는 unknown 을 돌려준다 .

- (true or unknown) = true, (false or unknown) = unknown

(unknown or unknown) = unknown, (true and unknown) = unknown, (false and unknown) = false, (unknown and unknown) = unknown

- where 절 술어의 결과는 unknown 으로 평가하면 거짓으로 취급된다 .

- “P is unknown” 은 술어 P 가 unknown 으로 평가하면 참으로 평가한다 .

(22)

널 값 ( 계속 )

loan 릴레이션 내의 amount 에 널 값이 있는 모든 대출 번호를 찾아라 . select loan-number

from loan

where amount is null

모든 대출액의 총계 select sum (amount) from loan

위의 문장은 널 값은 무시한다 . 널이 아닌 금액이 없으면 결과는 널이 다 .

count(*) 를 제외한 모든 집성 연산은 집성 애트리뷰트 상에 널 값을 가 진 튜플은 무시한다 .

(23)

중첩 부 질의

SQL 에서는 중첩 부 질의 기법을 제공한다 .

부 질의는 다른 질의 내에 내포되는 select-from-where 표현식이다 .

부 질의의 공통적인 사용은 집합 멤버쉽 , 집합 비교 및

집합 수의 테스트를 수행하는 것이다 .

(24)

집합 멤버쉽

F in r  t  r (t = F)

0

(5 in 4 ) = true 5

0

(5 in 4 ) = false 6

0 4

(5 not in ) = true

6

(25)

예제 질의

은행에 예금과 대출이 모두 있는 고객을 찾아라 . select distinct customer-name

from borrower

where customer-name in (select customer-name from depositor)

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

from borrower

where customer-name not in ( select customer-name from depositor)

(26)

예제 질의

Perryridge 지점에 예금과 대출을 모두 가진 고객을 찾아 라 .

select distinct customer-name from borrower, loan

where borrower.loan-number = loan.loan-number and branch-name = “Perryridge” and

(branch-name, customer-name) in

(select branch-name, customer-name from depositor, account

where depositor.account-number =

account.account-number)

(27)

집합 비교

Brooklyn 에 위치한 어떤 지점보다 더 많은 자산을 가진 모든 지점을 찾아라 .

select distinct T.branch-name from branch as T, branch as S where T.assets > S.assets and

S.branch-city = “Brooklyn”

(28)

some 절

F<comp> some r  t(t  r  [F <comp> t])

여기서 <comp> 는 다음 중 하나일 수 있다 : <, , >, , =, 

( 다음과 같이 읽는다 : 5 < 릴레이션내의 튜플 )

(= some)  in

그러나 , ( some) ≡not in

0

(5 < some 5 ) = true 6

0

(5 < some 5 ) = false

0

(5 = some 5 ) = true

0

(5  some 5 ) = true (0  5 이기때문에 )

(29)

예제 질의

Brooklyn 에 위치한 어떤 지점보다 더 많은 자산을 가진 모든 지점을 찾아라 .

select branch-name from branch

where assets > some (select assets

from branch

where branch-city = “Brooklyn”)

(30)

all 절

F<comp> all r  t(t  r  [F <comp> t])

( all)  not in

그러나 , (= all) ≡in

0

(5 < all 5 ) = false

6

6

(5 < all 10 ) = true

4

(5 = all 5 ) = false

(5 all 46 ) = true (5  이이이이이이이

(31)

예제 질의

Brooklyn 에 위치한 모든 지점보다 더 많은 자산을 가진 모든 지점을 찾아라 .

select branch-name from branch

where assets > all (select assets from branch

where branch-city = “Brooklyn”)

(32)

빈 릴레이션 검사

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

exists r  r  

not exists r  r = 

(33)

예제 질의

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 임을 유의하라

(34)

중복 튜플의 부재 검사

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”)

(35)

예제 질의

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”)

(36)

유도 릴레이션

평균 예금 잔고가 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 절을 사용할 필요 가 없음에 유의하라 .

(37)

어떤 사용자의 뷰로부터 어떤 데이터를 숨기는 방법을 제공한다 . 뷰 를 생성하려면 다음과 같은 명령을 사용한다 .

create view v as < 질의 표현식 >

여기서 :

- < 질의 표현식 > 은 적법한 표현식이다 . - 뷰명은 v 로 표현된다 .

(38)

예제 질의

지점과 그들의 고객으로 구성된 뷰 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”

(39)

데이터베이스의 수정 - 삭제

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)

(40)

예제 질의

은행의 평균에 미달하는 잔고를 가진 모든 예금 계좌 레코드를 삭제 하라 .

delete from account

where balance < (select avg (balance) from account)

- 문제점 : deposit 에서 튜플들을 삭제하므로 평균 잔고가 변한다 . - SQL 에서 사용되는 해결책 :

1. 먼저 , avg balance 를 계산하고 삭제할 모든 튜플을 찾는다 . 2. 다음 , 위에서 찾은 모든 튜플을 삭제한다 (avg 를 다시 계산하

거나 튜플을 재 검사하지 않고 ).

(41)

데이터베이스의 수정 - 삽입

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)

(42)

데이터베이스의 수정 - 삽입

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

(43)

데이터베이스의 수정 - 갱신

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).

(44)

뷰의 갱신

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)

보다 복잡한 뷰에의 갱신은 변환하기가 어렵거나 불가능해 허용되지 않는다

.

(45)

죠인 릴레이션

죠인 연산은 두 릴레이션을 취해 또 다른 릴레이션을 결과로 돌려준다 .

이들 부가적인 연산은 일반적으로 from 절 내의 부 질의 표현식으로 사용된 다 .

죠인 조건 - 두 릴레이션내의 어떤 튜플들이 부합하고 죠인 결과에 어떤 애 트리뷰트가 나타날지를 정한다 .

죠인 유형 - 다른 릴레이션의 어떤 튜플과 부합하지 않는 튜플들을 어떻게 취급할 것인가 ( 죠인 조건에 근거해 ) 를 정한다 .

<

죠인 유형 죠인 조건

inner join left outer join right outer join

natrual on 술어>

using(A , A , . . . , A)

(46)

죠인 릴레이션 - 예제 데이터 집합

릴레이션 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

(47)

죠인 릴레이션 - 예제

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

(48)

죠인 릴레이션 - 예제

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

(49)

죠인 릴레이션 - 예제

loan full outer join borrower using(loan-number)

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

from (depositor natural full outer join borrower) where account-number is null or loan-number is null

branch-name loan-number amount customer-name Downtown

Redwood Perryridge null

L-170 L-230 L-260 L-155

3000 4000 1700 null

Jones Smith null Hayes

(50)

데이터 정의어

다음과 같이 릴레이션 집합 뿐만 아니라 각 릴레이션에 관한 정보의 지정을 허용한다 .

각 릴레이션의 스키마

각 애트리뷰트에 관련된 값들의 도메인

무결성 제약 조건

각 릴레이션에 유지되어야 할 인덱스 집합

각 릴레이션에 대한 정보 보안과 인증

디스크 상의 각 릴레이션의 물리적 저장 구조

(51)

SQL 에서의 도메인 유형

char(n). 사용자가 지정한 길이 n 을 가진 고정길이 문자 열

varchar(n). 사용자가 지정한 최대 길이 n 을 가진 가변 길이 문자열

int. 정수 ( 기계 종속인 정수들의 유한 부분 집합 )

smallint. 작은 정수 (integer 도메인 유형의 기계 종속 부 분 집합 )

numeric(p,d). 사용자가 지정한 정밀도 p 자리수와 소수

점 이하 n 자리를 가진 고정점 수

(52)

SQL 에서의 도메인 유형 ( 계속 )

real, double precision. 기계 종속 정밀도를 가진 부동 소수점 및 배정 도 부동 소수점 수

float(n). 적어도 n 자리수의 사용자가 지정한 정밀도를 가진 부동 소 수점 수

date. 4 자리의 연 , 월 및 일을 내포하는 날짜

time. 시 , 분 및 초로 이루어진 하루의 시간

널 값은 모든 도메인 유형에서 허용된다 . 애트리뷰트를 not null 로 선언하면 그 애트리뷰트에 널 값이 금지된다 .

SQL-92 의 create domain 구조는 사용자가 정의한 도메인 유형을 생성한다 .

create domain person-name char(20) not null

(53)

create table 구조

SQL 릴레이션은 create table 명령을 사용해 정의한다 .

create table r (A1 D1, A2 D2, . . ., An Dn, < integrity-constraint1>, . . .,

< integrity-constraintk>)

- r 은 릴레이션명이다 .

- 각 A

i

는 릴레이션 r 의 스키마내의 애트리뷰트명이다 . - D

i

는 애트리뷰트 A

i

의 도메인내 값들의 데이터 형이다 .

예 :

create table branch

(branch-name char(15) not null, branch-city char(30),

assets integer)

(54)

create table 에서의 무결성 제약 조건

not null

primary key(A1

, . . ., A

n

)

check(P),

여기서 P 는 술어이다 .

예 : branch-name 을 branch 의 주 키로 하고 assets 의 값은 음수가 안되도록 하라 .

create table branch

(branch-name char(15) not null branch-city char(30),

assets integer,

primary key (branch-name), check(assets >= 0))

SQL-92 에서는 애트리뷰트상의 primary key 선언에 의해 자동으로 not

null

을 보장한다 .

(55)

drop 및 alter table 구조

drop table

명령은 데이터베이스로부터 제거될 릴레이션에 관한 모든 정보

를 삭제한다 .

alter table

명령은 기존 릴레이션에 애트리뷰트를 추가하는데 사용된다 . 릴

레이션 내의 모든 튜플에는 새로운 애트리뷰트의 값으로 널이 할당된다 .

alter table

명령의 형식은 다음과 같다 .

alter table r add A D

여기서 A 는 릴레이션 r 에 추가될 애트리뷰트명이고 D 는 A 의 도메인이 다 .

alter table

명령은 릴레이션의 애트리뷰트를 제거하는데도 또한 사용될 수

있다 .

alter table r drop A

여기서 A 는 릴레이션 r 의 애트리뷰트명이다 .

(56)

내포 SQL

SQL 표준에서는 Pascal, PL/I, Fortran, C 및 Cobol 과 같 은 프로그래밍 언어내의 SQL 내포를 정의하고 있다 .

SQL 질의가 내포되는 언어를 주 언어라 하고 , 호스트 언 어내의 허용되는 SQL 구조를 내포 SQL 이라 한다 .

이들 언어의 기본적인 유형은 PL/I 에 System R SQL 이 내포된 형태를 따른다 .

선처리기에 내포 SQL 요청을 식별하기 위해 EXEC SQL 문을 사용한다 .

EXEC SQL < 내포 SQL 문 > END EXEC

(57)

예제 질의

주 언어내로 부터 , 어떤 계좌내의 변수 amount 불을 초과 하는 잔고를 가진 고객의 이름과 계좌 번호를 찾아라 .

SQL 로 질의를 작성하고 그에 대한 커서를 선언한다 . EXEC SQL

declare c cursor for

select customer-name, account-number from depositor, account

where depositor.account-number = account.account-number and account.balance > :amount

END-EXEC

(58)

내포 SQL( 계속 )

open 문은 질의가 평가되도록 한다 .

EXEC SQL open c END-EXEC

fetch 문은 질의 결과내의 한 튜플의 값이 주 언어 변수에 위치하도

록 한다 .

EXEC SQL fetch c into :cn :an END-EXEC

fetch 를 반복 호출하여 질의 결과내의 연속 튜플을 얻는다 .

SQL 통신 영역내의 변수가 end-of-file 에 도달했음을 지시한다 .

close 문은 데이터베이스 시스템으로 하여금 질의 결과를 가진 임시

릴레이션을 삭제하도록 한다 .

EXEC SQL close c END-EXEC

(59)

동적 SQL

실행시 프로그램이 구축되어 SQL 질의를 제기하도록 한다 .

C 프로그램 내에서 동적 SQL 의 사용 예

char * sqlprog = “update account set balance = balance  1.05 where account-number = ?”

EXEC SQL prepare dynprog from :sqlprog;

char account[10] = “A-101”;

EXEC SQL execute dynprog using :account;

동적 SQL 프로그램에 ? 를 포함하고 있는데 , 이것은 SQL 프로그 램이 실행될 때 제공되는 값을 보관하는 장소이다 .

(60)

기타 SQL 기능

4 세대 언어 - 사용자 인터페이스용 화면의 틀을 생성하고 보고서 생성을 위 해 데이터를 포매팅하는 어플리케이션 프로그래머를 지원하는 특수 언어 . 대 부분의 상용 데이터베이스 제품에서 이용 가능 .

SQL 세션 - 클라이언트와 서버의 추상화를 제공 ( 원격 가능 ) - 클라이언트는 SQL 서버에 연결하여 세션을 형성

- 일련의 문장을 실행 - 세션의 단절

- 세션에서 수행된 작업을 완료하거나 복귀할 수 있다 .

SQL 환경에는 사용자 식별자와 세션이 사용하고 있는 여러 스키마중의 하나 를 식별하는 스키마 등을 포함한 여러 구성 요소를 내포하고 있다 .

참조

관련 문서