데이터 모델 = 자료구조(Data Structure) + 작업(Operations) + 제약조건(Constraints)
관계형 데이터 작업에는 두가지 관점이 존재한다.
먼저 "Relational Algebra"는 어떻게 결과를 얻을 것인지 표현하는 절차지향적 언어를 사용한다.
그 다음은 "Relational Calculus"는 무슨 결과를 얻을 것인지 표현하는 비절차지향적 언어를 사용한다.
위의 두가지 역할은 쿼리 언어의 표현력(expressiveness) 과 유용성(usefulness) 을 평가하는 것이다. 이것은 서로 기능적으로 동일한 것을 의미하지만, 접근 방식과 표현방식을 다르게 보여준다.
relational algebra나 relational calculus를 사용하여 표현될 수 있는 쿼리는 "관계적으로 완전하다(relationally complete)"고 말한다.
: 어떻게 결과를 가져오는지 순차적인 작업을 보여줌으로써 묘사한다
Closure Property 폐쇄적인 특성이란?
- 입력과 출력은 모두 서로 관계를 가진다
- 그래서 한 연산의 출력을 다른 연산의 입력으로 사용하면서, 여러 연산을 구성할 수 있는 특징
다음의 연산들은 집합 R과 집합 S가 다음을 만족해야한다.
1) attributes 갯수
2) 동일한 attribute domains
다음과 같은 4가지의 종류가 있다.
: 합집합

: 교집합

: 차집합

: 두테이블의 모든 튜플을 연산하는 것을 의미한다.

: 선택 조건에 따라서 튜플의 부분집합을 선택하는데 사용하는 연산자이다.
sql 예시: Student 테이블에서 dept가 'CS'인 것만 추출
SELECT * FROM Student WHERE dept = 'CS';

: 입력관계에서 특정 attribute만 리턴하는 연산자이다.
sql 예시: Student 테이블에서 name과 dept 속성만 추출
SELECT name, dept FROM Student;

: 두 관계를 공통 attribute를 기반으로 결합한다.
예시: Student테이블과 Enroll테이블을 공통 속성 sid로 결합.
SELECT * FROM Student JOIN Enroll ON Student.sid = Enroll.sid;

: 모든 튜플 쌍을 결합한 후 조건 theta에 맞는 튜플만 결과로 도출하는 연산이다.
sql 예시:Student와 Enroll을 sid로 조인하면서 grade ≥ 90 조건 추가
SELECT * FROM Student s, Enroll e WHERE s.sid = e.sid AND e.grade >= 90;
: 동일한 이름과 도메인을 가진 모든 속성에 대해 두 관계를 자동으로 join하는 일종의 동등조인(equijoin)이다.
Student와 Enroll 테이블을 공통 속성(sid) 기준으로 자동 조인
SELECT * FROM Student NATURAL JOIN Enroll;
: S에 있는 모든 튜플과 결합합 R의 튜플들로 구성된 관계를 도출한다.
요구사항
- R은 S의 모든 열을(attribute)을 가져야한다.
-공통 열의 domain은 짝이 지어져야만 한다.
예시 시나리오:
R(Student, Course) : 학생이 수강한 과목
S(Course) : 필수 과목 집합
-> 학생-과목이 매칭되어있는 테이블R에서 필수과목테이블S을 통해 필수과목을 모두 수강한 학생을 찾기SELECT DISTINCT r.Student FROM R r WHERE NOT EXISTS ( SELECT s.Course FROM S s WHERE NOT EXISTS ( SELECT * FROM R r2 WHERE r2.Student = r.Student AND r2.Course = s.Course ) );
:한쪽 테이블 속성값 결과만 반환
예시: Enroll에 등록된 학생만 반환 (Enroll의 속성은 출력 안 함)
SELECT DISTINCT s.* FROM Student s WHERE EXISTS ( SELECT 1 FROM Enroll e WHERE s.sid = e.sid );
예시
----------------------------------------------- Left Outer Join SELECT * FROM Student s LEFT OUTER JOIN Enroll e ON s.sid = e.sid; ----------------------------------------------- Right Outer Join SELECT * FROM Student s RIGHT OUTER JOIN Enroll e ON s.sid = e.sid; ---------------------------- Full Outer Join (MySQL은 지원X, UNION) SELECT * FROM Student s LEFT JOIN Enroll e ON s.sid = e.sid UNION SELECT * FROM Student s RIGHT JOIN Enroll e ON s.sid = e.sid;
" = ~~한 조건을 만족하는 데이터를 주세요"
Relational Algebra와 다르게 어떻게 얻을지에 초점이 맞춰져있는 것이 아니라, 어떤 데이터를 원하는지를 나타내는 선언적인 쿼리 언어이다.(비절차적 언어)
수학적인 논리 형식으로 구현되어있고, 요구되는 결과의 특성을 묘사하는 쿼리들로 표현되어있다.
Relational Culculus의 종류는 다음과 같다.
형식
{ t | P(t) }
학생 테이블 Student(sid, name, dept)에서 dept='CS'인 학생 이름 찾기
{ t.name | t ∈ Student ∧ t.dept = 'CS' }
형식
{ <x1, x2, ..., xn> | P(x1, x2, ..., xn) }
학생 테이블 Student(sid, name, dept)에서 dept='CS'인 학생 이름 찾기
{ | ∃ sid, dept ( (sid, name, dept) ∈ Student ∧ dept = 'CS' ) }
// 수정이 필요한 부분이 있다면 댓글로 알려주세요!