Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 제 4 장 SQL 기본 구조 집합 연산 집성 함수 널 값 중첩 부 질의 유도 릴레이션 뷰 데이터베이스의 수정 죠인 릴레이션 데이터 정의어 내포 SQL Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 기본 구조 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 select 절 select 절은 관계형 대수의 추출 연산에 대응한다. 질의의 결과로 바라는 애트리뷰트를 나열하는데 사용한다. loan 릴레이션내의 모든 지점명을 찾아라. select branch-name from loan 순수 관계형 대수 구문에서는 이 질의는 다음과 같다. branch-name (loan) select 절의 *는 “모든 애트리뷰트”를 의미한다. select * Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 select 절(계속) SQL은 질의 결과와 함께 릴레이션내의 중복을 허용한다. 중복을 제거하려면 select 다음에 키워드 distinct를 기입한다. loan 릴레이션내의 모든 지점명을 찾아 중복은 제거하라. select distinct branch-name from loan 키워드 all은 중복이 제거되지 않도록 한다. select all branch-name Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 select 절(계속) select 절에는 연산자 +,-,* 및 /를 내포한 산술 표현식과 상수 또는 튜플의 애트리뷰트 상의 연산을 내포할 수 있 다. 질의: select branch-name, loan-number, amount* 100 from loan 위의 질의는 애트리뷰트 amount에 100이 곱해진 것을 제 외하고는 loan 릴레이션과 같은 릴레이션을 돌려준다. Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 where 절(계속) SQL에는 어떤 값보다 작거나 같고 다른 값보다 크거나 같음을 나타내는 where 절을 단순히 하기 위해 between 비교 연산자를 포함한다. 대출액이 90,000불에서 100,000불 사이인 대출의 대출 번호를 찾아라. select loan-number from loan where amount between 90000 and 100000 Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 from 절 from 절은 관계형 대수의 카티전 곱 연산에 대응한다. 표현식의 계산에서 검색될 릴레이션들을 나열한다. 카티전 곱 borrower loan 을 찾아라. select * from borrower, loan Perryridge 지점에 대출이 있는 모든 고객명과 대출 번호를 찾아라. select distinct customer-name, borrower.loan-number where borrower.loan-number = loan.loan-number and branch-name = “Perryridge” Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 재명명 연산 릴레이션과 애트리뷰트의 재명명을 위한 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 튜플 변수 튜플 변수는 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 스트링 연산 SQL에는 문자열 비교를 위한 문자열-매칭 연산자를 내포한다. 패 턴은 두 개의 특수 문자를 사용해 기술한다. - %는 어떠한 부 문자열과 부합한다. - _는 어떤 문자와 부합한다. 거리명에 부 문자열 “Main”을 내포한 모든 고객명을 찾아라. select customer-name from customer where customer-street like “%Main%’ 이름 “Main%”와 부합하는 것 like “Main\%” escape “\” Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 튜플 출력의 순서화 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 중복 중복이 있는 릴레이션에서 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 중복(계속) 스키마 (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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집합 연산 집합 연산 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집합연산(계속) 대출, 예금 또는 모두를 가진 고객을 찾아라. (select customer-name from depositor) union (select customer-name from borrower) 대출과 예금을 모두 가진 고객을 찾아라. intersect 예금은 있으나 대출은 없는 고객을 찾아라. except Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집성 함수 이들 함수는 릴레이션의 행의 다중 집합 값에 연산하여 단일 값을 돌려준다. avg: 평균 값 min: 최소 값 max: 최대 값 sum: 총 계 count: 값의 개수 Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집성함수(계속) Perryridge 지점의 평균 예금 잔고를 찾아라. select avg(balance) from account where branch-name = “Perryridge” customer 릴레이션의 튜플 수를 찾아라. select count(*) from customer 은행의 예금자 수를 찾아라. select count(distinct customer-name) from depositor Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집성함수 - 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집성함수 - Having 절 평균 예금 잔고가 1,200불을 초과하는 모든 지점명을 찾아라. select branch-name, avg(balance) from account group by branch-name having avg(balance) > 1200 유의 : having 절의 술어는 그룹이 이루어진 후에 적용 된다. Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 널 값 어떤 애트리뷰트에 대해 튜플이 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 널 값(계속) loan 릴레이션 내의 amount에 널 값이 있는 모든 대출 번호를 찾아 라. select loan-number from loan where amount is null 모든 대출액의 총계 select sum (amount) 위의 문장은 널 값은 무시한다. 널이 아닌 금액이 없으면 결과는 널이다. count(*)를 제외한 모든 집성 연산은 집성 애트리뷰트 상에 널 값 을 가진 튜플은 무시한다. Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 중첩 부 질의 SQL에서는 중첩 부 질의 기법을 제공한다. 부 질의는 다른 질의 내에 내포되는 select-from-where 표현식이다. 부 질의의 공통적인 사용은 집합 멤버쉽, 집합 비교 및 집합 수의 테스트를 수행하는 것이다. Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집합 멤버쉽 F in r t r (t = F) (5 in 4 ) = true 5 ) = false 6 not Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 은행에 예금과 대출이 모두 있는 고객을 찾아라. select distinct customer-name from borrower where customer-name in (select customer-name from depositor) 은행에 대출은 있으나 예금은 없는 모든 고객을 찾아라. where customer-name not in ( select customer-name Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 집합 비교 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 some 절 F<comp> some r t(t r [F <comp> t]) 여기서 <comp>는 다음 중 하나일 수 있다 : <, , >, , =, (다음과 같이 읽는다: 5 < 릴레이션내의 튜플) (= some) in 그러나, ( some) ≡not in (5 < some 5 ) = true 6 ) = false (5 = some (5 some ) = true (0 5 이기때문에) Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 Brooklyn에 위치한 어떤 지점보다 더 많은 자산을 가진 모든 지점을 찾아라. select branch-name from branch where assets > some (select assets where branch-city = “Brooklyn”) Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 all 절 F<comp> all r t(t r [F <comp> t]) ( all) not in 그러나, (= all) ≡in (5 < all 5 ) = false 6 10 ) = true 4 (5 = (5 ¹ all ) = true (5 ¹ 4 이고 5 ¹ 6 이기 때문에) Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 Brooklyn에 위치한 모든 지점보다 더 많은 자산을 가진 모든 지점을 찾아라. select branch-name from branch where assets > all (select assets where branch-city = “Brooklyn”) Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 빈 릴레이션 검사 exists 구조는 매개 변수 부 질의가 empty가 아니면 참 값을 돌려준다. exists r r not exists r r = Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 중복 튜플의 부재 검사 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 유도 릴레이션 평균 예금 잔고가 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 뷰 어떤 사용자의 뷰로부터 어떤 데이터를 숨기는 방법을 제공한다. 뷰를 생성하려면 다음과 같은 명령을 사용한다. create view v as <질의 표현식> 여기서: - <질의 표현식>은 적법한 표현식이다. - 뷰명은 v로 표현된다. Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 지점과 그들의 고객으로 구성된 뷰 create view all-customer as (select branch-name, customer-name from depositor, account where depositor.account-number = account.account-number) union from borrower, loan where borrower.loan-number = loan.loan-number) Perryridge 지점의 모든 고객을 찾아라. select customer-name from all-customer where branch-name = “Perryridge” Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 데이터베이스의 수정 - 삭제 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 은행의 평균에 미달하는 잔고를 가진 모든 예금 계좌 레코드를 삭 제하라. delete from account where balance < (select avg (balance) from account) - 문제점: deposit에서 튜플들을 삭제하므로 평균 잔고가 변한다. - SQL에서 사용되는 해결책: 1. 먼저, avg balance를 계산하고 삭제할 모든 튜플을 찾는다. 2. 다음, 위에서 찾은 모든 튜플을 삭제한다 (avg를 다시 계산하 거나 튜플을 재 검사하지 않고). Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 데이터베이스의 수정 - 삽입 account 에 새로운 튜플을 삽입하라. insert into account values(“Perryridge”, A-9732, 1200) 위와 동등한 표현은 아래와 같다. insert into account (branch-name, balance, account-number) values(“Perryridge”, 1200, A-9732) account에 balance 값이 널로 지정된 튜플을 삽입하라. values (“Perryridge”, A-777, null) Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 데이터베이스의 수정 - 삽입 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 and loan.account-number = borrower.account-number Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 데이터베이스의 수정 - 갱신 10,000 불을 초과하는 모든 예금 계좌에는 6%를 다른 계좌에는 5%의 이자를 지급하라. - 두 개의 update문으로 작성하라. update account set balance = balance * 1.06 where balance > 10000 set balance = balance * 1.05 where balance 10000 - 순서가 중요하다. - case 문장을 사용하면 더 좋다 (연습문제 4.11). Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 뷰의 갱신 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 죠인 릴레이션 죠인 연산은 두 릴레이션을 취해 또 다른 릴레이션을 결과로 돌려준다. 이들 부가적인 연산은 일반적으로 from 절 내의 부 질의 표현식으로 사용된다. 죠인 조건 - 두 릴레이션내의 어떤 튜플들이 부합하고 죠인 결과에 어떤 애트리뷰트가 나타날지를 정한다. 죠인 유형 - 다른 릴레이션의 어떤 튜플과 부합하지 않는 튜플들을 어떻게 취급할 것인가(죠인 조건에 근거해)를 정한다. < 1 2 죠인 유형 조건 inner join left outer join right outer join full outer join natrual on 술어 > using (A , A , . . . , A n ) Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 죠인 릴레이션 - 예제 데이터 집합 릴레이션 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 Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 죠인 릴레이션 - 예제 loan inner join borrower on loan.loan-number = borrower.loan-number loan left outer join borrower on 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 Perryridge L-170 L-230 L-260 3000 4000 1700 Jones Smith null Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 죠인 릴레이션 - 예제 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 Jones Smith Hayes Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 죠인 릴레이션 - 예제 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 Jones Smith Hayes Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 데이터 정의어 다음과 같이 릴레이션 집합 뿐만 아니라 각 릴레이션에 관한 정보의 지정을 허용한다. 각 릴레이션의 스키마 각 애트리뷰트에 관련된 값들의 도메인 무결성 제약 조건 각 릴레이션에 유지되어야 할 인덱스 집합 각 릴레이션에 대한 정보 보안과 인증 디스크 상의 각 릴레이션의 물리적 저장 구조 Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 SQL에서의 도메인 유형 char(n). 사용자가 지정한 길이 n을 가진 고정길이 문자열 varchar(n). 사용자가 지정한 최대 길이 n을 가진 가변길이 문자열 int. 정수(기계 종속인 정수들의 유한 부분 집합) smallint. 작은 정수(integer 도메인 유형의 기계 종속 부분 집합) numeric(p,d). 사용자가 지정한 정밀도 p 자리수와 소수점 이하 n 자리를 가진 고정점 수 Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 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 char(15) not null, branch-city char(30), assets integer) Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수
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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 내포 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 예제 질의 주 언어내로 부터, 어떤 계좌내의 변수 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 내포 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 동적 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 서울산업대학교 전자계산학과 석상기 교수
Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수 기타 SQL 기능 4세대 언어 - 사용자 인터페이스용 화면의 틀을 생성하고 보고서 생성을 위해 데이터를 포매팅하는 어플리케이션 프로그래머를 지원하는 특수 언어. 대부분의 상용 데이터베이스 제품에서 이용 가능. SQL 세션 - 클라이언트와 서버의 추상화를 제공(원격 가능) - 클라이언트는 SQL 서버에 연결하여 세션을 형성 - 일련의 문장을 실행 - 세션의 단절 - 세션에서 수행된 작업을 완료하거나 복귀할 수 있다. SQL 환경에는 사용자 식별자와 세션이 사용하고 있는 여러 스키마중의 하나를 식별하는 스키마 등을 포함한 여러 구성 요소를 내포하고 있다. Copyrightⓒ 1999 서울산업대학교 전자계산학과 석상기 교수