Transcript PPT File

제 4 장 SQL











기본 구조
집합 연산
집성 함수
널값
중첩 부 질의
유도 릴레이션
뷰
데이터베이스의 수정
죠인 릴레이션
데이터 정의어
내포 SQL
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
1
기본 구조

SQL은 집합과 수정 및 강화된 관계형 연산에 기초를 두고 있다.

전형적인 SQL 질의는 다음과 같은 형식을 갖는다.
select A1, A2, , An
from r1, r2, , rm
where P
- Ai 는 애트리뷰트이다.
- ri 는 릴레이션이다.
- P는 술어이다.

이 질의는 다음 관계형 대수 표현식과 동등하다
A1, A2, , An (P(r1  r2    rm))

SQL 질의의 결과는 릴레이션이다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
2
select 절

select 절은 관계형 대수의 추출 연산에 대응한다. 질의의 결과로
바라는 애트리뷰트를 나열하는데 사용한다.

loan 릴레이션내의 모든 지점명을 찾아라.
select branch-name
from loan
순수 관계형 대수 구문에서는 이 질의는 다음과 같다.
branch-name (loan)

select 절의 *는 “모든 애트리뷰트”를 의미한다.
select *
from loan
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
3
select 절(계속)

SQL은 질의 결과와 함께 릴레이션내의 중복을 허용한다.

중복을 제거하려면 select 다음에 키워드 distinct를 기입한다.
loan 릴레이션내의 모든 지점명을 찾아 중복은 제거하라.
select distinct branch-name
from loan

키워드 all은 중복이 제거되지 않도록 한다.
select all branch-name
from loan
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
4
select 절(계속)

select 절에는 연산자 +,-,* 및 /를 내포한 산술 표현식과
상수 또는 튜플의 애트리뷰트 상의 연산을 내포할 수 있
다.

질의:
select branch-name, loan-number, amount* 100
from loan

위의 질의는 애트리뷰트 amount에 100이 곱해진 것을 제
외하고는 loan 릴레이션과 같은 릴레이션을 돌려준다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
5
where 절

where 절은 관계형 대수의 선택 술어에 대응한다. from 절에 나타
나는 릴레이션의 애트리뷰트를 내포하는 술어로 구성된다.

대출액이 1,200불을 초과하는 perryridge 지점에서 이루어진 대출
의 대출 번호를 찾아라.
select loan-number
from loan
where branch-name = “Perryridge” and amount >1200

SQL은 논리 연산자 and, or 및 not을 사용한다. SQL은 비교 연산자
에 오퍼랜드로서 산술 표현식의 사용을 허용한다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
6
where 절(계속)

SQL에는 어떤 값보다 작거나 같고 다른 값보다 크거나
같음을 나타내는 where 절을 단순히 하기 위해
between 비교 연산자를 포함한다.

대출액이 90,000불에서 100,000불 사이인 대출의 대출
번호를 찾아라.
select loan-number
from loan
where amount between 90000 and 100000
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
7
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”
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
8
재명명 연산

릴레이션과 애트리뷰트의 재명명을 위한 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”
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
9
튜플 변수

튜플 변수는 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”
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
10
스트링 연산

SQL에는 문자열 비교를 위한 문자열-매칭 연산자를 내포한다. 패
턴은 두 개의 특수 문자를 사용해 기술한다.
- %는 어떠한 부 문자열과 부합한다.
- _는 어떤 문자와 부합한다.

거리명에 부 문자열 “Main”을 내포한 모든 고객명을 찾아라.
select customer-name
from customer
where customer-street like “%Main%’

이름 “Main%”와 부합하는 것
like “Main\%” escape “\”
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
11
튜플 출력의 순서화

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 요청을 받으면 정렬을 수행해야 한다. 많은 수의
튜플을 정렬하는데 비용이 많이 들어가므로, 필요할 때만 정렬하
는 것이 바람직하다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
12
중복

중복이 있는 릴레이션에서 SQL은 결과에 얼마나 많은 튜플 사본이 나타
나게 할 지를 정할 수 있다.

