March 10, 2020
Relational Algebra 를 보기 전에, Algebra 가 무엇인지부터 알아보자. Algebra는 연산자(operator)와 피연산자(Operand)를 포함하는 수학적 시스템이다. 연산자는 어떤 결과에 대한 procedure를 표현하는 역할을 하고 피연산자는 연산자가 적용되는 대상이 되는 변수나 값을 의미한다.
Relational Algebra도 Algebra이기에 동일하게 Operand 와 Operator 가 존재한다. 일반 Algebra와 다른점은, 입력과 출력으로 Relation, 즉 테이블을 취한다는 것이다.
따라서 Operand 는 relation이 되고, Operator는 총 8가지가 있는데 이제부터 알아보자.
select 연산은 테이블에서 주어진 predicate 에 만족하는 tuple을 뽑는 연산이다. 기호는 σ 로 표현한다.
만약 내가 “Comp. Sci” 테이블에 있는 “Intstructor” 의 목록을 알고싶다면,
이렇게 쿼리를 작성할 수 있다. 위와 같이 단순한 predicate 뿐만 아니라 좀 더 복잡한 predicate도 만들어서 쿼리를 작성할 수 있다.
이런 쿼리를 사용하면 AND 연산을 통해 department 가 Comp. Sci 이면서 salary가 70,000 이 넘는 tuple들만 찾아서 가져오게 할 수 있다.
또 다른 예를 보면,
이런 쿼리를 통해서 dep_name attribute의 값과 building attribute의 값이 동일한 department 들만 뽑아서 가져오게 할 수도 있다.
Project operation은 또 다르게 unary operationd이라고도 한다. 특정 attribute들을 골라내는 연산자이다.
이런 쿼리를 통해서 instructor relation에서 name과 salary만 골라서 가져오도록 할 수 있다.
쿼리 안에 다른 쿼리를 끼워넣어서 한 쿼리의 결과를 새로운 쿼리의 입력으로 사용할 수 있다. 일종의 파이프 라인이라고 생각하자.
이런 쿼리를 통해 먼저 selection operation을 하고 그 결과를 projection operation에서 사용하는 것이 가능하다. 그리고 기억해야할 것은 projection operation은 중복을 모두 제거한다.
카테시안 프로덕트는 조합을 만드는 연산이다. 조금은 무식하지만, 만들 수 있는 모든 조합을 만든다. 한 attribute를 다른 테이블에서 해당 값을 가지는 모든 tuple을 찾는다. 만약 15개의 수업이 나열되어 있는 테이블과 12명의 교과목 교수님들이 나열되어 있는 테이블에 수업이름을 기준으로 cartesian product를 수행하면, 그 결과로 12X15인 총 180개의 새로운 tuple이 결과로 만들어질 것이다.
Theta Join 연산자는 카테시안 조합보다 조금 덜 무식한 방법이다. 카테시안 연산의 예에서, 12명의 교과목 교수님들이 모두 15개의 수업을 가르치지는 않을 것이다. 따라서 우리는 특정한 attribute를 사용해서 수업의 종류에 대한 데이터를 만들고 이 값을 join operation에 사용하면, 우선 cartesian-product operation으로 모든 조합이 생성된 뒤, 이후에 selection operation을 사용해서 조건이 되는 attribute들만 가져오도록 지정할 수 있다. 이 두단계를 한번에 해주는 연산이 theta join operator이고, 다음과 같이 나타낸다.
union은 우리가 아는 합집합이다. 양 테이블에 존재하는 모든 tuple들을 합치는 것이다. 그런데 이 연산을 사용하려면 몇가지 조건이 필요하다.
만약 r이라는 테이블과 s라는 테이블의 union operation을 수행하고 싶다면, 1) r과 s는 똑같은 갯수의 attribute를 가지고 있어야 한다(arity가 같다고도 한다). 그리고 2) 두 테이블의 domain이 비교가 가능해야한다. 다른 말로, 두 attribute 사이의 타입이 같아야 한다는 것이다.
Uninon Operation은 다음과 같은 기호로 나타낸다.
그리고 union 하는 과정에서 중복된 tuple을 삭제한다.
set-intersection은 우리가 아는 교집합과 동일하다. 양 테이블에 모두 존재하는 tuple들만 가져오는 것이다.
set-intersection operation의 수행 조건은 union operation과 동일하다. 1) r과 s는 똑같은 갯수의 attribute를 가지고 있어야 한다(arity가 같다고도 한다). 그리고 2) 두 테이블의 domain이 비교가 가능해야한다. 다른 말로, 두 attribute 사이의 타입이 같아야 한다는 것이다.
Set-intersection operation은 다음과 같이 나타낸다.
Set-Difference operation은 한 테이블에는 존재하고 다른 테이블에는 존재하지 않는 tuple들을 찾는 연산이다. 여집합이라고 생각하자. set 에 대한 연산이기에 연산 수행에 대해 동일한 조건이 그대로 유지된다. 1) r과 s는 똑같은 갯수의 attribute를 가지고 있어야 한다(arity가 같다고도 한다). 그리고 2) 두 테이블의 domain이 비교가 가능해야한다. 다른 말로, 두 attribute 사이의 타입이 같아야 한다는 것이다.
Set-difference operation은 다음과 같이 나타낸다.
쿼리를 중첩해서 작성하다보면 보기에도 어렵고 작성하는 사람도 헷갈린다. 그래서 우리는 Assignement Operation을 통해 쿼리의 일부를 변수에 담아서 사용할 수 있다.
기호는 아래와 같이 화살표로 나타내고 아래의 예를 보면 더 명확히 어떤 기능인지 알 수 있을 것이다.
Rename operation은 어떤 쿼리에 대해 이름을 붙이는 연산자이다.
기호는 로우(𝝆)를 사용하고 아래 예를 통해 더 자세히 알아보자.
위와 같은 식을 사용하면, E가 쿼리, x가 이름이라고 했을 때, 특정 쿼리에 대해서 이름을 붙일 수 있게 되는 것이다.
Equivalent Query는 다르게 생겼지만 완전히 동일한 결과를 내는 쿼리들을 의미한다.