[DB] Relational Operation 관계연산자

kai·2025년 9월 3일

DataBase(완료)

목록 보기
9/10

데이터 모델 = 자료구조(Data Structure) + 작업(Operations) + 제약조건(Constraints)

관계형 데이터 작업에는 두가지 관점이 존재한다.
먼저 "Relational Algebra"는 어떻게 결과를 얻을 것인지 표현하는 절차지향적 언어를 사용한다.
그 다음은 "Relational Calculus"무슨 결과를 얻을 것인지 표현하는 비절차지향적 언어를 사용한다.

위의 두가지 역할은 쿼리 언어의 표현력(expressiveness)유용성(usefulness) 을 평가하는 것이다. 이것은 서로 기능적으로 동일한 것을 의미하지만, 접근 방식과 표현방식을 다르게 보여준다.

relational algebra나 relational calculus를 사용하여 표현될 수 있는 쿼리는 "관계적으로 완전하다(relationally complete)"고 말한다.

  • 이 말은 해당 언어가 모든 것을 할 수 있다는 것을 의미하는 것이 아니라, 이론적으로 관계형 데이터를 상호작용 하기 위해 필요한 모든 쿼리를 나타낼 수 있다는 것을 의미한다.
    만약 언어가 관계적으로 완벽하지 않다면, 어떤 복잡한 결합이나 데이터 조건을 가져오는 것을 실패할 수 있다.
    즉. 데이터를 되찾아 오는 어떤 작업에서도 완벽하다는 의미이다.

Relational Algebra

: 어떻게 결과를 가져오는지 순차적인 작업을 보여줌으로써 묘사한다

  • 8가지 기본적인 연산이 있다.
  • 그리고 이 연산들은 Set-based operations, Relation-specitic operations로 나뉜다.

Closure Property 폐쇄적인 특성이란?

  • 입력과 출력은 모두 서로 관계를 가진다
  • 그래서 한 연산의 출력을 다른 연산의 입력으로 사용하면서, 여러 연산을 구성할 수 있는 특징

다음의 연산들은 집합 R과 집합 S가 다음을 만족해야한다.
1) attributes 갯수
2) 동일한 attribute domains

[Set-based Operations]

다음과 같은 4가지의 종류가 있다.

Union(∪)

: 합집합
union

  • degree(열의 갯수) : R,S와 동일
  • Cardinality(행의 갯수) : |R| + |S| (겹치는 부분이 있으면 줄어들거임)
  • 교환법칙 o
  • 결합법칙 o

Intersection(∩)

: 교집합
intersection

  • degree(열의 갯수) : R,S와 동일
  • Cardinality(행의 갯수) : |R ∩ S| ≤ min(|R|, |S|)
  • 교환법칙 o
  • 결합법칙 o

Difference(−)

: 차집합
difference

  • degree(열의 갯수) : R,S와 동일
  • Cardinality(행의 갯수)
    - |R − S| is at most equal to |R|
    • |S − R| is at most equal to |S|
  • 교환법칙 x
  • 결합법칙 x

Cartesian Product(x)

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

  • degree(열의 갯수) : R, S와 동일
  • Cardinality(행의 갯수)
    • |R − S| is at most equal to |R|
    • |S − R| is at most equal to |S|
  • 교환법칙 △ (attribute이름이 적절하게 수정되었을때만)
  • 결합법칙 o

Relational Operations 관계 연산

Selection(σ)

: 선택 조건에 따라서 튜플의 부분집합을 선택하는데 사용하는 연산자이다.

  • relational algebra에서 row-level 필터라고 생각하면 됨.
  • 문법 : 𝝈<선택 조건> (관계);

sql 예시: Student 테이블에서 dept가 'CS'인 것만 추출

SELECT * FROM Student
WHERE dept = 'CS';

select

Projection(π)

: 입력관계에서 특정 attribute만 리턴하는 연산자이다.

  • 수평 필터(행이 아닌 열을 필터링 한다.) ??
  • 문법 : 𝝅 관계목록 (관계);

sql 예시: Student 테이블에서 name과 dept 속성만 추출