관계형 대수 연산자의 어떤 다중 집합 버전 - 다중 집합 릴레이션 r1과 r2가
주어지면
1. r1내의 튜플 t1의 사본이 c1개 있고 t1이 선택 를 만족하면, (r1)내에
c1개의 t1사본이 존재한다.
2. r1내의 튜플 t1의 각 사본에 대해, A(t1)의 사본이 존재한다. 여기서
A(t1)은 단일 튜플 t1의 추출을 의미한다.
3. r1에 튜플 t1이 c1사본이 있고 r2에 튜플 t2가 c2사본이 있으면, r1 r2내에
튜플 t1· t2의 c1 c2개의 사본이 존재한다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
13
중복(계속)

스키마 (A,B)를 가진 릴레이션 r1과 스키마 (C)를 가진 릴레이션 r2가 다음
과 같은 다중 집합이라 하자.
r1 = {(1,a),(2,a)} r2 = {(2),(3),(3)}

B(r1)은 {(a),(a)}가 되고 , B(r1)  r2는 아래와 같이 된다.
{(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}

아래와 같은 SQL 중복 시맨틱은
select A1, A2, , An
from r1, r2, , rm
where P
다음과 같은 표현식의 다중 집합 버전과 동등하다.
A1, A2, , An(P(r1, r2, , rm))
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
14
집합 연산

집합 연산 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) 번
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
15
집합연산(계속)

대출, 예금 또는 모두를 가진 고객을 찾아라.
(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)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
16
집성 함수

이들 함수는 릴레이션의 행의 다중 집합 값에
연산하여 단일 값을 돌려준다.
avg: 평균 값
min: 최소 값
max: 최대 값
sum: 총 계
count: 값의 개수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
17
집성함수(계속)



Perryridge 지점의 평균 예금 잔고를 찾아라.
select avg(balance)
from account
where branch-name = “Perryridge”
customer 릴레이션의 튜플 수를 찾아라.
select count(*)
from customer
은행의 예금자 수를 찾아라.
select count(distinct customer-name)
from depositor
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
18
집성함수 - 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 리스트 내에 나타나야 한다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
19
집성함수 - Having 절

평균 예금 잔고가 1,200불을 초과하는 모든 지점명을
찾아라.
select branch-name, avg(balance)
from account
group by branch-name
having avg(balance) > 1200

유의 : having 절의 술어는 그룹이 이루어진 후에 적용
된다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
20
널값

어떤 애트리뷰트에 대해 튜플이 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으로 평가하면 참으로 평가한다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
21
널 값(계속)

loan 릴레이션 내의 amount에 널 값이 있는 모든 대출 번호를 찾아
라.
select loan-number
from loan
where amount is null

모든 대출액의 총계
select sum (amount)
from loan

위의 문장은 널 값은 무시한다. 널이 아닌 금액이 없으면 결과는
널이다.

count(*)를 제외한 모든 집성 연산은 집성 애트리뷰트 상에 널 값
을 가진 튜플은 무시한다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
22
중첩 부 질의

SQL에서는 중첩 부 질의 기법을 제공한다.

부 질의는 다른 질의 내에 내포되는 select-from-where
표현식이다.

부 질의의 공통적인 사용은 집합 멤버쉽, 집합 비교 및
집합 수의 테스트를 수행하는 것이다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
23
집합 멤버쉽

F in r  t  r (t = F)
(5
in
(5
in
(5
not in
0
4
5
0
4
6
0
4
6
) = true
) = false
) = true
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
24
예제 질의

은행에 예금과 대출이 모두 있는 고객을 찾아라.
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)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
25
예제 질의

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)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
26
집합 비교

Brooklyn에 위치한 어떤 지점보다 더 많은 자산을 가진
모든 지점을 찾아라.
select distinct T.branch-name
from branch as T, branch as S
where T.assets > S.assets and
S.branch-city = “Brooklyn”
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
27
some 절


F<comp> some r  t(t  r  [F <comp> t])
여기서 <comp>는 다음 중 하나일 수 있다 : <, , >, , =, 
(5 < some
0
5
6
) = true
(다음과 같이 읽는다: 5 < 릴레이션내의 튜플)


(5 < some
0
5
) = false
(5 = some
0
5
) = true
(5  some
0
5
) = true (0  5 이기때문에)
(= some)  in
그러나, ( some) ≡not in
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
28
예제 질의

