프로그래밍 언어에는 두 가지 종류가 있다 .
1. 절차적 언어(Procedural Language)
2. 비절차적 언어(Nonprocedual Language)
절차적 언어는 코드가 실행되는 절차를 개발자가 정하는 것이다. 비절차적 언어는 개발자는 원하는 결과만 명시하고 수행절차는 내부 시스템이 결정하는 언어를 의미한다.
관계형 데이터베이스에서 사용되는 언어를 관계 질의어라 부른다. 관계 질의어에는 두 가지 종류가 있다.
1. 관계대수(Relational Algebra) : 절차적 언어
2. 관계해석(Realational Calculust) : 비절차적 언어
관계대수(Relational Algebra)
관계대수는 연산이 이루어지는 수식구조이다. 수식은 연산자와 피연산자로 구성되는데 여기서 피연산자는 테이블이다. 연산자는 단항연산자(unary operator)와 이항 연산자(binary operator)로 나뉜다. 단항 연산자는 피연산자인 테이블이 한 개를 연산하는 연산자이고 이항 연산자는 피연산자인 테이블 두 개로 연산하는 연산자이다.
단항연산자(Unary Operator)
1. 선택연산 (selection)
피연산자인 '하나'의 테이블에서 조건에 만족하는 레코드를 검색하는 연산이다. (단항 연산자)
연산자 : σ
형식 : σ<조건식>(<테이블이름>)
조건식은 비교연산자와 부울연산자(∪, ∩, NOT)의 조합으로 이루어 진다.
ex)
address = '서울'
salary >= 200
address = '서울' ∩ name="김영식"
선택연산은 SQL문으로 보면 조건을 명시하는 WHERE절에 해당한다.
2. 추출연산(project)
'하나'의 필드에서 사용자가 원하는 필드만을 출력하는 연산이다. 관계대수는 출력된 연산 중에 중복된 레코드가 있다면 중복을 제거한다. 하지만 실제 DBMS는 중복레코드를 허용해준다.
연산자 : π
형식 : π<필드리스트>(<테이블이름>)
필드리스트는 필드를 ','로 구분해준다.
ex) stu_id, name
(심화) 연산자의 조합
추출 연산을 SQL문으로 보면 SELECT 명령에 해당한다.
3. 재명명 연산(Rename)
피연산자인 테이블의 이름을 바꾸는 단항 연산자이다. 더불어 테이블의 필드 이름도 바꿀 수 있다.
연산자 : ρ
형식 : ρ<new테이블이름>(<테이블이름>)
형식 : ρ<new테이블이름>(<new필드이름리스트>)(<테이블이름>)
ex) ρclass301(id,number)(πprof_id,enroll(σclassroom='301'(class)))
테이블명을 class -> class301로 바꾸고, 추출된 필드인 prof_id 와 enroll은 id, number로 필드 이름을 바꾸어 출력된다. 이렇게 선택, 추출, 재명명 연산이 대표적인 단항연산자(unary operator)이다.
4. 상호 중첩
연산자는 상호 중첩하여 사용가능하다.
σposition='부교수'( σ salary>=400(professor))
professor 테이블에서 월급이 400이상인 레코드를 선택(selection)하고 선택된 레코드들 중 position이 부교수인 레코드들을 다시 선택한다. 선택연산이 중첩되면 교환법칙이 성립된다. 하지만 이는 딱히 큰 의미가 없다. 그냥 조건식을 σposition='부교수' and salary>=400 (professor) 이렇게 and로 연결한 것이랑 같은 의미이기 때문이다.
추출 연산을 중첩하여 사용하는 경우에는 주의할 점이 있다. 먼저 추출된 레코드의 필드 수가 두 번째 추출 연산의 필드 수보다 적으면 안 된다.
πname, position (π name, position, prof_id(professor))
중첩 추출이 어쩌면 의미가 없을 수도 있는 이유는
1. πname, position (π name, position, prof_id(professor))
2. πname, position (professor)
두 수식의 연산 결과는 같다. 그러므로 일반적으로는 선택과 추출 연산을 중첩하여 사용한다. 월급이 400이 넘는 부교수의 이름을 검색하는 관계대수를 만들어보자.
πname (σ salary>400 ∩ position = '부교수(professor))
그럼 이를 SQL문으로 작성해보자.
SELECT name FROM professor WHERE salary > 400 and position = '부교수'
DBMS에서 가장 자주 사용하는 일반적인 SELECT문이 나왔다. 이렇듯 SQL언어는 관계대수와 관계해석이라는 일종의 수학을 토대로 만들어졌다.
이항 연산자(Binary Operator)
관계대수에서 이항연산(Binary Operator)이란, 두 개의 테이블을 연산하는 것을 의미한다. 이항연산은 집합연산을 의미한다.
집합연산을 위해서는 두 테이블이 호환이 가능해야한다. 호환이 가능하다는 말의 의미는 피연산자의 차수와 필드 이름이 동일하고 같은 이름의 필드라 할지라도 도메인이 일치해야한다.
1. 합집합
πname,id(student) ∪ πname,id(professor)
2. 교집합 ( 강의 중 반을 배정받은 강의 출력)
πcourse_id(course) ∩ πcourse_id(class)
3. 차집합 (강의 중 반을 배정받지 못한 강의 출력)
πcourse_id(course) - πcourse_id(class)
4. 곱집합( 카디션 프로덕트, Cartesian Product)
곱집합은 호환이 필요없다. 그저 테이블1 x 테이블2이다. 테이블1의 레코드와 테이블2의 레코드가 만나 생성될 수 있는 레코드의 모든 경우의 수를 저장한 것을 의미한다.
테이블1의 레코드가 (a,1) , (b,2) 이고 테이블2의 레코드가 (e,3) (f,4), (g,5)라면 곱집합의 결과는 (a,1,e,3) (a,1,f,4), (a,1,g,5) (b,2,e,3) (b,2,f,4) (b,2,g,5)가된다.
추가 연산자
1. 조인(JOIN)
곱집합(카디션 프러덕트)은 모든 가능한 조합의 레코드들로 두 개의 테이블을 하나의 테이블로 만들었지만 JOIN은 조건에 부합하는 레코드들만 모아서 한 개의 테이블로 만든다.
형식 : 테이블 1 ⨝ <조건식> 테이블2
조인 조건에 사용된 조건식을 '조인조건'이라 부르고 동등비교가 대부분이라 동등조건이라고도 부른다. 카디션 프로덕트에 조인조건으로 선택연산한것과 연산결과는 같다.
2. 자연 조인(natural join)
자연 조인은 동등조건이 있는 경우에, 하나의 필드만을 명시하여 출력하는 연산이다. 출력되는 테이블의 필드는 공통되는 필드가 없으므로 필드 앞에 테이블명이 사라진다. 일반적으로 조인이라고 하면 자연 조인을 의미한다. 기본키와 외래키가 두 테이블 간의 동등조건에 해당되기 때문이다.
형식 : 테이블 1 ⨝ 테이블2
3. 외부 조인(Outer Join)
자연조인은 동등조건이 성립되는 경우의 레코드만 출력되었다. 하지만 외부조인은 동등조건이 성립되지 않으면 null 값을 넣어 테이블에 출력시키는 연산이다.
왼쪽 외부조인(left outer join) : 왼쪽 테이블 레코드만 추가
오른쪽 외부 조인(right outer join) : 오른쪽 테이블 레코드만 추가
완전 외부 조인(full outer join) : 양쪽 테이블 레코드 추가
4. 지정연산(assignment)
일종의 변수이다. 질의가 길어지면 관리하기가 힘드니 중간 결과에 이름을 부여해서 수식을 간단하게 만드는 것이다.
연산자 : ←
ex)
수식 : πname (σ salary>400 ∩ position = '부교수(professor))
중간 결과 : temp1 ← σ salary>400 ∩ position = '부교수(professor)
수식 : πname (temp1)
참고자료
Understanding of Database
저자 : 이상구, 장재영, 김한준, 정재헌
출판 : 이한미디어발매2017.03.01.
'DB > DB Basic' 카테고리의 다른 글
[DB] Oracle의 구조 (0) | 2021.06.24 |
---|---|
[DB] 관계해석(Relational Calculus) (0) | 2021.06.24 |
[DB] 관계형 데이터 모델 (0) | 2021.06.24 |
[DB] 파일시스템 (0) | 2021.06.24 |
[DB] 데이터베이스의 정의 (0) | 2021.06.24 |