SELECT name, dept FROM Student;

projection

Join(⋈)

: 두 관계를 공통 attribute를 기반으로 결합한다.

  • 공통 속성에서 일치하는 값을 가진 튜플만 결합되어 결과에 포함된다.
  • join 조건: 두 관계 모두에 공통적인 속성이 존재해야한다.
  • equijoin : join 조건이 equality(동등성)에 기반하는 경우를 의미한다.
  • 문법 :

예시: Student테이블과 Enroll테이블을 공통 속성 sid로 결합.

SELECT * FROM Student
JOIN Enroll ON Student.sid = Enroll.sid;

join

Theta-join(⨝θ)

: 모든 튜플 쌍을 결합한 후 조건 theta에 맞는 튜플만 결과로 도출하는 연산이다.

  • 등호뿐만 아니라 모든 비교 연산자를 사용할 수 있는 일반화된 join의 형태이다.
  • 지정된 theta 조건을 만족하는 R과 S의 모든 튜플 쌍을 결합한다.
  • 문법 : R ⋈θ S = { (r, s) | r ∈ R, s ∈ S, 그리고 조건 θ를 만족 }
    여기서 θ는 : =,≠,<,>,≤,≥등등이 될 수 있다.

sql 예시:Student와 Enroll을 sid로 조인하면서 grade ≥ 90 조건 추가

SELECT * FROM Student s, Enroll e
WHERE s.sid = e.sid AND e.grade >= 90;

Natural-join(⋈)

: 동일한 이름과 도메인을 가진 모든 속성에 대해 두 관계를 자동으로 join하는 일종의 동등조인(equijoin)이다.

  • 조건 theta에 맞게 연산을 한후, 중복된 join 열은 삭제한다.

Student와 Enroll 테이블을 공통 속성(sid) 기준으로 자동 조인

SELECT * FROM Student
NATURAL JOIN Enroll;

Division(÷)

: 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
    )
);

semi-join(⋉ or ⋊)

:한쪽 테이블 속성값 결과만 반환

예시: Enroll에 등록된 학생만 반환 (Enroll의 속성은 출력 안 함)

SELECT DISTINCT s.*
FROM Student s
WHERE EXISTS (
    SELECT 1 FROM Enroll e
    WHERE s.sid = e.sid
);

outer join(⟕ ⟖ ⟗)

  • Left Outer Join: 왼쪽 릴레이션의 모든 튜플 유지
  • Right Outer Join: 오른쪽 릴레이션의 모든 튜플 유지
  • Full Outer Join: 양쪽 모두 유지

예시

----------------------------------------------- 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 Culculus

" = ~~한 조건을 만족하는 데이터를 주세요"

Relational Algebra와 다르게 어떻게 얻을지에 초점이 맞춰져있는 것이 아니라, 어떤 데이터를 원하는지를 나타내는 선언적인 쿼리 언어이다.(비절차적 언어)
수학적인 논리 형식으로 구현되어있고, 요구되는 결과의 특성을 묘사하는 쿼리들로 표현되어있다.

Relational Culculus의 종류는 다음과 같다.

  • Tuple Relational Calculus(TRC) : 튜플(행)을 사용하여 원하는 결과를 표현한다.

형식
{ t | P(t) }

학생 테이블 Student(sid, name, dept)에서 dept='CS'인 학생 이름 찾기
{ t.name | t ∈ Student ∧ t.dept = 'CS' }

  • Domain Relational Calculus(DRC) :도메인(열)을 사용하여 원하는 결과를 표현한다. 그래서 튜플 전체가 아니라 속성단위/열로 다루게 된다.

형식
{ <x1, x2, ..., xn> | P(x1, x2, ..., xn) }

학생 테이블 Student(sid, name, dept)에서 dept='CS'인 학생 이름 찾기
{ | ∃ sid, dept ( (sid, name, dept) ∈ Student ∧ dept = 'CS' ) }

// 수정이 필요한 부분이 있다면 댓글로 알려주세요!

profile
한 대학생의 코딩일기. 임베디드와 인공지능에 관심이 많습니다.

0개의 댓글