- 릴레이션 스키마는 내포, 릴레이션 인스턴스는 외연이다.
- 집합연산(카티션 프로덕트 제외)은 각 릴레이션의 속성 수가 같고 순서도 같아야 하며 각각 동일한 도메인으로 대응되어야 한다. 이 조건을 합병가능(union compatible)이라 한다. 속성 이름은 달라도 된다.
- 카티션 프로덕트의 결과 릴레이션의 차수는 두 릴레이션 차수의 합이며, 카디널리티는 두 릴레이션 차수의 곱이다.
- 릴레이션 스키마는 데이터베이스 상태(state)와 마찬가지로 변경될 수 있다.
- 키는 투플을 식별하고, 슈퍼키는 투플을 유일하게 식별한다.
- 동등조인은 자연조인이 아니다.
- 슈/후/기/대/대/외
- 후보키는 유일성과 최소성을 만족한다.
DB는 '여러 사람이 공동으로 사용하기 위해 통합하고 저장한 운영 데이터의 집합'이다. 이 개념을 구체적으로 다음과 같이 네 가지로 나눌 수 있다.
1. 통합된(intergrated) 데이터: 여러 곳에서 사용하던 데이터를 통합하여 하나로 저장한 데이터를 의미한다. 통합할 때 중요한 점은 각자 사용하던 데이터의 중복을 최소화함으로써 중복 저장으로 인한 데이터 불일치 현상을 없애는 것이다.
2. 저장된(stored) 데이터: 문서로 보관된 데이터가 아니라 디스크, 테이프 같은 컴퓨터 저장 장치에 저장된 데이터를 의미한다.
3. 운영 데이터(operational): 조직의 목적을 위해 사용되는 데이터를 의미한다. 업무에 필요한 검색을 할 목적으로 저장된 데이터다. 조직의 목적에 관계없이 저장된 데이터나 임시 저장된 단순 입출력 데이터는 운영 데이터에 속하지 않는다.
4. 공용(shared) 데이터
DB의 특징은 다음과 같다.
1. 실시간 접근이 가능하다.
2. 계속 변화한다.
3. 동시 공유(concurrent)가 가능하다.
4. 내용으로 참조가 가능하다.
DBMS는 각 조직에서 사용하던 데이터를 통합하고 공유할 때 생기는 장점을 이용하는 시스템이다. DBMS 시스템은 DBMS, DB, 데이터 모델의 세 가지로 구성된다.
정보 시스템의 발전
데이터 처리 관점에서 기업 정보 시스템의 발전 과정을 보면 다음과 같다.
1. 파일 시스템
파일 시스템에서는 각 응용프로그램들이 독립적으로 파일을 다루기에, 데이터가 중복 저장될 수 있고 데이터의 일관성이 훼손될 수 있다.
2. DBMS
DBMS는 클라이언트-서버 시스템으로, DBMS 서버가 파일을 다루며 데이터의 일관성 유지, 복구, 동시 접근 제어 등의 기능을 수행한다. DBMS는 데이터를 저장하기 전 설계 과정을 거치므로 데이터 중복을 줄이고 무결성을 유지한다.
3. 웹 DBMS
4. 분산 DBMS
1975년 ANSI에서는 DB를 개념적으로 이해하기 위해 DB 구조에 대한 안을 만들었다. 이 안은 데이터베이스를 보는 관점을 3단계로 분리한 것으로, 3단계 DB 구조라 부른다.
3단계 DB 구조는 외부 단계, 개념 단계, 내부 단계로 나뉜다. 여기서 '스키마'는 조직이나 구조를 의미한다.

