Predicate calculus에 기반
Predicate = 실행 결과가 반드시 참(true)이나 거짓(false)인 함수
R은 t의 범위 릴레이션
student (s)
s.Sno
t : 튜플변수
R: t의 범위 릴레이션
3-2) 조건식 t.A θ u.B
A, B : 애트리뷰트
θ : 비교 연산자(=, ≠, <, ≤, >,≥)
t.A = s.B 참 거짓 판별
원자식의 실행 결과는 반드시 참(True) 또는 거짓(False)
불리언 연산자(∧,∨, ¬)
∧ - AND
∨ - OR
¬ - NOT
∀ - 전체정량자
For every
∀x – 모든 x에 대해서 ~한 조건을 만족하면 참, 아니면 거짓
∃ - 존재정량자
For some
∃x – ~한 조건을 만족하는 것이 하나라도 있다면 참, 없으면 거짓
s.Sno = 100 원자식
c.Cno ≠ e.Cno 원자식
s.Sno = e.Sno ∧ e.Cno ≠ c.Cno 원자식간의 불리언 연산자
(∃e)(e.Sno = s.Sno ∧ e.Cno = 'C413') 원자식간의 불리언 연산자의 존재정량자
자유변수 :
속박변수 :
{ t1.A1, t2.A2, …, tn.An|F(t1, … tn, tn+1, …, tn+m) } 조건제시법
{s.Sname|STUDENT(s) }
s는 student의 어떠한 변수를 가르킴. 이중에서 s.name을 꺼내라
{s.Sname|STUDENT(s) ∧ s.Dept=‘컴퓨터’ }
S 변수가 학생 릴리이션에 어떠한 것을 가르킴. 이 때 dept가 컴퓨터인 경우 결과가 참임. s.Sname에 참인 결과값들이 들어감
{s.Sname, s.Dept|STUDENT(s) ∧(∃e)(ENROL(e) ∧ s.Sno=e.Sno ∧ e.Grade='A')}
S 변수가 학생 릴리이션에 어떠한 것을 가르킴
어떠한 e에 대해서(Enroll을 가르키는 e 중에서) S.Sno와 e.Sno 를 만족하고, e.grade가 A이냐
두개 다 만족하면 ok 둘중 하나라도 만족하는 (정량자 존재) 경우를 가지고 옴
s.Sno=e.Sno ∧ e.Grade='A')} -> join 한 효과
답) {e.Sno|ENROL(e) ∧ e.Cno='C413'∧ e.Grade='A' }
풀이) 3개가 다 있는 릴레이션은 등록 릴레이션
e 가 등록을 가르키고 e.Cno='C413'∧ e.Grade='A' c413과 성적 a를 확인하고 있다면 학번을 결과로 보냄
답) { s.Sname, s.Dept|STUDENT(s) ∧ ∃e(ENROL(e) ∧ s.Sno=e.Sno ∧ e.Cno='C413’) }
풀이) 이름학과정보가 있는 학생과 과목정보가 있는 등록을 join해서 검색해야함. 따라서 s.Sno=e.Sno ∧ e.Cno='C413’ 를 통해 조인하고 c413을 듣는 경우를 찾음. 맞으면 이름 학과 출력
학생과 등록을 join해서 검색해야함
따라서 ∧ s.Sno=e.Sno ∧ e.Cno='C413’) 를 통해 조인하고 c413을 듣는 경우를 찾음
맞으면 이름 학과 출력
답) { s.Sname|STUDENT(s) ∧ (∀c)(∃e)(COURSE(c) ∧ENROL(e)∧ e.Sno=s.Sno ∧ e.Cno=c.Cno) }
풀이) 학생이름 출력을 위해 학생 릴레이션 가르키는 s
과목을 가르키는 변수 c가 있음
등록을 가르키는 변수 e가 있음
c변수가 모든 변수에 만족해야함.
e.Sno=s.Sno ∧ e.Cno=c.Cno 해당 식을 통해서 조인을 한다. 모든 과목에 대해 등록에 하나라도 있고, 모든 결과가 조인에 있다면 반환한다.
답) {s.Sname|STUDENT(s) ∧ (┐∃e)(ENROL(e) ∧ s.Sno=e.Sno ∧ e.Cno=‘C413’) }
풀이) e에서 s.Sno=e.Sno이고 e.Cno=‘C413’ 인것이 하나라도 있으면 참을 반환하지만 앞에 not 이라 부정으로 돌림. 따라서 등록되지 않은 학생들을 전부 가지고 옴. 결과에 따라 이름 출력
ex) xSno, xSname, xDept, xYear, …
① 범위 식, R(x1,x2,…,xn)
xi : 도메인 변수
R : xi의 범위 릴레이션
<x1,x2,…,xn>에 대응하는 값의 리스트는 릴레이션 R의 투플
② 조건 식, x θ y
x, y : 도메인 변수
θ: 비교 연산자(=, ≠, <, ≤, >,≥)
③ 조건 식, x θ c
x : 도메인 변수
c : x가 정의된 도메인 값의 상수
원자 식의 실행 결과는 반드시 참(True) 또는 거짓(False)
불리언 연산자(∧,∨, ¬)
∧ - AND
∨ - OR
¬ - NOT
∀ - 전체정량자
For every
∀x – 모든 x에 대해서 ~한 조건을 만족하면 참, 아니면 거짓
∃ - 존재정량자
For some
∃x – ~한 조건을 만족하는 것이 하나라도 있다면 참, 없으면 거짓
상동
{ x1,x2,…,xn|F(x1,…,xn,xn+1,…,xn+m) }
xi: 도메인변수
F(x1,…,xn,xn+1,…,xn+m) : xi가 관련된 정형식
막대 (|) 왼편에 명세된 n 도메인 변수들은 목표 리스트로서막대 (|) 오른편에 명세된 조건(정형식)을 만족하는 도메인값으로 만들어지는 투플을 표현
답 ) {xSname|(∃xYear)(∃xDept) (STUDENT(xSno, xSname, xYear, xDept) ∧ xYear ≥ 3∧ xDept='컴퓨터' ) }
해석) 학생 릴레이션에서 각각의 4개가 도메인 변수 (xSno, xSname, xYear, xDept)를 선언, xYear가 3이상이고 xDept가 컴퓨터인것을 찾는다. 그런것이 한 개라도 있다면 (∃) 이름 출력
답) { xSno|(∃xCno)(∃xGrade) (ENROL(xSno, xCno, xGrade, xMidterm, xFinal) ∧ xCno= ‘C413’ ∧ xGrade=‘A’) }
풀이) 등록 릴레이션의 각 도메인 변수에서 과목 c413과 성적 a가 둘다 존재하면 (and 연산) 학번 출력한다
답) {xSno,xSname|(STUDENT(xSno,xSname,xYear,xDept) ∧ (∃xFinal)(∃xxSno) (ENROL(xxSno, xCno, xGrade, xMidterm, xFinal)∧xSno=xxSno ∧ xFinal ≥ 90) }
Student 릴레이션의 각각의 도메인 지칭. Enrol의 각각의 도메인 지칭. 그 후 두 릴레이션간의 학번이 같으면서(동일인물) 기말성적이 90점 이상인 조건에 맞는 경우 이름, 학번
답) { xSname|(∃xSno) ((STUDENT(xSname, xSno, xYear, xDept) ∧ (┐∃xxSno) (∃xCno) (ENROL(xxSno, xCno, xGrade, xMidterm, xFinal) ∧ xSno=xxSno ∧ xCno='C324')) }
Student 릴레이션의 각각의 도메인 지칭. Enrol의 각각의 도메인 지칭. 그 후 두 릴레이션의 학생넘버가 같은 경우 중, 과목번호가 C324인 경우 반환을 하나, not이 붙어서 반전해서 없는 경우를 반환함