관계 대수 : 어떻게 데이터를 찾는지에 대한 질의를 수행할 것인가를 명시하는 절차적 언어
- 다음 용어들을 간단하게 설명하시오.
(1) 관계 대수의 기본 연산자 : 합집합, 차집합, 카티션 곱, 프로젝션, 실렉션
(2) 관계대수의 유도된 연산자 : 조인, 교집합, 디비젼
(3) 관계 대수의 단항 연산자 : 실렉션, 프로젝션
(4) 관계 대수의 집합 연산자 : 합집합, 교집합, 차집합, 카티션 곱
(5) 합집합 호환 : 두 릴레이션의 애트리뷰트의 수가 같고, 대응되는 애트리뷰트들의 도메인이 같아야 함
(6) 카티션 곱 : 두 릴레이션에 속한 모든 투플의 집합을 구함
(7) 절차적 언어 : 데이터를 추출하는데 사용되는 연산 절차를 기술함. 어떻게 데이터를 찾는지 에 대한 질의를 수행할 것인가를 명시함
(8) 세타 조인 : 두 릴레이션의 애트리뷰트 값을 비교하여 조건 세타를 만족시키는 투플만 반환
(9) 동등조인 : 세타 조인에서 = 연산자를 사용한 조인
(10) 자연 조인 : 조인에 참여한 애트리뷰트가 두 번 나오지 않도록 하나를 제거한 결과를 반환
(11) 외부 조인 : 자연 조인 시 조인에 실패한 투플을 모두 보여주되 값이 없는 대응 애트리뷰트 에는 널값을 채워서 반환
(12) 세미 조인 : 자연 조인의 결과 릴레이션에서 왼쪽, 또는 오른쪽 릴레이션만 반환
단항 연산자 : 피연산자가 단일 릴레이션일 경우
이항 연산자 : 피연산자가 2개의 릴레이션일 경우
=> 연산자의 종류와 관계 없이 연산 결과는 항상 1개의 릴레이션임
: 기본 연산자들로부터 유도할 수 있는 연산자
📌 셀렉션(= 실렉션) : 하나의 릴레이션에서 조건을 만족하는 투플들의 부분 집합을 추출하는 연산자
σ<실렉션 조건>(R)
1개의 릴레이션에 적용됨 -> 단항 연산자
결과 릴레이션의 차수(= 열의 수) = 입력 릴레이션의 차수
결과 릴레이션의 카디날리티(= 행의 수) <= 입력 릴레이션의 카디날리티
=> 당근인 말!🥕
: select 한 결과를 생각해보면, 입력 릴레이션과 열의 수는 같음, 행의 수는 작거나 같기 때문
[예제] 다음 EMPLOYEE 릴레이션에서 2 번 부서에 소속된 사원을 검색하시오.
📌 프로젝션(projection) : 하나의 릴레이션의 애트리뷰트들의 부분 집합을 구하는 연산자
π<애트리뷰트 리스트>(R)
1개의 릴레이션에 적용됨 -> 단항 연산자
[예제] EMPLOYEE 릴레이션에서 사원들의 TITLE 과 SALARY 를 검색하시오
※ 관계 대수에서는 중복된 값이 있을 경우, 항상 중복이 제거된 상태가 된다. 후에 배울 SQL 질의에서는 중복 투플이 포함될 수도 있다. 만약 중복이 제거된 투플들을 얻기 원할 때는 다음과 같이 DISTINCT라는 키워드를 명시적으로 사용해야 한다.
SELECT DISTINCT title, salary FROM EMPLOYEE
💡<2개 릴레이션이 합집합 호환이 되는 필요 충분 조건>
2개 릴레이션 R(A_1, A_2, ..., A_n) & S(B_1, B_2, ..., B_n)이 있을 때
- n = m
=> 두 릴레이션의 애트리뷰트의 수(= 차수)가 같아야 함- 모든 1 <= i <= n 에 대해 domain(A_i) = domain(B_i)
=> 대응되는 애트리뷰트의 도메인이 같아야 함
📌 합집합 호환일 경우
💡 [예제] 다음 DEPARTMENT 릴레이션과 EMPLOYEE 릴레이션은 합집합 호환을 만족하는가?
-> 여기선 DEPARTMENT에서 DEPTNO를 프로젝션한 결과 (πDEPTNO(DEPARTMENT)) & EMPLOYEE에서 DEPTNO를 프로젝션한 결과 릴레이션 (πDEPTNO(EMPLOYEE)
: 2개는 차수 같고, 도메인 동일 => 합집합 호환
💡 πDEPTNAME(DEPARTMENT)와 πEMPNAME(EMPLOYEE)은 합집합 호환일까?
-> 애트리뷰트 이름 다른 거 2개 (DEPTNAME, EMPNAME)의 도메인이 같은지는 인스턴스 값만 보곤 알 수 X
만약 둘다 CHAR(10)이면 합집합 호환
📌 카티션 곱 (= 크로스 곱)
💡 수학에서의 곱집합 (A X B)
- A 원소와 B 원소의 순서쌍의 집합
A × B = { (x, y) | x ∈ A and y ∈ B}- A={1, 2}, B={a, b, c}가 있을 때, A×B = {(1, a), (1, b), (1, c), (2, a), (2, b), (2, c)}
💡두 릴레이션의 카티션 곱 : 양쪽 릴레이션 투플들의 모든 가능한 조합으로 이루어진 릴레이션이 됨
R × S = { (x1, …, xn, y1, …, ym) | (x1, …, xn) ∈ R and (y1, …, ym) ∈ S}
: 2개의 릴레이션으로부터 연관된 투플들을 결합하는 연산자
<조인 연산 종류>
- 기본 조인 연산 : 세타 조인, 동등 조인, 자연 조인
- 확장된 조인 연산 : 외부 조인, 세미 조인
-- 조인 조건 세타 : {=, <>, <=, <, >=, >} 중 하나
-- 세타 조인을 수행하기 위해서 양쪽 릴레이션에의 애트리뷰트들이 세타 조인을 만족하는
투플들만 골라낸다. 이것이 카티션 곱과 조인의 주요한 차이점
-- 양쪽 릴레이션의 애트리뷰트들의 값이 같은 투플(기본키 & 외래키 관계인 녀석들..)만 골라냄
+) 두 릴레이션의 동등 조인 결과 = 카티션 곱에 selection 적용한 결과
*) 동등하다는 표현 (≡)
left outer join
right outer join
full outer join
(남아 있는 쪽이 삼각형 완성돼있음 하핫)
관계 대수의 다른 연산과는 달리 애트리뷰트 값의 집합으로 연산 수행
R(Z) ÷ S(Y)가 P(X)를 반환하면
: R(Z)의 차수가 m이고, S(X)의
차수가 n이라면
=> P(Y)의 차수는 m - n
=> Z - Y = X이다.
R / S2는 {볼펜, 자}를 ‘모두’ 사용하는 학생들이 누구인지를 묻는 것과 같다. 이 학생들은
{10, 40}이다. R / S3는 {사인펜, 볼펜, 자}를 모두 사용하는 학생 = {10}번 학생임
💡 [예제] 2 번 부서나 3 번 부서에 근무하는 모든 사원들의 이름과 급여를 검색하라.
projection(DNO = 2 OR DNO = 3)(selection(empname,salary)(EMPLOYEE))
💡 [예제] ‘개발’ 부서에 근무하는 모든 사원들의 이름을 검색하라.
관계 대수의 한계점은 SQL에서는 모두 실행 가능함
(1) DB의 스키마 생성 & 수정 불가능
EMPLOYEE 릴레이션 생성 or 어떤 투플 삭제/추가 or 어떤 값을 수정(ex> SALARY의 10% 인상)해서 저장 불가능
(2) 산술 연산 불가능
ex) EMPLOYEE 릴레이션의 각 투플에 대해 SALARY 애트리뷰트 값이 10% 인상됐을 때 값을 알 수 없음
(3) 집계 함수를 지원 X
(4) 정렬 불가능
ex) 모든 투플들을 사원 이름 순으로 정렬하려고 표현 못함
(5) 중복된 투플을 표시 불가능