DBMS는 매핑을 통하여 각 단계 간 대응관계를 정의한다.
하위 단계의 내용을 추상화하여 상위 단계에 그 세부사항을 숨김으로써 한 단계 내의 변경에 대해서 다른 단계와 상호 간섭이 없도록 하는 것이다.
릴레이션은 행과 열로 구성된 테이블이다.
관계는 릴레이션 내의 관계와 릴레이션 간의 관계가 있다. 릴레이션 내의 관계는 릴레이션 안에 있는 데이터들의 집합으로 표현하고, 릴레이션 간의 관계는 릴레이션을 식별 가능한 값을 이용해 표현한다. '릴레이션 간의 관계'는 관계 데이터 모델을 다른 데이터 모델과 구분하는 특징이다.
릴레이션은 스키마와 인스턴스로 이루어진다. 스키마는 RDB의 릴레이션이 어떻게 구성되는지, 어떤 정보를 담고 있는지에 대한 기본적인 구조를 정의한다. 인스턴스는 정의된 스키마에 따라 테이블에 실제로 저장되는 데이터의 집합을 의미한다.
DB는 데이터 저장 시 일관성을 유지하고 중복을 제거하여 데이터의 신뢰도를 유지해야 한다.
RDB에서 키는 릴레이션에서 특정 투플을 식별할 때 사용하는 속성 혹은 속성의 집합이다. 릴레이션은 중복된 투플을 허용하지 않으므로 각각의 투플에 포함된 속성 중 어느 하나는 값이 달라야 한다.
외래키가 성립하기 위해서는 참조하고(refer) 참조되는(refered) 양쪽 릴레이션 속성의 도메인이 서로 같아야 한다. 또한 참조되는 릴레이션의 기본키 값이 변경되면 이 기본키를 참조하는 외래키 값 역시 변경되어야 한다. 즉, 참조하는 외래키 값이 참조되는 기본키 값에 연동되어 항상 데이터의 일관성이 유지된다. 이를 외래키 제약조건이라 한다.
외래키는 참조되는 릴레이션의 기본키와 달리 NULL 값을 포함할 수 있고 중복값도 허용한다.
외래키 사용 시 참조하는 릴레이션과 참조되는 릴레이션이 꼭 다른 릴레이션일 필요는 없다. 즉, 자기 자신의 기본키를 참조할 수도 있다.
외래키의 특징을 정리해보자.
1) 관계 데이터 모델에서 릴레이션 간의 관계를 포현한다.
2) 다른 릴레이션의 기본키를 참조하는 속성이다.
3) 참조하고(외래키) 참조되는(기본키) 양쪽 릴레이션의 도메인은 같아야 한다.
4) 참조되는 값이 변경되면 참조하는 값도 변경된다.
5) NULL값과 중복값 등이 허용된다.
6) 자기 자신의 기본키를 참조하는 외래키도 가능하다.
7) 외래키는 기본키의 일부가 될 수 있다.
데이터 무결성은 DB에 저장된 데이터의 일관성과 정확성을 지키는 것을 말한다. 일관성과 정확성을 잃어버린 DB는 정보 가치가 심각하게 훼손된다. 일관성과 정확성을 바탕으로 구축된 DB가 계속해서 무결성을 유지하려면 투플의 삽입/삭제/수정 시 데이터의 제약조건 준수 여부를 확인해야 한다.
릴레이션 내의 투플들이 각 속성의 도메인에 지정된 값만 가져야 한다는 조건이다. 예를 들어 주문 릴레이션에서 주문일자는 날짜 데이터만 사용해야 한다. 도메인 무결성 제약조건은 속성값과 관련된 무결성으로, SQL문에서 데이터 형식, 널, 기본값 등을 사용하여 지정할 수 있다. 프로그래밍 언어의 변수형 선언과 개념이 유사하다.
릴레이션은 기본키를 지정하고 그에 따른 무결성 원칙(기본키는 NULL을 가져서는 안되며, 릴레이션 내에 오직 하나의 값만 존재해야 함)을 지켜야 한다는 조건이다.
릴레이션 간의 참조 관계를 선언하는 제약조건이다. 일반적으로 참조되는 릴레이션을 부모, 참조하는 릴레이션을 자식이라고 한다. 참조 무결성 제약조건이란 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 같아야 하며, 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받는다는 것이다. 즉 부모 릴레이션의 도메인과 다른 값으로 삽입/수정하거나, 반대로 자식 릴레이션에서 참조하는 값을 부모 릴레이션에서 삭제하거나 다른 값으로 변경될 경우 거부된다.
릴레이션은 데이터의 변경이 일어날 때 제약조건에 위배될 수 있다. 따라서 제약조건의 준수 여부는 데이터의 삽입/수정/삭제가 있을 때마다 확인해야 한다. 예를 들어 기존 기본키와 같은 값을 가진 투플을 삽입하거나 , 기존 기본키 값을 다른 투플의 기본키와 같은 값으로 변경한다면 그 연산은 거부된다. 또 부모 릴레이션에서 투플을 삭제할 경우 자식 릴레이션에서도 같이 변경해야 한다.
개체 무결성 제약조건
RDBMS는 투플을 삽입하거나 수정할 때마다 개체 무결성 제약조건을 지키는지 확인한다. 즉 기본키 값이 유일한지, NULL이 아닌지 검사한다. 조건에 맞지 않으면 삽입 연산을 거부하고 오류 메시지를 보낸다.
참조 무결성 제약조건
다음 그림에서 학과 릴레이션이 부모 릴레이션이고, 학생 릴레이션이 자식 릴레이션이다.

