1. 관계 대수의 개념
가. 절차 언어(procedural language)
•
원하는 결과를 얻기 위해 릴레이션의 처리 과정을 순서대로 기술하는 언어
나. 릴레이션을 처리하는 연산자들의 모임
•
대표 연산자 8개
•
일반 집합 연산자와 순수 관계 연산자로 분류
다. 폐쇄 특성(closure property)
•
피연산자도 릴레이션이고 연산의 결과도 릴레이션
※ 질의(query): 데이터에 대한 처리 요구
2. 관계 대수 연산자
가. 일반 집합 연산자
•
2개의 릴레이션을 대상으로 연산을 수행
•
합집합, 교집합, 차집합 연산자는 두 릴레이션을 합병 가능해야 함
(서로 대응되는 속성의 도메인이 같고 차수가 같아야함)
나. 순수 관계 연산자
1.
SELECT (σ) 연산
•
릴레이션에서 조건을 만족하는 튜플 선택
•
수평적 부분집합을 결과로 생성
2.
PROJECT (π) 연산
•
릴레이션에서 지정된 속성만을 추출
•
수직적 부분집합을 결과로 생성
3.
JOIN (⋈) 연산
•
두 릴레이션의 공통 속성을 기준으로 튜플들을 결합
•
주요 조인 유형:
•
내부 조인 (Inner Join)
•
자연 조인 (Natural Join)
•
외부 조인 (Outer Join): 왼쪽, 오른쪽, 완전 외부 조인
4.
DIVISION (÷) 연산
•
한 릴레이션을 다른 릴레이션으로 나누는 연산
•
첫 번째 릴레이션이 두 번째 릴레이션의 모든 속성을 포함해야 함
3. 관계 대수 연산 예제
가. 조인 연산 예제
각 릴레이션 테이블
R S
A | B |
a1 | b1 |
a3 | b2 |
a5 | b5 |
B | C |
b2 | c2 |
b2 | c3 |
b3 | c4 |
b5 | c5 |
1. 동등조인 (Equi Join)
기호: R ⋈[조건] S
두 릴레이션의 속성 값이 같은 튜플들을 연결
A B C
a3 b2 c2
a3 b2 c3
a5 b5 c5
2. 자연조인 (Natural Join)
기호: R ⋈ S
공통 속성을 기준으로 같은 값을 가진 튜플들을 연결하고 중복 속성 제거
A B C
a3 b2 c2
a3 b2 c3
a5 b5 c5
3. 세미조인 (Semi Join)
기호: R ⋉ S 또는 R ⋊ S
한쪽 릴레이션의 속성만 선택하여 조인 수행
A B
a3 b2
a5 b5
4. 외부조인 (Outer Join)
• 왼쪽 외부조인 (Left Outer Join): R ⟕ S
A B C
a1 b1 NULL
a3 b2 c2
a3 b2 c3
a5 b5 c5
• 오른쪽 외부조인 (Right Outer Join): R ⟖ S
A B C
a3 b2 c2
a3 b2 c3
a5 b5 c5
NULL b1 NULL
NULL b3 c4
• 완전 외부조인 (Full Outer Join): R ⟗ S
A B C
a3 b2 c2
a3 b2 c3
a5 b5 c5
a1 b1 NULL
NULL b3 c4
나. 관계 대수식 표현
1.
업체 이름 검색:
π[업체이름](업체)
SQL
복사
2.
제품의 무게와 색깔 검색:
π[무게,색깔](제품)
SQL
복사
3.
색깔이 red인 제품 검색:
σ[색깔='red'](제품)
SQL
복사
4.
색깔이 red인 제품 이름 검색:
π[제품이름](σ[색깔='red'](제품))
SQL
복사
5.
색깔이 blue인 제품 번호 검색:
π[제품번호](σ[색깔='blue'](제품))
SQL
복사
6.
제품번호 123인 제품을 발송한 업체 이름 검색:
π[업체이름](업체 ⋈ σ[제품번호=123](발송))
SQL
복사
도서 예약 시스템 관계 대수식
1.
소설 장르 도서 예약 고객 번호 검색:
π[고객번호](예약 ⋈ σ[장르='소설'](도서))
SQL
복사
2.
예약번호 114인 고객 정보 검색:
π[고객이름,예약날짜](고객 ⋈ σ[예약번호=114](예약))
SQL
복사
3.
도서번호 C123 예약 고객 정보 검색:
π[고객번호,전화번호](고객 ⋈ σ[도서번호='C123'](예약))
SQL
복사
4.
특정 날짜의 DB개론 예약 고객 정보 검색:
π[고객이름,전화번호](고객 ⋈ (예약 ⋈ σ[제목='DB개론' ∧ 예약날짜='2024-10-28'](도서)))
SQL
복사
4. 관계 대수 연산 연습 문제
가. 분할 연산 (Division)
릴레이션 R, S, T:
R:
A | B |
a1 | b1 |
a1 | b2 |
a2 | b2 |
a2 | b3 |
S:
B |
b1 |
b2 |
T:
B |
b2 |
b3 |
1.
R÷S 연산 결과:
A |
a1 |
2.
R÷T 연산 결과:
A |
a2 |
나. 카티션 프로덕트 연산
입력 릴레이션:
R:
A | B |
a1 | b1 |
a2 | b2 |
a3 | b3 |
S:
B | C |
b1 | c1 |
b3 | c2 |
b4 | c3 |
카티션 프로덕트 (R × S) 결과:
A | B | B | C |
a1 | b1 | b1 | c1 |
a1 | b1 | b3 | c2 |
a1 | b1 | b4 | c3 |
a2 | b2 | b1 | c1 |
a2 | b2 | b3 | c2 |
a2 | b2 | b4 | c3 |
a3 | b3 | b1 | c1 |
a3 | b3 | b3 | c2 |
a3 | b3 | b4 | c3 |
다. 조인 연산 예제
입력 릴레이션:
고객:
고객아이디 | 고객이름 | 나이 | 등급 |
apple | 김현준 | 20 | gold |
banana | 정소화 | 25 | vip |
carrot | 원유선 | 28 | gold |
orange | 정지영 | 22 | silver |
grape | 김원효 | 31 | vip |
주문:
주문번호 | 주문고객 | 주문제품 | 주문수량 |
1001 | apple | 진짜우동 | 10 |
1002 | carrot | 맛있는파이 | 5 |
1003 | banana | 그대로만두 | 11 |
1004 | grape | 진짜우동 | 12 |
예제 질의에 대한 관계 대수식:
1.
진짜우동 주문 검색:
σ[주문제품='진짜우동'](주문)
SQL
복사
1.
25세 이하 고객 검색:
σ[나이≤25](고객)
SQL
복사
1.
맛있는파이 주문수량 검색:
π[주문수량](σ[주문제품='맛있는파이'](주문))
SQL
복사
1.
gold 등급이면서 25세 이상인 고객:
π[고객이름,나이](σ[등급='gold' ∧ 나이≥25](고객))
SQL
복사
1.
원유선 고객의 주문 정보:
π[등급,주문제품,주문수량](σ[고객이름='원유선'](고객 ⋈ 주문))
SQL
복사
1.
주문수량 10개 이상 주문:
σ[주문수량≥10](주문)
SQL
복사