6장: 데이터베이스 언어 SQL
6장: 데이터베이스 언어 SQL
6장: 데이터베이스 언어 SQL
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>6장</strong>: <strong>데이터베이스</strong> <strong>언어</strong> <strong>SQL</strong><br />
Prof. Jin Hyun Son<br />
jhson@cse.hanyang.ac.kr<br />
Department of Computer Science & Engineering<br />
Hanyang University
6 장. <strong>데이터베이스</strong> <strong>언어</strong> <strong>SQL</strong><br />
<strong>SQL</strong> 에서의 단순 질의<br />
하나이상의릴레이션을포함하는질의<br />
부질의(subquery)<br />
릴레이션 전체를 다루는 연산<br />
<strong>데이터베이스</strong> 변경<br />
<strong>SQL</strong> 에서 릴레이션 스키마의 정의<br />
뷰정의<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
2
<strong>SQL</strong>의 발전<br />
<strong>SQL</strong> 발전 과정<br />
Sequel<br />
System R 프로젝트 (1970 년대 중반); 추후 <strong>SQL</strong>로 이름변경<br />
<strong>SQL</strong>-86, <strong>SQL</strong>-89<br />
<strong>SQL</strong>-92<br />
<strong>SQL</strong>2 라고도 불림<br />
<strong>SQL</strong>-99<br />
<strong>SQL</strong>4<br />
표준화 진행 중에는 <strong>SQL</strong>3 라고 불리었음<br />
객체-관계 특징, 기타 새로운 기능들<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
3
Example Schema<br />
Movie Database Schema<br />
Movie (title, year, length, inColor, studioName, producerC#)<br />
MovieStar (name, address, gender, birthdate)<br />
StarsIn (movietitle, movieyear, starname)<br />
MovieExec (name, address, cert#, netWorth)<br />
Studio (name, address, presC#)<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
4
<strong>SQL</strong>에서의 단순 질의<br />
<strong>SQL</strong> 질의의 기본적인 형태<br />
한 릴레이션에서 어떤 조건을 만족하는 튜플들을 검색<br />
기본적인 세 개의 키워드: SELECT, FROM, WHERE<br />
FROM 절: 질의의 대상이 되는 하나 이상의 릴레이션들<br />
WHERE 절: 튜플이 질의 결과에 포함되기 위해 만족해야 하는<br />
조건<br />
SELECT 절: 결과로 생성할 애트리뷰트들을 기술<br />
(예) 1990년 Disney 스튜디오에서 제작된 모든 영화를 찾아라.<br />
SELECT *<br />
FROM Movie<br />
WHERE studioName = ‘Disney’ AND year = 1990;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
5
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
<strong>SQL</strong>에서의 프로젝션<br />
릴레이션을 일부 애트리뷰트들 만으로 프로젝션<br />
(예) 1990년도에 Disney 스튜디오에서 제작된 모든 영화들의 제목과<br />
상영시간을 찾아라.<br />
SELECT title, length<br />
FROM Movie<br />
WHERE studioName = ‘Disney’ AND year = 1990;<br />
title length<br />
Pretty Woman 119<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
6
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
다른 애트리뷰트 이름을 사용<br />
SELECT title AS name, length AS duration<br />
FROM Movie<br />
WHERE studioName = ‘Disney’ AND year = 1990;<br />
name duration<br />
Pretty Woman 119<br />
<strong>SQL</strong>은 키워드와 애트리뷰트의 이름에 대해서는 대소문자를<br />
구별하지 않는다. 단지 인용부호 안에서만 대문자와 소문자를<br />
구분한다.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
7
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
SELECT 절의 항목<br />
산술 연산자 적용 가능<br />
상수 사용 가능<br />
SELECT title,length*0.0167 AS duration, ‘hrs.’ AS inHours<br />
FROM Movie<br />
WHERE studioName = ‘Disney’ AND year = 1990;<br />
title duration inHours<br />
Pretty Woman 1.98334 hrs.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
8
참고: <strong>SQL</strong> 질의를 읽거나/작성하는 요령<br />
SELECT-FROM-WHERE 질의 읽기<br />
FROM 절<br />
어떤 릴레이션이 사용되는가?<br />
WHERE 절<br />
튜플은 어떤 조건을 만족해야 하는가?<br />
SELECT 절<br />
질의의 결과는 무엇인가?<br />
SELECT-FROM-WHERE 질의 작성<br />
읽기와 같은 순서<br />
FROM 절, WHERE 절, SELECT 절<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
9
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
<strong>SQL</strong>에서의 선택 연산<br />
WHERE 절에 선택 조건을 명시<br />
여섯 개의 일반적인 비교 연산자: =, , >, >=,
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
(예) 1970년 이후에 만들어진 모든 흑백 영화의 제목을 찾아라.<br />
SELECT title<br />
FROM Movie<br />
inColor는 부울타입<br />
WHERE year > 1970 AND NOT inColor<br />
(예) MGM 스튜디오에서 제작된 영화 중 1970년 이후의 것이거나<br />
상영시간이 90분이 안 되는 영화의 제목을 찾아라.<br />
SELECT title<br />
FROM Movie<br />
WHERE (year > 1970 OR length < 90)<br />
AND studioName = ‘MGM’<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
11
참고 사항<br />
<strong>SQL</strong> 질의와 관계대수<br />
SELECT L<br />
FROM R<br />
WHERE C<br />
⇒ π L (σ C (R))<br />
Keyword 의 대소문자<br />
<strong>SQL</strong>에서 keyword는 대소문자 구별 없음<br />
FROM, from, FrOm: 모두 O.K.<br />
인용부호 내에서는 구별됨<br />
‘FROM’ 과 ‘from’은 다른문자열<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
12
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
문자열 비교<br />
문자열 비교는 사전식(lexicographic) 순서에 기반<br />
(예) ‘at’ < ‘bar’<br />
s LIKE p<br />
간단한 패턴 부합(match)을 기반으로 한 문자열 비교<br />
s 는 문자열 타입 애트리뷰트, p 는 패턴<br />
패턴: 특수 문자인 % 와 _ 을 선택적으로 가진 문자열<br />
%:0 이상의 길이를 가진 임의의 문자열<br />
_:임의의한문자<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
13
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
(예) 제목이 “Star”로 시작하는 영화를 모두 찾아라.<br />
SELECT title<br />
FROM Movie<br />
WHERE title LIKE ‘Star%’<br />
/* 결과: {Star Wars, . . .} */<br />
(예) 제목에 소유격(‘s)을 갖는 모든 영화를 찾아라.<br />
SELECT title<br />
FROM Movie<br />
WHERE title LIKE ‘%’’s%’<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
연속된 두개의 어포스트로피는<br />
하나의 어포스트로피 표시<br />
/* 결과: {Rogan’s Run, . . .} */<br />
14
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
LIKE 수식에서 이스케이프(escape) 문자<br />
키워드 ESCAPE 와 사용하고자 하는 이스케이프 문자<br />
(예) s LIKE ‘x%%x%’ ESCAPE ‘x’<br />
/* %로 시작해서 %로 끝나는 모든 문자열 */<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
15
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
날짜와 시간<br />
날짜와 시간은 특수한 데이터 타입으로 지원<br />
날짜 타입: DATE<br />
(예)날짜 상수: DATE ‘1948-05-14’<br />
시간 타입: TIME<br />
(예)시간 상수: TIME ‘15:00:02.5’<br />
날짜+시간 타입: TIMESTAMP<br />
(예)날짜+시간 상수: TIMESTAMP ‘1945-05-14 12:00:00’<br />
비교 연산자를 이용하여 날짜와 시간 비교 가능<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
16
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
널(null) 값<br />
값을 정의할 수 없는 경우<br />
알려지지 않은 값(value unknown)<br />
값이 무엇인지 알 수 없는 경우<br />
(예) 어떤 영화 스타의 생일을 모를 때<br />
적용 불가능한 값(value inapplicable)<br />
적합한 값이 존재하지 않는 경우<br />
(예) MovieStar 에서 미혼인 영화 스타의 spouse 값<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
두 NULL 값은<br />
서로 동일한<br />
값이 아님<br />
17
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
NULL에 대한연산<br />
산술 연산자(즉, ×, + 등 )에 NULL을 사용<br />
결과는 NULL<br />
(예) x 의 값이NULL 이면, x + 3은 NULL<br />
비교 연산자(즉, = 이나 >)에 NULL을 사용<br />
결과는 UNKNOWN<br />
(예) x 의 값이NULL 이면, x > 3 은 UNKNOWN<br />
두 NULL 값은 서로 동일한 값이 아니다.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
18
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
NULL은 상수가 아니다.<br />
NULL 을 피연산자로 사용할 수 없음<br />
(예) NULL + 3, NULL = 5 : 허용 안됨<br />
NULL과 관련한 프레디키트<br />
IS NULL, IS NOT NULL<br />
(예) 변수 x의 값이 NULL 인지 아닌지 확인<br />
» x IS NULL<br />
» x IS NOT NULL<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
19
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
NULL 값이 사용된 진리표<br />
X y x AND y x OR y NOT x<br />
TRUE UNKNOWN UNKNOWN TRUE FALSE<br />
FALSE UNKNOWN FALSE UNKNOWN TRUE<br />
UNKNOWN TRUE UNKNOWN TRUE UNKNOWN<br />
UNKNOWN FALSE FALSE UNKNOWN UNKNOWN<br />
UNKNOWN UNKNOWN UNKNOWN UNKNOWN UNKNOWN<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
20
참고: NULL과 관련해 주의할 점<br />
NULL 값을 가진 튜플이 있을 때의 질의 결과<br />
WHERE 조건이 TRUE 인 튜플만 결과에 포함<br />
(예) 다음 질의를 생각해 보자.<br />
SELECT *<br />
FROM Movie<br />
WHERE length 120<br />
모든 Movie 튜플이 결과에 포함되는 것은 아님<br />
length 값이 NULL 인 튜플<br />
» WHERE 조건이 UNKNOWN<br />
» 따라서, 결과에 포함되지 않음<br />
즉, “length 가 NULL 이 아닌모든튜플을 찾아라”<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
21
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
결과의 정렬(ordering)<br />
출력의 순서<br />
임의의 애트리뷰트의 값에 기반을 둘 수 있음<br />
정렬된 출력<br />
다음의 절을 추가:<br />
ORDER BY <br />
디폴트는 오름차순<br />
키워드 DESC 를 붙이면 내림차순<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
22
<strong>SQL</strong>에서의 단순 질의 (계속)<br />
(예) 1990년 Disney 에서 제작된 영화들을,상영시간이 짧은 순서로,<br />
상영시간이 같을 경우, 영화제목의 알파벳 순서로 찾아라.<br />
SELECT *<br />
FORM Movie<br />
WHERE studioName = ‘Disney’ AND year = 1990<br />
ORDER BY length, title;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
23
둘 이상의 릴레이션을 포함하는 질의<br />
<strong>SQL</strong> 에서 카티션 프로덕트와 조인<br />
둘 이상의 릴레이션을 결합하는 간단한 방법<br />
FROM 절에 각 릴레이션을 나열<br />
(예) Movie (title, year, length, inColor, studioName, producerC#),<br />
MovieExec (name, address, cert#, netWorth)<br />
영화 Star Wars 의 제작자의 이름과 주소를 찾아라.<br />
SELECT name, address<br />
FROM Movie, MovieExec<br />
WHERE title = ‘Star Wars’ AND producerC# = cert#<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
24
둘 이상의 릴레이션을 포함하는 질의 (계속)<br />
애트리뷰트 이름의 모호성(disambiguity) 제거<br />
여러 릴레이션들을 포함하는 질의<br />
둘 이상의 애트리뷰트가 같은 이름을 가질 수 있다.<br />
R.A 의 기호를 사용 (R; 릴레이션, A; 애트리뷰트)<br />
(예) 주소가 같은 스타와 제작자의 쌍을 찾아라.<br />
SELECT MovieStar.name, MovieExec.name<br />
FROM MovieStar, MovieExec<br />
WHERE MovieStar.address = MovieExec.address<br />
모호성이 없는 경우에도 R.A 와 같이사용가능<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
25
둘 이상의 릴레이션을 포함하는 질의 (계속)<br />
튜플 변수<br />
한 릴레이션에서 서로 다른 튜플들을 지정하고자 할 때<br />
릴레이션의 별명(alias)인 튜플 변수(tuple variable)를 사용<br />
(예) 같은 주소를 가진 스타들을 찾아라.<br />
SELECT Star1.name, Star2.name<br />
FROM MovieStar AS Star1, MovieStar AS Star2<br />
WHERE Star1.address = Star2.address<br />
AND Star1.name < Star2.name<br />
star1.name < star2.name: 동일한 스타 이름을 가진 모든 쌍이 질의<br />
결과에 포함되는 것을 방지. 또한 같은 주소를 가진 스타들의 쌍을 단<br />
한번만 생성하도록 해 준다.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
26
둘 이상의 릴레이션을 포함하는 질의 (계속)<br />
여러 릴레이션들을 포함하는 질의의 해석<br />
내포된 루프 (nested loop)<br />
여러 개의 튜플 변수들이 있을 때,<br />
각 튜플 변수에 대해 루프를 갖는 중첩 루프로 생각<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
27
둘 이상의 릴레이션을 포함하는 질의 (계속)<br />
LET the tuple variables in the FROM clause range over<br />
relations R1, R2, … , Rn;<br />
FOR each tuple t1 in relation R1 DO<br />
내포된 루프에 따른<br />
FOR each tuple t2 in relation R2 DO<br />
알고리즘<br />
. . .<br />
FOR each tuple tn in relation Rn DO<br />
IF the where clause is satisfied when the values<br />
from t1, t2, … , tn are substituted for all<br />
attribute references THEN<br />
evaluate the attributes of the select clause<br />
according to t1, t2, … , tn and produce the<br />
tuple of values that results.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
28
둘 이상의 릴레이션을 포함하는 질의 (계속)<br />
(예) 영화 Star Wars 의 제작자의 이름을 찾아라.<br />
SELECT name<br />
FROM Movie, MovieExec<br />
WHERE title = ‘Star Wars’ AND producerC# = cert#<br />
병렬 배정 (parallel assignments)<br />
릴레이션에 있는 튜플들의 모든 가능한 배정을 고려<br />
즉, (임의의 순서로) 병렬적으로 배정된다고 생각<br />
각 배정에 대해, WHERE 절이 true 인지 판단<br />
WHERE 절이 true 인 배정은 질의 결과로 고려<br />
즉, SELECT 절의 애트리뷰트에 사용<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
29
둘 이상의 릴레이션을 포함하는 질의 (계속)<br />
관계 대수로의 변환<br />
FROM 절의 릴레이션들로 카티션 프로덕트<br />
WHERE 절의 조건으로 선택 연산자 적용<br />
SELECT 절의 애트리뷰트들로 프로젝션<br />
SELECT name, address<br />
FROM Movie, MovieExec<br />
WHERE title = ‘Star Wars’ AND producerC# = cert#<br />
π name, address (σ title = ‘Star Wars’ AND producerC# = cert# (Movie ×<br />
MovieExec))<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
30
둘 이상의 릴레이션을 포함하는 질의 (계속)<br />
질의들의 합집합, 교집합, 차집합<br />
키워드: UNION, INTERSECT, EXCEPT<br />
(예) 재산이 $10,000,000 보다 많고 영화 임원인 모든<br />
여자 스타들의 이름과 주소를 찾아라.<br />
(SELECT name, address<br />
FROM MovieStar<br />
WHERE gender = ‘F’ )<br />
INTERSECT<br />
(SELECT name, address<br />
FROM MovieExec<br />
WHERE netWorth > 10000000);<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
31
부질의<br />
부질의<br />
다른 질의의 일부분으로 사용된 질의<br />
부질의는 릴레이션을 결과로 생성하는 수식<br />
WHERE 절에서 사용<br />
FROM 절에서 사용 가능<br />
부질의의 결과가 단일 상수일 때<br />
WHERE 절에서 다른 애트리뷰트와 직접 비교 가능<br />
두 개의 부질의가 하나의 질의를 형성<br />
UNION, INTERSECT, EXCEPT<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
32
부질의 (계속)<br />
(예) Los Angeles 에 위치한 영화회사의 사장이 제작한<br />
영화의 이름과 제작연도를 찾아라.<br />
Movie (title, year, length, inColor, studioName, producerC#)<br />
Studio (name, address, presC#)<br />
SELECT title, year<br />
FROM Movie<br />
WHERE producerC# IN<br />
(SELECT presC#<br />
FROM Studio<br />
WHERE address LIKE ‘%Los Angeles%’)<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
33
부질의 (계속)<br />
스칼라 값을 생성하는 부질의<br />
select-from-where 문에 의해 하나의 값만 생성될 때<br />
그 문장은 하나의 상수처럼 사용될 수 있다.<br />
(예) Star Wars 의 제작자를 찾아라.<br />
SELECT name<br />
single-row SELECT<br />
FROM MovieExec<br />
(singleton SELECT)<br />
WHERE cert# =<br />
(SELECT producerC#<br />
FROM Movie<br />
WHERE title = ‘Star Wars’);<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
34
부질의 (계속)<br />
릴레이션이 비교 대상이 되는 조건<br />
부질의 결과가 조건에 사용<br />
부울 값을 결과로 생성하는 프레디키트<br />
EXISTS R<br />
R: 릴레이션, s: 스칼라 값<br />
R 에 튜플이 하나라도 존재하면(iff) 참<br />
s IN R<br />
s 가 R 에 있는 값 중 어느 하나와 일치하면(iff) 참<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
35
부질의 (계속)<br />
s > ALL R<br />
s 가 단항(unary) 릴레이션 R 의 모든값보다크면(iff) 참<br />
s>ANY R<br />
“>” 연산자 대신 다른 비교 연산자 사용 가능<br />
s 가 단항 릴레이션 R 의 값 중 적어도 하나보다 크면(iff) 참<br />
“>” 연산자 대신 다른 비교 연산자 사용 가능<br />
EXIST와 IN은 프레디키트인 반면 ALL과 ANY(또는 SOME)은<br />
정량자(quantifier)이다.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
36
부질의 (계속)<br />
튜플이 비교 대상이 되는 조건<br />
<strong>SQL</strong>에서 하나의 튜플은 스칼라 값들의 리스트로 표현<br />
(123, ‘foo’), (name,address, networth)<br />
튜플 t 와 릴레이션 R 이 같은 요소들로 구성되어 있으면,<br />
t 와 R 은 비교가능<br />
t IN R<br />
t ANY R<br />
릴레이션 R 의 원소와 튜플을 비교할 때,<br />
R 의 애트리뷰트에 대한 표준 순서에 따라 애트리뷰트들을 비교<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
37
부질의 (계속)<br />
(예) Movie(title, year, length, inColor, studioName, producerC#)<br />
StarsIn(movieTitle, movieYear, starName)<br />
MovieExec(name, address, cert#, netWorth)<br />
Harrisonford 가 출연한 영화 제작자의 이름을 찾아라.<br />
SELECT name<br />
FROM MovieExec<br />
WHERE cert# IN<br />
중복(duplicates) 없음<br />
(SELECT producerC#<br />
FROM Movie<br />
WHERE (title, year) IN<br />
(SELECT movieTitle, movieYear<br />
FROM StarsIn<br />
WHERE starName = ‘Harrison Ford’));<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
38
부질의 (계속)<br />
(예 – 계속)<br />
내포된 질의는 하나의 select-from-where 문으로 변환 가능<br />
SELECT name<br />
FROM MovieExex, Movie, StarsIn<br />
WHERE cert# = producerC# AND<br />
title = movieTitle AND<br />
year = movieYear AND<br />
starName = ‘Harrison Ford’;<br />
FROM 절: 주 질의나 부질의에 사용된 릴레이션들<br />
WHERE 절: IN은 조인(Join)으로 대체<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
중복 발생 가능<br />
39
부질의 (계속)<br />
(예 – 계속) 중복 발생<br />
Harrison Ford - - - Star Wars - - - Steven Spielberg<br />
Harrison Ford - - - Indiana Jones - - - Steven Spielberg<br />
(H.F., t1, y1)<br />
(H.F., t2, y2)<br />
(t1, y1, c1)<br />
(t2, y2, c1)<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
(c1, n1)<br />
StarsIn Movie MovieExec<br />
40
부질의 (계속)<br />
상호 관련된 부질의 (correlated subquery)<br />
부질의의 외부에서 선언된 튜플 변수를,<br />
그 내부에서 사용하는 부질의<br />
(예) Movie(title, year, length, inColor, studioName, producerC#)<br />
둘 이상의 영화에 사용된 영화 제목을 찾아라.<br />
» 제목은 같으면서 제작연도가 다른 튜플들<br />
SELECT title<br />
FROM Movie AS Old<br />
WHERE year < ANY<br />
(SELECT year<br />
FROM MOVIE<br />
WHERE title = Old.title)<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
애트리뷰트 이름에 대한<br />
영역 규칙(scoping rules)<br />
에주목하라.<br />
41
부질의 (계속)<br />
FROM 절에 부질의 사용<br />
부질의의 결과 릴레이션으로 튜플 변수 선언<br />
이튜플변수를WHERE 절의 조건에 사용<br />
(예) Harrisonford 가 출연한 영화의 제작자 이름을 찾아라.<br />
SELECT Name<br />
FROM MovieExec, (SELECT producerC#<br />
FROM Movie, StarsIn<br />
WHERE title = movieTitle AND<br />
year = movieYear AND<br />
starname = ‘Harrison Ford’) Prod<br />
WHERE cert# = Prod.producerC#;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
42
부질의 (계속)<br />
<strong>SQL</strong> 조인 수식 (Join expressions)<br />
조인수식은그자체가질의일수도있고, 또는<br />
부질의로도 사용될 수 있다.<br />
CROSS JOIN: 카티션 프로덕트<br />
Movie CROSS JOIN StarsIn<br />
JOIN … ON: 세타 조인<br />
Movie JOIN StarsIn ON<br />
title = movieTitle AND year = movieYear;<br />
NATURAL JOIN: 자연 조인<br />
MovieStar NATURAL JOIN MovieExec<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
43
부질의 (계속)<br />
FROM 절의 조인 수식<br />
SELECT title, year, starName<br />
FROM Movie JOIN StarsIn ON<br />
title = movieTitle AND year = movieYear;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
44
부질의 (계속)<br />
외부조인(outerjoin)<br />
허상 튜플을 결과에 추가<br />
* 허상 튜플 (dangling tuple): 조인되지 못한 튜플<br />
조인되지 않은 경우 애트리뷰트들을 NULL 값으로 처리<br />
자연 외부조인<br />
NATURAL [LEFT | RIGHT | FULL] OUTER JOIN<br />
JOIN…ON 을 사용한 외부조인<br />
[LEFT | RIGHT | FULL] OUTER JOIN...ON<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
45
부질의 (계속)<br />
(예) MovieStar(name, address, gender, birthdate)<br />
MovieExec(name, address, cert#, netWorth)<br />
MovieStar NATURAL FULL OUTER JOIN MovieExec;<br />
name<br />
Mary T. Moore<br />
Tom hanks<br />
George Lucas<br />
address<br />
Maple St.<br />
Cherry Ln.<br />
Oak Rd.<br />
gender<br />
‘F’<br />
‘M’<br />
NULL<br />
birthdate<br />
9/9/99<br />
8/8/88<br />
NULL<br />
스타지만 임원이 아닌 (예: Tom hanks), 또는<br />
cert#<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
12345<br />
NULL<br />
23456<br />
networth<br />
$100…<br />
NULL<br />
$200…<br />
임원이지만 스타가 아닌(예: George Lucas) 사람들에 대한 정보도 함께 얻는다.<br />
46
부질의 (계속)<br />
(예) Movie NATURAL LEFT OUTER JOIN MovieExec;<br />
» 처음 두 튜플은 결과에 포함<br />
» 세번째튜플은결과에포함되지않음<br />
(예) Movie NATURAL RIGHT OUTER JOIN MovieExec;<br />
» 처음과 세 번째 튜플은 결과에 포함<br />
» 두번째튜플은결과에포함되지않음<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
47
부질의 (계속)<br />
(예) Movie FULL OUTER JOIN StarsIN ON<br />
title = movieTitle AND year = movieYear<br />
» On 조건을 만족하지 않는 Movie 튜플과 StarsIn 튜플들도 NULL이<br />
적절히 사용되어 결과에 포함<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
48
참고: <strong>SQL</strong>의 부울 수식에서 사용되는 프레디키트<br />
기본적인 비교 프레디키트: =, , , =<br />
LIKE 프레디키트<br />
IN 프레디키트<br />
title LIKE ‘%love%’<br />
튜플값 IN [부질의 | (값1,값2,…,값n)]<br />
IS NULL, IS NOT NULL, IS TRUE, IS FALSE, IS UNKNOWN 단항<br />
프레디키트<br />
studioName IS NULL; cost = 100 IS TRUE<br />
EXISTS와 UNIQUE 단항 프레디키트<br />
EXISTS subquery, UNIQUE subquery<br />
ANY(또는 SOME) 와 ALL: 비교 프레디키트와 같이 사용되는 정량자<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
49
릴레이션 전체를 다루는 연산<br />
중복(duplicates) 제거<br />
<strong>SQL</strong> 시스템은 일반적으로 중복을 제거하지 않는다.<br />
중복 제거: 키워드 DISTINCT<br />
SELECT DISTINCT name<br />
중복 제거 비용<br />
일반적으로 비용이 크다.<br />
릴레이션 정렬(sorting) 등을 이용<br />
DISTINCT 적용 시 신중할 것<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
50
릴레이션 전체를 다루는 연산 (계속)<br />
합집합, 교집합, 차집합에서의 중복<br />
합집합, 교집합, 차집합 연산들은 기본적으로 중복을 제거<br />
중복 제거 방지: 키워드 ALL<br />
R UNION ALL S<br />
(SELECT title, year FROM Movie)<br />
UNION ALL<br />
(SELECT movieTitle AS title, movieYear AS year<br />
FROM StarsIn);<br />
R INTERSECT ALL S<br />
R EXCEPT ALL S<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
51
릴레이션 전체를 다루는 연산 (계속)<br />
집단값(aggregation)<br />
집단값 연산자<br />
집단화 값을 생성하는 다섯 개의 연산자<br />
COUNT: 값들의 개수<br />
SUM: 한열에있는값들의합<br />
AVG: 한 열에있는값들의평균<br />
MIN: 한 열에있는값중최소값<br />
MAX: 한 열에있는값중최대값<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
52
릴레이션 전체를 다루는 연산 (계속)<br />
(예) SELECT COUNT(*)<br />
FROM MovieExec;<br />
* 는 집단값 연산자 중 COUNT에만사용할수있는용법<br />
(예) SELECT COUNT(DISTINCT name)<br />
FROM MovieExec;<br />
(예) SELECT AVG(netWorth)<br />
FROM MovieExec;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
* 는 튜플 전체를 나타낸다.<br />
53
릴레이션 전체를 다루는 연산 (계속)<br />
그룹화(grouping): GROUP BY 절<br />
어떤 열의 값에 따라 튜플들을 그룹화<br />
GROUP BY 다음에는 그룹화 애트리뷰트들을 나열한다.<br />
SELECT studioName, SUM(length)<br />
FROM Movie<br />
GROUP BY studioName;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
그룹화 애트리뷰트<br />
그룹의 집단 값<br />
집단값을 가진 SELECT 절에 집단값이 아닌 상태로 기술될 수 있는<br />
애트리뷰트는 그룹화 애트리뷰트 (즉, GROUP BY절에 나열된<br />
애트리뷰트) 뿐이다.<br />
54
릴레이션 전체를 다루는 연산 (계속)<br />
그룹에 대한 조건: HAVING 절<br />
그룹에 대한 조건 기술<br />
집단값의 특성을 사용<br />
(예) 1930년 이전에 적어도 하나의 영화를 제작한 적이<br />
있는 제작자에 대해, 제작자의 이름과 그 제작자가<br />
제작한 영화 상영시간의 합계를 구하라.<br />
SELECT name, SUM(length)<br />
FROM MovieExec, Movie<br />
WHERE producerC# = cert#<br />
GROUP BY name<br />
HAVING MIN(year) < 1930;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
그룹화 애트리뷰트는<br />
HAVING 절에<br />
집단값이 아닌<br />
상태로도 사용 가능<br />
(예) name LIKE ‘John%’<br />
55
릴레이션 전체를 다루는 연산 (계속)<br />
<strong>SQL</strong> 질의에서 절들의 순서<br />
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY<br />
WHERE 절: 조건을 만족하는 튜플<br />
HAVING 절: 조건을 만족하는 그룹<br />
해석 순서<br />
WHERE 절을 만족하는 튜플들만 선택<br />
이 튜플들은 GROUP BY 절에 있는 애트리뷰트들로<br />
그룹화<br />
HAVING 절을 만족하는 그룹들만 선택<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
56
<strong>데이터베이스</strong> 변경<br />
<strong>데이터베이스</strong> 변경(modification)<br />
삽입<br />
INSERT, DELETE, UPDATE<br />
INSERT INTO R(A1, … , An) VALUES (v1, … , vn);<br />
키워드 INSERT INTO,<br />
릴레이션 이름 R, 괄호로 묶인 애트리뷰트들의 리스트<br />
키워드 VALUES, 그리고 튜플 수식<br />
(예) INSERT INTO StarIn(movieTitle, movieYear, starName)<br />
VALUES(‘The Maltese Falcon’, 1942,‘Sydney Greenstreet’);<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
57
<strong>데이터베이스</strong> 변경 (계속)<br />
(예) INSERT INTO StarsIn<br />
VALUES(‘The Maltese Falcon’,1942,‘Sydney Greenstreet’);<br />
(예) Movie 릴레이션에는 언급되고 있지만, Studio 릴레이션에는<br />
나타나지 않은 모든 스튜디오를 Studio(name, address, presC#)<br />
릴레이션에 추가하라.<br />
INSERT INTO studio(name)<br />
SELECT DISTINCT studioName<br />
FROM Movie<br />
WHERE studioName NOT IN(SELECT name FROM Studio);<br />
추가된 튜플의 address와 presC# 애트리뷰트에는 NULL 값이 사용<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
58
<strong>데이터베이스</strong> 변경 (계속)<br />
삭제<br />
DELETE FROM R WHERE ;<br />
키워드 DELETE FROM<br />
릴레이션 이름, 예를 들어 R,<br />
키워드 WHERE, 그리고 조건<br />
(예) DELETE FROM StarsIn<br />
WHERE movieTitle = ‘The Maltese Falcon’ AND<br />
movieYear = 1942 AND starName = ‘Sydney<br />
Greenstreet’;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
59
<strong>데이터베이스</strong> 변경 (계속)<br />
갱신<br />
UPDATE R SET WHERE ;<br />
키워드 UPDATE, 릴레이션의 이름, 예를 들어 R,<br />
키워드 SET, 식(formula)들의 리스트,<br />
키워드 WHERE, 그리고 조건<br />
(예) 영화 임원이 스튜디오 사장인 경우 ‘Pres.’ 라는 직함을<br />
이름 앞에 붙여라.<br />
UPDATE MovieExec<br />
SET name = ‘Pres. ‘ || name<br />
WHERE cert# IN (SELECT presC# FROM Studio);<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
60
<strong>SQL</strong>에서 릴레이션 스키마의 정의<br />
데이터정의<strong>언어</strong>와데이터조작<strong>언어</strong><br />
데이터 정의 <strong>언어</strong> (DDL: Data Definition Language)<br />
<strong>데이터베이스</strong>에 있는 정보의 구조를 표현<br />
데이터 조작 <strong>언어</strong> (DML: Data Manipulation Language)<br />
질의와 변경<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
61
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
<strong>SQL</strong> 시스템에서 사용되는 주요 데이터 타입<br />
INT, INTEGER, SHORTINT<br />
FLOAT (or REAL), DOUBLE PRECISION, DECIMAL<br />
DECIMAL(n,d)<br />
십진수 n 개, 오른쪽으로부터 d 위치에 소수점<br />
(예) DECIMAL(6, 2): 0123.45<br />
NUMERIC: DECIMAL 과 유사<br />
CHAR(n), VARCHAR(n)<br />
고정 길이 또는 가변 길이의 문자열<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
62
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
BIT(n), BIT VARYING(n)<br />
고정 길이 또는 가변 길이의 비트열<br />
BOOLEAN<br />
TRUE, FALSE, UNKNOWN<br />
DATE 와 TIME<br />
특별한 형태의 문자열<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
63
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
테이블 선언: CREATE TABLE table-name<br />
CREATE TABLE<br />
릴레이션 이름; 애트리뷰트, 애트리뷰트 타입들의 리스트<br />
CREATE TABLE MovieStar (<br />
name CHAR(30),<br />
address VARCHAR(255),<br />
gender CHAR(1),<br />
birthdate DATE );<br />
테이블 삭제: DROP TABLE table-name<br />
DROP TABLE R;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
64
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
릴레이션 스카마의 변경: ALTER TABLE table-name<br />
ALTER TABLE<br />
테이블 이름, 키워드 ADD, 애트리뷰트 이름과 데이터 타입<br />
테이블 이름, 키워드 DROP, 애트리뷰트 이름<br />
ALTER TABLE MovieStar ADD phone CHAR(16);<br />
ALTER TABLE MovieStar DROP birthdate;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
65
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
디폴트 값<br />
구체적인 값이 주어지지 않았을 때는 NULL 값이 사용<br />
키워드 DEFAULT 와 특정 값 기술 가능<br />
gender CHAR(1) DEFAULT ‘?’,<br />
birthdate DATE DEFAULT DATE ‘0000-00-00’<br />
ALTER TABLE MovieStar ADD phone CHAR(16)<br />
DEFAULT ‘unlisted’;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
66
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
도메인<br />
어떤 데이터 타입을 나타내는 새로운 이름<br />
도메인 정의: CREATE DOMAIN<br />
CREATE DOMAIN AS ;<br />
CREATE DOMAIN MovieDomain AS VARCHAR(50)<br />
DEFAULT ‘unknown’;<br />
도메인은 애트리뷰트의 타입으로 사용될 수 있다.<br />
title MovieDomain<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
67
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
도메인에 지정된 디폴트 값을 변경: ALTER<br />
DOMAIN<br />
ALTER DOMAIN MovieDomain SET DEFAULT ‘no<br />
such title’;<br />
도메인을 삭제: DROP DOMAIN<br />
DROP DOMAIN MovieDomain;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
68
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
색인<br />
애트리뷰트 A 에 대한색인<br />
애트리뷰트 A 에 특정 값을 가지는 튜플들을 효과적으로 찾을 수<br />
있도록 지원해 주는 자료 구조<br />
(예) B + -tree, 해쉬 테이블<br />
색인은 <strong>SQL</strong> 표준 (<strong>SQL</strong>-99까지)에 포함되어 있지 않다.<br />
그러나 대부분의 상용 DBMS 가 색인을 지원<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
69
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
색인의 생성: CREATE INDEX<br />
CREATE INDEX ON <br />
CREATE INDEX YearIndex ON Movie(year);<br />
CREATE INDEX KeyIndex ON Movie(title, year);<br />
색인의 삭제: DROP INDEX<br />
DROP INDEX YearIndex;<br />
색인의 장단점: 질의 처리 속도가 빨라진다.<br />
그러나 삽입, 삭제, 갱신 연산은 복잡해진다.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
70
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
색인 선택 (Selection of Indexes)<br />
색인이 있으면,<br />
질의 처리 속도 향상<br />
변경 (삽입, 삭제, 갱신) 속도 저하<br />
질의 또는 변경의 비용<br />
접근하는 디스크 블록의 수<br />
데이터 블록 접근 비용 + 색인 블록 접근 비용<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
71
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
(예) StarsIn(movieTitle, movieYear, starName)<br />
(Q1) SELECT movieTitle, movieYear<br />
FROM StarsIn<br />
WHERE starName = s;<br />
(Q2) SELECT starName<br />
FROM StarsIn<br />
WHERE movieTitle = t AND movieYear = y;<br />
(I1) INSERT INTO StarsIn VALUES(t, y, s);<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
72
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
(예: 계속) 다음과 같이 가정하자.<br />
StarsIn 은 10개의 디스크 블록에 저장<br />
평균적으로,<br />
한 스타는 3 편의 영화, 한 영화에는 3 명의 스타가 출연<br />
특정 스타나 특정 영화에 대한 튜플들<br />
10 개의 디스크 블록들에 분산<br />
즉, 특정 영화의 3 튜플들 접근: 3 디스크 블록 접근<br />
색인 읽기(read): 디스크 블록 1 번 접근<br />
색인 변경(modification)에는디스크블록두번접근<br />
데이터 삽입: 디스크 블록 2 번 접근<br />
적당한 디스크 블록을 찾고, 그 블록을 다시 기록<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
73
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
(예: 계속) Q1, Q2, I1 의 빈도<br />
Q1: 전체의 p1 %<br />
Q2: 전체의 p2 %<br />
I1: 전체의 1-p1-p2 %<br />
Action<br />
Q1<br />
Q2<br />
I1<br />
평균 비용<br />
f 1 (Q1)+ f 2 (Q2)+<br />
f 3 (I1)<br />
No Index<br />
10<br />
10<br />
2<br />
2+8p1+8p2<br />
Star Index<br />
4<br />
10<br />
4<br />
4+6p2<br />
Movie Index<br />
10<br />
4<br />
4<br />
4+6p1<br />
질의 및 삽입에 따른 비용<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
색인: 디스크블록 1 번<br />
데이터: 디스크블록 3 번<br />
색인: 디스크블록 2 번<br />
데이터: 디스크블록 2 번<br />
Both Indexes<br />
4<br />
4<br />
6<br />
6-2p1-2p2<br />
10p1+4p2+4(1-p1-p2)<br />
74
<strong>SQL</strong>에서 릴레이션 스키마의 정의 (계속)<br />
(예: 계속) p1, p2 의 값에따른비용<br />
p1 = p2 = 0.1 : 삽입이 많은 경우<br />
2 + 8p1 + 8p2 가 최소<br />
색인이 필요 없음<br />
p1 = p2 = 0.4 : 질의 Q1과 Q2가 많은경우<br />
6 - 2p1 - 2p2 가 최소<br />
두색인모두필요<br />
p1 = 0.5, p2 = 0.1 : 질의 Q1 이많은경우<br />
4 + 6p2 가 최소<br />
starName 에 대한색인필요<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
75
뷰<br />
CREATE TABLE 문을 이용하여 정의된 릴레이션은 실제로<br />
DB 내에 존재하는 반면, 뷰(view)는 물리적으로 존재하지<br />
않는다.<br />
뷰의 선언<br />
CREATE VIEW AS <br />
는 하나의 질의로 간주될 수 있다.<br />
CREATE VIEW ParamountMovie AS<br />
SELECT title, year<br />
FROM Movie<br />
WHERE studioName = ‘Paramount’;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
76
뷰 (계속)<br />
테이블은 물리적으로 튜플들이 존재하는 릴레이션<br />
기본(base) 테이블 또는 기본 릴레이션이라 한다.<br />
저장된(stored) 테이블 또는 저장된 릴레이션이라고도 한다.<br />
뷰는 가상(virtual) 릴레이션이다.<br />
질의 처리 도중에 임시로 생성되는 릴레이션은<br />
임시(temporary) 릴레이션이라 한다.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
77
뷰 (계속)<br />
뷰에 대한 질의<br />
뷰정의<br />
질의에<br />
AND 로<br />
새로운<br />
조건 추가<br />
해당 튜플들을 기본 릴레이션으로부터 가져온다.<br />
뷰에 대한 질의를 기본 테이블에 대한 질의로 변환<br />
SELECT title<br />
FROM ParamountMovie<br />
WHERE year = 1979;<br />
<br />
SELECT title<br />
FROM Movie<br />
뷰<br />
기본 테이블<br />
WHERE studioName = ‘Paramount’ AND year = 1979;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
질의 변경<br />
(query modification)<br />
78
뷰 (계속)<br />
기본 릴레이션과 뷰를 포함한 질의<br />
(예) Paramount 에서 제작한 영화에 출연한 스타들을 찾아라.<br />
SELECT DISTINCT starName<br />
FROM ParamountMovie, StarsIn<br />
WHERE title = movieTitle AND year = movieYear;<br />
여러 릴레이션들로 정의된 뷰<br />
(예) 영화 제목과 그 영화의 제작자로 이루어진 뷰.<br />
CREATE VIEW MovieProd AS<br />
SELECT title, name<br />
FROM Movie, MovieExec<br />
WHERE producerC# = cert#;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
79
뷰 (계속)<br />
애트리뷰트 이름의 변경<br />
뷰에서 애트리뷰트들의 이름을 새로 부여할 수 있다.<br />
CERATE VIEW MovieProd(movieTitle, prodName) AS<br />
SELECT title, name<br />
FROM Movie, MovieExec<br />
WHERE producerC# = cert#<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
80
뷰 (계속)<br />
뷰의 변경<br />
뷰는 갱신 가능(updatable)할 수도, 가능하지않을수도있다.<br />
<strong>SQL</strong> 에서는, 대체로 하나의 릴레이션 R로부터 정의된<br />
뷰에 대해서만 변경을 허용한다. 그리고,<br />
다음을 만족해야 한다.<br />
SELECT 절에는 충분한 애트리뷰트들이 있어야 한다.<br />
(예1) 키 애트리뷰트들은 NULL이 아니어야 한다. NOT NULL<br />
제약을 위반해서는 안 됨.<br />
(예2) 뷰를 통해 삽입된 튜플은 그 뷰를 통해 볼 수 있어야 함<br />
WHERE 절에 있는 부질의는 릴레이션 R을 포함해서는안됨.<br />
correlated subquery 허용안함<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
81
뷰 (계속)<br />
(예) 뷰 ParamountMovie에 다음과 같은 튜플을 삽입한다고 하자.<br />
INSERT INTO ParamountMovie<br />
VALUES(‘Star Trek’, 1979)<br />
studioName 애트리뷰트가 뷰의 애트리뷰트에 포함되어 있지 않으므로, 뷰에<br />
삽입되는 튜플이 Movie 테이블에 반영될 때 studioName값에는 NULL이<br />
들어간다. 이 튜플은ParamountMovie의 조건을 만족하지 않는다. 즉,<br />
ParamountMovie 뷰에 나타나지 않는다.<br />
따라서 뷰 ParamountMovie는 다음과 같이 수정되어야 한다:<br />
CREATE VIEW ParamountMovie AS<br />
SELECT studioName, title, year<br />
FROM Movie<br />
WHERE studioName = ‘Paramount’;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
82
뷰정의(계속)<br />
(예) 갱신가능 뷰로부터 튜플을 삭제<br />
DELETE FROM ParamountMovie<br />
WHERE title LIKE ‘%Trek%’;<br />
(예) 갱신가능 뷰에 대한 갱신<br />
UPDATE ParamountMovie<br />
SET year = 1979<br />
WHERE title = ‘Star Trek the Movie’;<br />
뷰의 삭제<br />
DROP VIEW ParamountMovie;<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
83
참고: 뷰의 갱신 가능성<br />
Movie(title, year, length, inColor, studioName, producerC#)<br />
MovieExec(name, address, cert#, netWorth)<br />
CREATE VIEW MovieProd AS<br />
SELECT title, name<br />
FROM Movie, MovieExec<br />
WHERE producerC# = cert#;<br />
다음과 같은 튜플을 뷰 MovieProd에 삽입하려 한다고 하자:<br />
(‘Greatest Show on Earth’, ‘cecil B. DeMille’)<br />
Movie와 MovieExec의 키는NULL이면 안 된다.<br />
조인이 이루어지는 애트리뷰트들에 NULL 값이 들어간다.<br />
두 NULL 값은 동일하지 않음에 주목하라.<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
84
뷰 (계속)<br />
뷰를 포함하는 질의의 해석<br />
기본적인 개념: 뷰에 대한 질의의 수식 트리를 기본<br />
테이블에 대한 질의의 수식 트리로 변환<br />
뷰에 대한 질의의<br />
수식 트리<br />
뷰에<br />
대한참조<br />
Q<br />
V W<br />
뷰에 대한 참조를 뷰의 정의로 대체<br />
(Q: 질의, V, W: 뷰)<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
기본 테이블에 대한<br />
질의의 수식 트리<br />
뷰정의<br />
85
뷰 (계속)<br />
CREATE VIEW ParamountMovie AS<br />
SELECT title, year<br />
FROM Movie<br />
WHERE studioName = ‘Paramount’;<br />
π title, year<br />
σ studioName = ‘Paramount’<br />
Movie<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
뷰 Paramount에<br />
대한 질의<br />
이 뷰를 정의하는 질의의<br />
수식 트리<br />
86
뷰 (계속)<br />
SELECT title<br />
FROM ParamountMovie<br />
WHERE year = 1979;<br />
π title<br />
σ year=1979<br />
π title, year<br />
σ studioName = ‘Paramount’<br />
Movie<br />
기본 테이블을 사용한 질의의 수식 트리<br />
CSE310 <strong>데이터베이스</strong> By Prof. Jin Hyun Son<br />
π title<br />
σ year=1979<br />
ParamountMovie<br />
질의에 대한 수식 트리<br />
π title<br />
σ year=1979 AND studioName = ‘Paramount’<br />
Movie<br />
단순화된 질의<br />
87