Brooklyn에 위치한 어떤 지점보다 더 많은 자산을 가진
모든 지점을 찾아라.
select branch-name
from branch
where assets > some
(select assets
from branch
where branch-city = “Brooklyn”)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
29
all 절

F<comp> all r  t(t  r  [F <comp> t])
0
5
6
(5 < all
) = false
(5 < all
6
10
) = true
(5 = all
4
5
) = false
(5 all
4
6
) = true (5 이고 이기 때문에)

( all)  not in

그러나, (= all) ≡in
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
30
예제 질의

Brooklyn에 위치한 모든 지점보다 더 많은 자산을 가진
모든 지점을 찾아라.
select branch-name
from branch
where assets > all
(select assets
from branch
where branch-city = “Brooklyn”)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
31
빈 릴레이션 검사

exists 구조는 매개 변수 부 질의가 empty가 아니면 참
값을 돌려준다.

exists r  r  

not exists r  r = 
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
32
예제 질의

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 임을 유의하라
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
33
중복 튜플의 부재 검사

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”)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
34
예제 질의

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”)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
35
유도 릴레이션

평균 예금 잔고가 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 절을 사용할 필요
가 없음에 유의하라.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
36
뷰

어떤 사용자의 뷰로부터 어떤 데이터를 숨기는 방법을 제공한다.
뷰를 생성하려면 다음과 같은 명령을 사용한다.
create view v as <질의 표현식>
여기서:
- <질의 표현식>은 적법한 표현식이다.
- 뷰명은 v로 표현된다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
37
예제 질의

지점과 그들의 고객으로 구성된 뷰
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”
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
38
데이터베이스의 수정 - 삭제

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)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
39
예제 질의

은행의 평균에 미달하는 잔고를 가진 모든 예금 계좌 레코드를 삭
제하라.
delete from account
where balance < (select avg (balance)
from account)
- 문제점: deposit에서 튜플들을 삭제하므로 평균 잔고가 변한다.
- SQL에서 사용되는 해결책:
1. 먼저, avg balance를 계산하고 삭제할 모든 튜플을 찾는다.
2. 다음, 위에서 찾은 모든 튜플을 삭제한다 (avg를 다시 계산하
거나 튜플을 재 검사하지 않고).
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
40
데이터베이스의 수정 - 삽입

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)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
41
데이터베이스의 수정 - 삽입

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
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
42
데이터베이스의 수정 - 갱신

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).
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
43
뷰의 갱신

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)

보다 복잡한 뷰에의 갱신은 변환하기가 어렵거나 불가능해 허용되지 않
는다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
44
죠인 릴레이션

죠인 연산은 두 릴레이션을 취해 또 다른 릴레이션을 결과로 돌려준다.

이들 부가적인 연산은 일반적으로 from 절 내의 부 질의 표현식으로 사용
된다.

죠인 조건 - 두 릴레이션내의 어떤 튜플들이 부합하고 죠인 결과에 어떤
애트리뷰트가 나타날지를 정한다.

죠인 유형 - 다른 릴레이션의 어떤 튜플과 부합하지 않는 튜플들을 어떻
게 취급할 것인가(죠인 조건에 근거해)를 정한다.
죠인 유형
inner join
left outer join
right outer join
full outer join
죠인 조건
natrual
on < 술어>
using(A1, A 2 , . . . , An)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
45
죠인 릴레이션 - 예제 데이터 집합


릴레이션 loan
branch-name
Downtown
Redwood
Perryridge
loan-number
L-170
L-230
L-260
릴레이션 borrower
customer-name
Jones
Smith
Hayes
amount
3000
4000
1700
loan-number
L-170
L-230
L-155
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
46
죠인 릴레이션 - 예제

loan inner join borrower on
loan.loan-number = borrower.loan-number
branch-name loan-number amount customer-name loan-number
Downtown
L-170
3000 Jones
L-170
Redwood
L-230
4000 Smith
L-230

loan left outer join borrower on
loan.loan-number = borrower.loan-number
branch-name
Downtown
Redwood
Perryridge
loan-number
L-170
L-230
L-260
amount
3000
4000
1700
customer-name
Jones
Smith
null
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
loan-number
L-170
L-230
null
47
죠인 릴레이션 - 예제

