09.06.2013 Views

6장: 데이터베이스 언어 SQL

6장: 데이터베이스 언어 SQL

6장: 데이터베이스 언어 SQL

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!