학생 릴레이션에 새로운 투플(601, 박세리, 3001)이 삽입되는 과정을 보자. DBMS는 먼저 도메인 무결성 제약조건을 확인한 후 개체 무결성 제약조건에 위배되는 값이 없는지 확인한다. 이후 학과코드 3001이 학과 릴레이션의 기본키에 존재하는지 확인한다. 그런데 3001은 학과 릴레이션에 없으므로 삽입이 거부된다. 이 경우 학과 릴레이션에 새로운 투플(3001, 수학과)를 삽입한 후 수행하면 정상적으로 진행된다. 참고로, 학생 릴레이션 생성 시 외래키인 학과코드 속성에 NULL값을 허용하였다면 학과코드 값이 없어도 삽입할 수 있다. 부모 릴레이션에 삽입은 개체 무결성 제약조건에 따르면 된다.
삽입과는 반대로 자식 릴레이션에서 투플이 삭제되는 경우 부모 릴레이션에는 아무런 영향을 주지 않으므로 바로 삭제할 수 있다. 그러나 부모 릴레이션에서 투플이 삭제되는 경우에는 문제가 발생할 수 있다. 예를 들어 학과 릴레이션에서 체육학과를 삭제해야 한다면 DBMS는 우선 학과 릴레이션의 학과코드를 참조하고 있는 다른 릴레이션 값이 없는지 찾는다. 이 경우 학생 릴레이션의 두 개의 투플이 참조하고 있으므로 문제가 생긴다. 이 문제에 대한 조치 방법으로 다음과 같은 네 가지를 고려할 수 있다.
1) 즉시 작업을 중지한다.
2) 자식 릴레이션의 관련 투플을 삭제한다.
3) 초기에 설정된 어떤 값으로 변경한다.
4) NULL로 설정한다.
이처럼 DBMS에는 부모 릴레이션에서 투플을 삭제할 때 참조 무결성 제약조건을 수행하기 위한 네 가지 옵션이 있다. 이는 제약조건 선언 시 자식 릴레이션에도 지정해 주어야 한다.