loan natural inner join borrower
branch-name
Downtown
Redwood

loan-number
L-170
L-230
amount
3000
4000
customer-name
Jones
Smith
loan natural right outer join borrower
branch-name
Downtown
Redwood
null
loan-number
L-170
L-230
L-155
amount
3000
4000
null
customer-name
Jones
Smith
Hayes
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
48
죠인 릴레이션 - 예제

loan full outer join borrower using(loan-number)
branch-name
Downtown
Redwood
Perryridge
null

loan-number
L-170
L-230
L-260
L-155
amount
3000
4000
1700
null
customer-name
Jones
Smith
null
Hayes
은행에 예금이 있거나 대출이 있는 모든 고객을 찾아라.
select customer-name
from (depositor natural full outer join borrower)
where account-number is null or loan-number is null
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
49
데이터 정의어
다음과 같이 릴레이션 집합 뿐만 아니라 각 릴레이션에
관한 정보의 지정을 허용한다.
•
각 릴레이션의 스키마
•
각 애트리뷰트에 관련된 값들의 도메인
•
무결성 제약 조건
•
각 릴레이션에 유지되어야 할 인덱스 집합
•
각 릴레이션에 대한 정보 보안과 인증
•
디스크 상의 각 릴레이션의 물리적 저장 구조
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
50
SQL에서의 도메인 유형

char(n). 사용자가 지정한 길이 n을 가진 고정길이 문자
열

varchar(n). 사용자가 지정한 최대 길이 n을 가진 가변
길이 문자열

int. 정수(기계 종속인 정수들의 유한 부분 집합)

smallint. 작은 정수(integer 도메인 유형의 기계 종속 부
분 집합)

numeric(p,d). 사용자가 지정한 정밀도 p 자리수와 소
수점 이하 n 자리를 가진 고정점 수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
51
SQL에서의 도메인 유형(계속)

real, double precision. 기계 종속 정밀도를 가진 부동 소수점 및 배
정도 부동 소수점 수

float(n). 적어도 n자리수의 사용자가 지정한 정밀도를 가진 부동
소수점 수

date. 4자리의 연, 월 및 일을 내포하는 날짜

time. 시, 분 및 초로 이루어진 하루의 시간
–
널 값은 모든 도메인 유형에서 허용된다. 애트리뷰트를 not null로
선언하면 그 애트리뷰트에 널 값이 금지된다.
–
SQL-92의 create domain 구조는 사용자가 정의한 도메인 유형을
생성한다.
create domain person-name char(20) not null
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
52
create table 구조

SQL 릴레이션은 create table 명령을 사용해 정의한다.
create table r (A1 D1, A2 D2, . . ., An Dn,
< integrity-constraint1>,
. . .,
< integrity-constraintk>)
- r 은 릴레이션명이다.
- 각 Ai는 릴레이션 r의 스키마내의 애트리뷰트명이다.
- Di 는 애트리뷰트 Ai의 도메인내 값들의 데이터 형이다.

예:
create table branch
(branch-name
branch-city
assets
char(15) not null,
char(30),
integer)
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
53
create table에서의 무결성 제약 조건

not null

primary key(A1, . . ., An)

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을 보장한다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
54
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의 애트리뷰트명이다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
55
내포 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
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
56
예제 질의
주 언어내로 부터, 어떤 계좌내의 변수 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
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
57
내포 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
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
58
동적 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 프로그램
이 실행될 때 제공되는 값을 보관하는 장소이다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
59
기타 SQL 기능

4세대 언어 - 사용자 인터페이스용 화면의 틀을 생성하고 보고서 생성을
위해 데이터를 포매팅하는 어플리케이션 프로그래머를 지원하는 특수
언어. 대부분의 상용 데이터베이스 제품에서 이용 가능.

SQL 세션 - 클라이언트와 서버의 추상화를 제공(원격 가능)
- 클라이언트는 SQL 서버에 연결하여 세션을 형성
- 일련의 문장을 실행
- 세션의 단절
- 세션에서 수행된 작업을 완료하거나 복귀할 수 있다.

SQL 환경에는 사용자 식별자와 세션이 사용하고 있는 여러 스키마중의
하나를 식별하는 스키마 등을 포함한 여러 구성 요소를 내포하고 있다.
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
60