순수 관계 연산자란? #
RDB에서 데이터를 조작하고 쿼리하는데 사용되는 연산자를 의미합니다.
주요 순수 관계 연산자 6 가지를 알아보겠습니다.
- 선택 연산자: σ (Sigma)
- 조건에 맞는 튜플(레코드)을 선택합니다.
- "남자에 안경을 쓴 사람"의 조건을 만족하는 튜플을 선택할 때 사용됩니다.
- 프로젝션 연산자: π (Pi)
- 하나 이상의 속성을 선택해 새로운 릴레이션(테이블)을 생성합니다.
- "이름과 부서ID만을 선택"할 때 사용됩니다.
- 교집합 연산자: ∩ (Cap)
- 두 개의 릴레이션 간 공통된 튜플을 찾아 반환합니다.
- MYSQL 기준 INNER JOIN 연산자
- 합집합 연산자: ∪ (Cup)
- 두 개의 릴레이션을 합쳐서 중복을 제거하고 모든 튜플을 반환합니다.
- MYSQL 기준 UNION 연산자
- 합집합 연산자를 사용 할 때 각 SELECT 문의 열 수 와 데이터 유형이 동일해야 합니다.
- 차집합 연산자: - (Minus)
- 첫 번째 릴레이션에서 두 번째 릴레이션의 튜플을 제외한 결과를 반환합니다.
- 카티션 곱 = 카티션 프로덕트 = Cartesian Product
- 두 개의 릴레이션을 모든 가능한 조합으로 조합해 새 릴레이션을 생성합니다.
선택 연산자: σ (Sigma) #
선택 연산자는 WHERE절에 속합니다. 조건에 맞는 튜플을 선택하기 위해선 WHERE절을 사용하는데 바로 이 것이 선택 연산자 σ (Sigma)입니다.
SELECT *
FROM TABLE1
WHERE age > 18;
프로젝션 연산자: π (Pi) #
프로젝션 연산자는 SQL에서 "선택"을 한다고 했습니다. 특정 column을 선택하고 다른 column을 무시하므로 SELECT연산자에 해당합니다.
SELECT 이름
FROM TABLE1
WHERE age > 18;
교집합 연산자: ∩ (Cap) #
교집합 연산자는 INNER JOIN을 통해 교집합을 얻을 수 있습니다. 조인의 조건에 따라 공통된 값을 가진 행만을 반환합니다.
- INNER JOIN은 MYSQL에서 INNER를 생략하고 JOIN으로 사용 할 수 있습니다.
테이블 1: 직원 #
직원ID | 이름 | 부서ID |
---|---|---|
1 | 홍길동 | 101 |
2 | 이순신 | 102 |
3 | 강감찬 | 103 |
테이블 2: 부서 #
부서ID | 부서명 |
---|---|
101 | 개발 |
102 | 마케팅 |
104 | 인사 |
위 두 테이블을 부서ID로 INNER JOIN 해보겠습니다.
SELECT *
FROM 직원
INNER JOIN 부서
ON 직원.부서ID = 부서.부서ID
결과 테이블 #
직원ID | 이름 | 부서ID | 부서명 |
---|---|---|---|
1 | 홍길동 | 101 | 개발 |
2 | 이순신 | 102 | 마케팅 |
합집합 연산자: ∪ (Cup) #
합집합 연산자는 UNION 연산자로 표현 할 수 있습니다. 합집합은 집합 연산의 합집합의 그것과 같습니다.
테이블 두 개를 합집합 연산을 해보겠습니다.
직원 테이블 (employees):
직원ID | 이름 | 직급 |
---|---|---|
1 | 홍길동 | 관리자 |
2 | 이순신 | 직원 |
3 | 강감찬 | 직원 |
계약직 테이블 (contractors):
계약직ID | 이름 | 직급 |
---|---|---|
101 | 박재영 | 계약직 |
102 | 김민정 | 계약직 |
103 | 정성훈 | 계약직 |
SELECT 직원ID, 이름, 직급
FROM employees
UNION
SELECT 계약직ID, 이름, 직급
FROM contractors;
직원ID | 이름 | 직급 |
---|---|---|
1 | 홍길동 | 관리자 |
2 | 이순신 | 직원 |
3 | 강감찬 | 직원 |
101 | 박재영 | 계약직 |
102 | 김민정 | 계약직 |
103 | 정성훈 | 계약직 |
이렇게 두 테이블의 데이터가 하나의 결과로 합쳐졌습니다.
차집합 연산자: - (Minus) #
차집합 연산자는 두 결과집합에서 첫 번째 집합에만 있는 항목을 선택하는 연산으로 데이터베이스에서 두 테이블의 데이터를 비교, 두 번째 테이블에는 없고 첫 번째 테이블에만 잇는 행을 가져옵니다.
직원 테이블과 이직한 직원 테이블이 있을 때, 직원 테이블에서 이직한 직원 테이블의 차집합을 구해보겠습니다.
직원 테이블 (employees):
직원ID | 이름 | 부서 |
---|---|---|
1 | 홍길동 | 개발 |
2 | 이순신 | 마케팅 |
3 | 강감찬 | 영업 |
4 | 김철수 | 개발 |
5 | 박지영 | 인사 |
이직한_직원 테이블 (former_employees):
직원ID | 이름 | 부서 |
---|---|---|
2 | 이순신 | 마케팅 |
5 | 박지영 | 인사 |
6 | 정미영 | 영업 |
쿼리는 아래와 같이 선택 할 테이블을 앞에 빼줄 테이블을 MINUS 연산자 뒤에 둡니다.
SELECT 직원ID, 이름, 부서
FROM employees
MINUS
SELECT 직원ID, 이름, 부서
FROM former_employees;
결과는 다음과 같습니다
직원ID | 이름 | 부서 |
---|---|---|
1 | 홍길동 | 개발 |
3 | 강감찬 | 영업 |
4 | 김철수 | 개발 |
카티션 프로덕트 : x (Cartesian Product) #
카티션 곱: x (Cross)에 대한 설명은 해당 링크로 대체합니다.
정리 #
DBMS에서 사용되는 순수 관계 연산자를 알아봤습니다.
Relational algebra로 수학에서 사용되는 집합간 연산의 그 것을 RDB로 사용하는 느낌으로 바라보면 될 것 같습니다.