수정은 삭제와 삽입 명령이 연속해서 수행된다고 보면 된다. 부모 릴레이션의 수정이 일어날 때 삭제 옵션에 따라 처리된 후 문제가 없으면 다시 삽입 제약조건에 따라 처린된다. 학과 릴레이션의 학과코드 1001을 A001로 수정할 경우, 삭제 옵션에 따라(예: CASCADE인 경우) 자식 릴레이션의 관련 투플을 처리한 후, 삽입 제약조건에 따라 학과 릴레이션에 삽입한다.
릴레이션에서 원하는 결과를 얻기 위해 대수 연산을 이용하여 질의하는 방법을 기술하는 언어이다. 관계대수는 절차적 언어로, 하나 이상의 릴레이션에 연산을 수행하여 결과 릴레이션이 나오기까지의 절차를 확인하는 방법을 제공한다. DBMS 내부에서는 관계대수에 기반한 연산을 수행하여 최종 결과 집합을 반환한다.
릴레이션의 수학적 의미
RDB는 릴레이션이라는 수학적 개념에 기초한다. 릴레이션 은 카티션 프로덕트의 부분집합으로 정의한다.
원소 개수가 n인 집합 의 부분집합의 개수는 이므로, 카티션곱 의 부분집합의 개수는 이다.
카티션곱의 기초 집합 각각이 가질 수 있는 값의 범위를 도메인이라 한다.
관계대수 연산자
릴레이션 연산에 사용되는 기호이다. 두 개의 그룹으로 나눌 수 있으며, 첫째는 관계 데이터 모델을 위해 고한된 순수 관계연산에 사용된느 연산자이고, 둘째는 일반 집합연산이다.
-순수 관계연산: 셀렉션, 프로젝션, 조인, 디비전, 개병
-일반 집합연산: 합집합, 교집합, 차집합, 카티션곱
가장 기본적인 연산으로, 하나의 릴레이션을 대상으로 하는 단항 연산자이다. 셀렉션은 대상 릴레이션에서 인스턴스의 일부, 즉 투플의 집합을 반환하며 프로젝션은 릴레이션에서 지정된 속성값 일부를 반환한다.
질의2-1. 도서 중 가격이 8,000원 이상이고 도서번호가 3 이상인 도서를 검색하시오.
-
질의 2.2. (이름, 주소, 핸드폰)의 카탈로그 주소록을 만드시오.
-
카티션곱을 제외한 합집합, 교집합, 차집합은 두 릴레이션의 차수 및 도메인과 속성의 순서가 동일해야 한다. 즉, 각 릴레이션의 속성 수가 같고 순서도 같아야 하며 각각 동일한 도메인으로 대응되어야 한다. 이 조건을 합병가능(union compatible)이라고 한다. 이때 속성 이름은 동일하지 않아도 되며, 반환되는 릴레이션의 속성 이름은 첫 번째 릴레이션의 이름과 같다.
질의 2-3. 마당서점에서는 지점 A와 지점 B가 있다. 두 지점의 도서는 각 지점에서 관리하며 릴레이션 이름은 각각 도서A, 도서B다. 마당서점의 도서를 하나의 릴레이션으로 나타내시오.
-
질의 2-4. 마당서점의 두 지점에서 동일하게 보유하고 있는 도서 목록을 나타내시오.
-
질의 2-5. 마당서점의 두 지점 중 A에서만 보유하고 있는 도서 목록을 나타내시오.
-
질의 2-6. 고객 릴레이션과 주문 릴레이션의 카티션곱을 구하시오.
-
카티션곱은 두 릴레이션을 무조건 수평으로 합친 결과를 반환하므로 결과에 의미가 없으며, 대부분 유용한 자료로 활용하기 힘들다. 이때 셀렉션과 프로젝션 연산을 조합하여 두 릴레이션의 관계에 따른 의미있는 결과를 찾으면 유용하게 사용 가능하다.
두 릴레이션의 공통 속성을 기준으로 속성값이 같은 투플을 수평으로 결합하는 연산이다. 즉, 두 릴레이션에 카티션곱 연산을 한 후 셀렉션 연산을 한 것으로 정의할 수 있다. 이때 셀렉션 연산의 은 속성값이 같은지 비교하는 식이다.
조인 연산의 기호는 를 사용한다. 조인 연산자는 기본 연산자의 조합으로 구현할 수 있는 유도된 연산자로, 두 개의 릴레이션을 대상으로 하는 이항 연산자다. 조인 연산의 작성 형식은 다음과 같다. R, S는 릴레이션이며 c는 조인 조건을 나타낸다.
조인을 수행하기 위해서는 두 릴레이션의 조인에 참여하는 속성이 서로 동일한 도메인으로 구성되어야 한다. 조인 연산의 결과는 공통 속성의 속성값이 동일한 투플만 반환한다.
조인 연산은 크게 기본 조인 연산과 확장된 조인 연산으로 구분할 수 있다. 기본 조인 연산에는 두 릴레이션 간의 속성값을 비교하여 조건에 맞는 투플을 반환하는 세타조인, 속성값이 같은 투플만 반환하는 동등도인, 속성 이름이 같은 투플만 대상으로 하되 중복 속성을 제거하고 반환하는 자연조인이 있다. 확장된 조인 연산에는 두 릴레이션을 조인한 후 한 릴레이션의 조인만 반환하는 세미조인, 조인에 실패한 값들을 NULL로 채워서 반환하는 외부조인이 있다.
세타조인과 동등조인
세타조인은 조인에 참여하는 두 릴레이션의 속성값을 비교하여 조건을 만족하는 투플만 반환한다. 세타조인의 조건은 중 하나가 된다. 작성 형식은 다음과 같다. R과 S는 릴레이션이며, r은 R의 속성, s는 S의 속성을 나타낸다.
동등조인(또는 내부조인)은 세타조인에서 =연산자를 사용한 조인을 말한다. 보통 조인 연산이라고 하면 동등조인을 지칭한다. 사용하는 기호는 이다.
질의 2-7. 고객과 고객의 주문 사항을 모두 나타내시오.
-
자연조인
동등조인의 결과 릴레이션은 첫 번째 릴레이션의 속성과 두 번째 릴레이션의 속성이 모두 나타난다. 자연조인은 동등조인에서 조인에 참여한 속성이 두 번 나오지 않도록 두 번째 속성을 제거한 결과를 반환한다. 기호는 을 사용하며 자연조인의 결과 차수는 '두 릴레이션의 차수의 합-1'이다.
질의 2-8. 고객과 고객의 주문 사항을 모두 보여주되 같은 속성을 한 번만 표시하시오.
-
외부조인과 세미조인
외부조인은 자연조인의 확장된 형태다. 외부조인은 자연조인 시 조인에 실패한 투플을 모두 보여주되 값이 없는 대응 속성에는 NULL을 채워 반환한다. 외부조인은 모든 속성을 보여주는 기준 릴레이션 위치에 따라 왼쪽 외부조인, 오른쪽 외부조인, 완전 외부조인으로 나뉜다.

위 그림은 왼쪽 외부조인의 예다. 릴레이션 R1은 속성 A, B를, 릴레이션 R2는 속성 B와 C를 가지고 있다. 속성 B를 기준으로 두 릴레이션을 자연조인하면 (aa, 1, dd)와 (cc, 3, ee)가 생성된다. 왼쪽 외부조인은 조인에 참여하지 못한 R1의 (cc, 2) 투플을 결과에 포함시키면 된다. 이때 결과의 C 속성은 해당되는 값이 없으므로 NULL을 넣어 반환한다.
질의 2-9. 마당서점의 고객과 고객의 주문 내역을 나타내시오.
1) 고객 기준으로 주문 내역이 없는 고객도 나타내시오.
2) 주문 내역이 없는 고객과 고객 릴레이션에 고객번호가 없는 주문을 모두 나타내시오.
3) 주문 내역 기준으로 고객 릴레이션에 고객번호가 없는 주문도 모두 나타내시오.
세미조인은 자연조인을 한 후 두 릴레이션 중 한쪽 릴레이션 결과만 반환한다. 기호는 이다.
질의 2-10. 마당서점의 고객 중 주문 내역이 있는 고객의 고객 정보를 나타내시오.
-
(1).
| A | B | C |
|---|---|---|
| a2 | b1 | c1 |
(2).
| A | B |
|---|---|
| a1 | b1 |
| a2 | b1 |
| a3 | b1 |
| a4 | b2 |
(3).
| A | B |
|---|---|
| a2 | b1 |
(4). : (첫 5개 튜플만 표시)
| A | B | C(R) | C(S) | D | E |
|---|---|---|---|---|---|
| a1 | b1 | c1 | c1 | d2 | e1 |
| a1 | b1 | c1 | c1 | d1 | e2 |
| a1 | b1 | c1 | c2 | d3 | e3 |
| a1 | b1 | c1 | c5 | d3 | e3 |
| a2 | b1 | c1 | c1 | d2 | e1 |
(5).
| A | B | R.C | S.C | D | E |
|---|---|---|---|---|---|
| a1 | b1 | c1 | c1 | d2 | e1 |
| a1 | b1 | c1 | c1 | d1 | e2 |
| a2 | b1 | c1 | c1 | d2 | e1 |
| a2 | b1 | c1 | c1 | d1 | e2 |
| a3 | b1 | c2 | c2 | d3 | e3 |
(6). (5)의 왼쪽 외부조인
| A | B | C | D | E |
|---|---|---|---|---|
| a1 | b1 | c1 | d2 | e1 |
| a1 | b1 | c1 | d1 | e2 |
| a2 | b1 | c1 | d2 | e1 |
| a2 | b1 | c1 | d1 | e2 |
| a3 | b1 | c2 | d3 | e3 |
| a4 | b2 | c4 | NULL | NULL |
(7). (5)의 오른쪽 외부조인
| A | B | C | D | E |
|---|---|---|---|---|
| a1 | b1 | c1 | d2 | e1 |
| a2 | b1 | c1 | d2 | e1 |
| a1 | b1 | c1 | d1 | e2 |
| a2 | b1 | c1 | d1 | e2 |
| a3 | b1 | c2 | d3 | e3 |
| NULL | NULL | c5 | d3 | e3 |
(8). (5)의 전체 외부조인
| A | B | C | D | E |
|---|---|---|---|---|
| a1 | b1 | c1 | d2 | e1 |
| a1 | b1 | c1 | d1 | e2 |
| a2 | b1 | c1 | d2 | e1 |
| a2 | b1 | c1 | d1 | e2 |
| a3 | b1 | c2 | d3 | e3 |
| a4 | b2 | c4 | NULL | NULL |
| NULL | NULL | c5 | d3 | e3 |
(9).
| C |
|---|
| c1 |
| c2 |
| c4 |
| c5 |
(10).
| C |
|---|
| c1 |
| c2 |
고객 중 나이가 25세 초과인 사람들의 이름을 선택합니다.
| name |
|---|
| Jane |
| Victor |
고객 중 ID가 2보다 크거나 나이가 31세인 사람들을 선택합니다.
| id | name | age | gender | jobid | cityid |
|---|---|---|---|---|---|
| 3 | Victor | 31 | Male | 2 | 4 |
| 4 | Jane | 27 | Female | 1 | 2 |
Customer와 Job 릴레이션을 결합하고, Customer의 jobid와 Job의 jobid가 일치하는 튜플을 선택합니다.
| id | name | age | gender | jobid | cityid | jobid | jobname |
|---|---|---|---|---|---|---|---|
| 1 | John | 25 | Male | 1 | 2 | 1 | Engineer |
| 2 | Sara | 30 | Female | 3 | 3 | 3 | Developer |
| 3 | Victor | 31 | Male | 2 | 4 | 2 | Programmer |
| 4 | Jane | 27 | Female | 1 | 2 | 1 | Engineer |
Customer, Job, City 릴레이션들을 카테시안 곱으로 조합합니다. 결과는 모든 가능한 조합으로 구성됩니다.
| id | name | age | gender | jobid | cityid | jobid | jobname | cityid | cityname |
|---|---|---|---|---|---|---|---|---|---|
| 1 | John | 25 | Male | 1 | 2 | 1 | Engineer | 1 | Boston |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| name | gender |
|---|---|
| John | Male |
| Sara | Female |
| Victor | Male |
| Jane | Female |
1)
최소 투플 수:
최대 투플 수:
2)
최소 투플 수:
최대 투플 수:
3)
최소 투플 수: 0
최소 투플 수:
4)
최소 투플 수: 0
최대 투플 수: 와 의 합
5)
최소 투플 수: 0
최대 투플 수:

LEFT OUTER JOIN 시
ON절에는 우측(NULL로 채워지는 쪽)의 추가 제약조건을 넣고
WHERE절에는 좌측의 추가 제약조건을 넣어야 한다.
EXTRACT(unit FROM date)
unit: 추출하려는 날짜/시간. YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
SUBSTRING_INDEX(str, delim, count)
count: 양수면 시작부터 delim까지, 음수면 오른쪽 끝에서 delim까지