데이터 조작어(Data Manipulation Language, DML)

  • 데이터베이스 내의 원하는 데이터를 검색, 수정, 삽입, 삭제한다. 대부분의 데이터 조작어는 SUM, COUNT, AVG와 같은 내장 함수들을 갖고 있다. 일반적으로 프로그램에 내포(코드에 포함)되어 사용된다.
  • 데이터 검색 : SELECT [col1], [col2], ... FROM [tablename] [option1] [option2], ...;

ex) SELECT * FROM [tablename]; -> 전체 데이터 조회

  • 데이터 수정 : UPDATE [tablename] SET [col1=new_data1], [col2=new_data2], ... WHERE [target_col]=[value];
  • 데이터 삭제 : DELETE FROM [tablename] WHERE [target_col]=[value];

ex) DELETE FROM [tablename]; -> 전체 데이터 삭제

  • 데이터 삽입 : INSERT INTO [tablename] ([col1], [col2], ...) VALUES ([data1], [data2], ...);

- 컬럼명을 지정하지 않을 경우, 스키마 구조의 순서에 맞게 데이터를 삽입해야 한다.

- 컬럼명을 지정할 경우, 지정한 컬럼명의 순서에 맞게 데이터를 삽입해야 한다.


* 아래의 모든 예제는 MSSQL을 기반으로 작성됩니다.


  SELECT 문

  • 관계 데이터베이스에서 정보를 검색하는 SQL
  • 관계 대수의 실렉션(Selection) 연산자와는 의미가 완전히 다르다.
  • 관계 대수의 실렉션(Selection), 프로젝션(Projection), 조인(Join), 카티션 곱(Cartisian Product) 등을 결합한 것
  • 관계 데이터베이스에서 가장 자주 사용된다.

빨간색은 필수적인 절이고, 나머지는 선택 사항

선택 사항은 모두 포함할 필요는 없으나 순서는 매우 중요

  • 별칭(Alias) : 서로 다른 릴레이션에 동일한 이름을 가진 애트리뷰트가 속해 있을 때 애트리뷰트의 이름을 구분하는 방법

[tablename1.col] FROM [tablename1] AS [alias1], [tablename2] AS [alias2];

 

 ex) EMPLOYEE.DNO FROM EMPLOYEE AS E, DEPARTMENT AS D;

 

이후 E.DNO 또는 D.DNO 로 애트리뷰트를 구분할 수 있다.

 


질의 : 전체 부서의 모든 애트리뷰트들을 검색하라.


 

이 질의는 좋은 질의가 아닌데, 그 이유는 컬럼 추가 시 응용 프로그램 입장에서 오류가 발생할 수 있기 때문이다.

따라서 아래와 같이 조회할 컬럼을 지정하는 것이 적절하다.


* 빨간색 물결 밑줄은 스키마(ex. KIM.DEPARTMENT)를 명시하지 않아서 뜨는 겁니다.


질의 : 모든 부서의 부서 번호와 부서 이름을 검색하라.

 



질의 : 모든 사원들의 직급을 검색하라.

  

 


질의 : 모든 사원들의 상이한 직급을 검색하라.

 


DISTINCT 절은 중복을 없애주는데, 해당 쿼리는 성능이 저하되므로 불필요한 사용은 자제해야 한다.

 


질의 : 2번 부서에 근무하는 사원들에 관한 모든 정보를 검색하라.

 


WHERE 절은 조건문에 해당하며주로 기본 키와 함께 사용된다.


 

질의 : 이씨 성을 가진 사원들의 이름, 직급, 소속 부서 번호를 검색하라.


문자열 탐색 시 MSSQL 내장 함수 SUBSTR을 사용해도 상관없지만, DBMS 공용 함수인 LIKE를 사용하였다.

LIKE 뒤에 %의 위치에 따라 검색하고자 하는 문자열의 위치를 정할 수 있다.

... LIKE '김%' : 김으로 시작하는 문자열 검색

... LIKE '%김%' : 김을 포함하는 문자열 검색

... LIKE '%김' : 김으로 끝나는 문자열 검색

 


질의 : 직급이 과장이면서 1번 부서에서 근무하는 사원들의 이름과 급여를 검색하라.

 



질의 : 직급이 과장이면서 1번 부서에 속하지 않은 사원들의 이름과 급여를 검색하라.


<>부정 연산자이다.

 


질의 : 급여가 3,000,000원 이상이고 4,500,000원 이하인 사원들의 이름, 직급, 급여를 검색하라.

 


 

질의 : 1번 부서나 3번 부서에 소속된 사원들에 관한 모든 정보를 검색하라.



DNO IN (1, 3) : DNO=1 OR DNO=3 의 간결한 표현



질의 : 직급이 과장인 사원들에 대하여 이름과, 현재의 급여, 급여가 10% 인상되었을 때의 값을 검색하라.

  

AS [new_col] 절이 없을 경우 빈 컬럼명이 나타나므로, 수식 사용 시 별칭(Alias)이 필수적으로 요구된다.

  


  NULL 값

  • 널값을 포함한 다른 값과 널값을 +, - 등을 사용하여 연산하면 결과는 널값이다.
  • COUNT(*)을 제외한 집단 함수(AVG, MAX, MIN ..., etc)들은 널값을 무시한다.
  • 어떤 애트리뷰트에 들어 있는 값이 NULL인가를 비교하려면 아래와 같은 구문을 사용해야 한다.

 

  ORDER BY 절

  • 하나 이상의 애트리뷰트를 사용하여 검색 결과를 정렬할 때 사용한다.
  • 해당 절을 사용하지 않을 경우 릴레이션에 투플들이 삽입된 순서대로 보여진다.
  • SELECT 문에서 가장 마지막에 사용되는 절이다.
  • 디폴트 정렬 순서는 오름차순(ASC)이고, DESC를 지정하여 내림차순으로 지정할 수 있다.
  • 널값은 오름차순에서는 가장 마지막에 나타나고, 내림차순에서는 가장 먼저 나타난다.
  • SELECT 절에서 조회할 애트리뷰트들을 사용해서 정렬해야 한다.

 

질의 : 2번 부서에 근무하는 사원들의 급여, 직급, 이름을 검색하여 급여의 오름차순으로 정렬하라.

  


 

  집단 함수

  • 데이터베이스에서 검색된 여러 투플들의 집단에 적용되는 함수
  • 한 릴레이션의 한 개의 애트리뷰트에 적용되어 단일값을 반환한다.
  • SELECT 절과 HAVING 절에만 나타날 수 있다.
  • COUNT(*)는 결과 릴레이션의 모든 행들의 총 개수를 구하는 반면에 COUNT(애트리뷰트)는 해당 애트리뷰트에서 널값이 아닌 값들의 개수를 구한다.
  • COUNT(*)를 제외하고는 널값을 제거한 후 남아 있는 값들에 대해서 집단 함수의 값을 구한다.
  • SQL문에서 키워드 DISTINCT가 집단 함수와 함께 사용되면 집단 함수가 적용되기 전에 먼저 중복을 제거한다.
  • COUNT : 투플이나 값들의 개수
  • SUM : 값들의 합
  • SVG : 값들의 평균값
  • MAX : 값들의 최댓값
  • MIN : 값들의 최솟값

 

질의 : 모든 사원들의 평균 급여와 최대 급여를 검색하라.

 


 

  GROUP BY 절

  • 그룹화를 위해 사용된 애트리뷰트에 동일한 값을 갖는 투플들을 하나의 그룹으로 묶는다.
  • 이 애트리뷰트를 그룹화 애트리뷰트(grouping attribute)라고 한다.
  • 각 그룹에 대하여 결과 릴레이션에 하나의 투플이 생성된다.
  • SELECT 절에는 각 그룹마다 하나의 값을 갖는 애트리뷰트, 집단 함수, 그룹화에 사용된 애트리뷰트들만 나타날 수 있다.
  • 아래의 질의는 그룹화를 하지 않고 EMPLOYEE 릴레이션의 모든 투플에 대해서 사원번호와 모든 사원들의 평균 급여를 검색하므로 잘못된 것이다.


[ 질의 결과 ]



올바른 질의는 아래의 경우다.


     [ 질의 결과 ]

 


질의 : 모든 사원들에 대해서 사원들이 속한 부서 번호 별로 그룹화하고, 

각 부서마다 부서 번호, 평균 급여, 최대 급여를 검색하라

 

 


  HAVING 절

  • 그룹화된 애트리뷰트에 대하여 그룹이 만족해야 하는 조건을 명시한다.
  • 어떤 조건을 만족하는 그룹들에 대해서만 집단 함수를 적용하기 사용된다.
  • HAVING 절에 나타나는 애트리뷰트는 반드시 GROUP BY 절에 나타나거나 집단 함수에 포함되어야 한다.

 

질의 : 모든 사원들에 대해서 사원들이 속한 부서 번호 별로 그룹화하고, 

평균 급여가 2500000원 이상인 부서에 대해서 부서 번호, 평균 급여, 최대 급여를 검색하라.

 


 

  집합 연산

  • 집한 연산을 적용하려면 두 릴레이션이 합집합 호환성을 가져야 한다.
  • UNION : 합집합
  • EXCEPT : 차집합
  • INTERSECT : 교집합
  • UNION ALL : 중복된 결과를 포함한 합집합
  • EXCEPT ALL : 중복된 결과를 포함한 차집합
  • INTERSECT ALL : 중복된 결과를 포함한 교집합

 

질의 : 김창숙이 속한 부서이거나 개발 부서의 부서 번호를 검색하라.




아래는 다른 예시이다.




  조인(Join)

  • 조인은 두 개 이상의 릴레이션으로부터 연관된 투플들을 결합한다.
  • 조인의 일반적인 형식

  • 조인 조건 : 두 릴레이션 사이에 속하는 애트리뷰트 값들을 비교 연산자로 연결한 것
  • 가장 흔히 사용되는 비교 연산자 : =
  • 조인 조건 생략 및 잘못된 표현을 할 경우 카티션 곱이 적용된다.
  • 조인 질의가 수행되는 과정

조인 조건을 만족하는 투플 검색

검색한 투플들 중 SELECT 절에 명시된 애트리뷰트들만 프로젝트

DISTINCT 키워드 사용 시 중복 배제


  • 조인 조건이 명확해지도록 애트리뷰트 이름 앞에 릴레이션 이름이나 투플 변수를 사용하는 것이 바람직하다. 특히, 두 릴레이션의 조인 애트리뷰트 이름이 동일하다면 반드시 애트리뷰트 이름 앞에 릴레이션 이름이나 투플 변수를 사용해야 한다. 그렇지 않으면 오류 발생

-> [tablename] AS [tuple_variable]

  • 결과 릴레이션의 투플 수는 외래 키의 투플 수와 동일하거나 외래 키에 널값이 있으면 나타나지 않으므로 외래 키의 투플 수보다 작을 수 있다.

 

질의 : 모든 사원의 이름과 이 사원이 속한 부서 이름을 검색하라.


EMPLOYEE의 투플 변수는 E, DEPARTMENT의 투플 변수는 D이다.

위의 릴레이션은 아래의 결과 릴레이션에서 EMPNAMEDEPTNAME을 프로젝션한 결과이다.




  • 자체 조인(Self Join)

- 한 릴레이션에 속하는 투플을 동일한 릴레이션에 속하는 투플들과 조인하는 것

- 자기 자신을 참조하는 릴레이션처럼 포함 관계나 순환 관계가 있을 때만 사용한다.

- 실제로는 한 릴레이션이 접근되지만 FROM 절에 두 릴레이션이 참조되는 것처럼 나타내기 위해서 그 릴레이션에 대한 별칭(Alias)을 두 개 지정해야 한다.

 

질의 : 모든 사원의 이름과 이 사원이 속한 부서 이름을 검색하라.




질의 : 모든 사원에 대해서 소속 부서 이름, 사원의 이름, 직급, 급여를 검색하라. 

부서 이름에 대해서 오름차순, 부서 이름이 같은 경우에는 급여에 대해서 내림차순으로 정렬하라.



 

  중첩 질의(Nested Query)

  • 외부 질의의 WHERE 절에 다시 SELECT ... FROM ... WHERE 형태로 포함된 SELECT
  • 부질의(Subquery)라고도 한다.
  • INSERT, DELETE, UPDATE문에도 사용될 수 있다.
  • 중첩 질의의 결과로 한 개의 단일값, 한 개의 애트리뷰트로 이루어진 릴레이션, 여러 애트리뷰트로 이루어진 릴레이션이 반환될 수 있다.
  • 한 개의 단일값을 가진 결과 릴레이션은 비교 연산자의 우항으로 사용될 수 있다.
  • 중첩 질의의 형식

 

  • 한 개의 단일값이 반환되는 경우

질의 : 박영창과 같은 직급을 갖는 모든 사원들의 이름과 직급을 검색하라.



- 위의 중첩 질의(괄호 안의 질의)로부터 과장이라는 단일값이 반환된다.

- 단일값을 반환하는 SELECT문의 조건(WHERE)에는 중복이 있는 컬럼=형태가 오면 안된다따라서 실제로 위의 질의는 부적절하다고 볼 수 있다. 박영창이라는 이름은 중복될 수 있기 때문이다.

- 조건에 중복이 있으면 안되는 이유 : 비교 연산자 사용이 불가능하기 때문이다.


  • 한 개의 애트리뷰트로 이루어진 릴레이션이 반환되는 경우

- 중첩 질의의 결과로 한 개의 애트리뷰트로 이루어진 다수의 투플들이 반환 될 수 있다.

- 외부 질의의 WHERE절에서 IN, ANY(SOME), ALL, EXISTS 와 같은 연산자를 사용해야 한다.


키워드 IN

한 애트리뷰트의 값이 주어진 값들의 집합에 속하는지 확인할 때 사용된다.




키워드 ANY 또는 SOME

한 애트리뷰트의 값이 주어진 값들의 집합에 속하지만 

하나 이상의 값들과 어떤 관계를 갖는지 확인할 때 사용된다.




키워드 ALL

한 애트리뷰트의 값이 주어진 값들의 집합에 속하는 모든 값들과 어떤 관계를 갖는가를 확인할 때 사용된다.



 

질의 : 영업부나 개발부에 근무하는 사원들의 이름을 검색하라.


 

위의 질의를 중첩 질의를 사용하지 않은 다음과 같은 조인 질의로 나타낼 수 있다.


 

실제로, 중첩 질의를 사용하여 표현된 대부분의 질의를 중첩 질의가 없는 조인 질의로 표현할 수 있다.


  • 여러 애트리뷰트들로 이루어진 릴레이션이 반환되는 경우

- EXISTS 연산자를 사용하여 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사한다.

- 중첩 질의의 결과가 빈 릴레이션이 아니면 참이 되고, 그렇지 않으면 거짓이 된다.

 

질의 : 영업부나 개발부에 근무하는 사원들의 이름을 검색하라.


 

- 외부 질의의 대상이 되는 테이블(위의 경우 EMPLOYEE)의 총 투플 수 만큼 중첩 질의가 실행된다. 이를 상관 중첩 질의라고 한다.


  • 상관 중첩 질의(Correlated Nested Query)

- 중첩 질의의 WHERE절에 있는 프레디키트(조건)에서 외부 질의에 선언된 릴레이션의 일부 애트리뷰트를 참조하는 질의

- 중첩 질의의 수행 결과가 단일 값이든, 하나 이상의 애트리뷰트로 이루어진 릴레이션이든 외부 질의로 여러 번 결과를 반환한다.

- 상관 중첩 질의에서는 외부 질의를 만족하는 각 투플이 구해진 후에 중첩 질의가 수행되므로 상관 중첩 질의는 외부 질의를 만족하는 투플 수만큼 여러 번 수행될 수 있다. -> 성능 저하 야기

 

질의 : 자신이 속한 부서의 사원들의 평균 급여보다 많은 급여를 받는 사원들에 대해서 이름, 부서번호, 급여를 검색하라.



- 외부 질의에서 첫 번째 투플에 해당하는 사원이 속한 부서(E.DNO)의 평균 급여와 그 사원의 급여를 비교(SALARY > AVG)한다.

- 이후 외부 질의에 선언된 릴레이션의 다른 투플에 대해서도 처음과 같은 방식으로 비교 결과가 참인지 거짓인지 반환한다.

- 총 투플 수만큼 중첩 질의가 실행된다.

- 마지막으로 만족하는 투플들의 집합(=결과 릴레이션)을 외부 질의가 반환한다.

 



  INSERT 문

  • 기존의 릴레이션에 투플을 삽입하는 데이터 조작어
  • 참조되는 릴레이션에 투플이 삽입되는 경우에는 참조 무결성 제약조건의 위배가 발생하지 않으나 참조하는 릴레이션에 투플이 삽입되는 경우에는 참조 무결성 제약조건을 위배할 수 있다.
  • 릴레이션에 한 번에 한 투플씩 삽입하는 것과 한 번에 여러 개의 투플을 삽입할 수 있는 것으로 구분한다.
  • 구문

INSERT INTO [tablename](애트리뷰트1, ..., 애트리뷰트n) VALUES (1, ..., n);

  • (애트리뷰트)()의 순서는 동일해야 한다.
  • 애트리뷰트를 제시하지 않을 경우, 릴레이션 스키마에 명시된 애트리뷰트의 순서에 맞추어 값을 삽입해야 한다.

INSERT INTO [tablename] VALUES (1, ..., n);

  • 릴레이션에 한 번에 한 투플씩 삽입하는 INSERT

질의 : DEPARTMENT 릴레이션에 (5, 연구, NULL) 투플을 삽입하시오.


형광색 펜이 삐뚤삐뚤하네요.. 죄송합니다...  : (


 

  • 릴레이션에 한 번에 여러 개의 투플을 삽입하는 INSERT

질의 : EMPLOYEE 릴레이션에서 급여가 3000000원 이상인 사원들의 이름, 직급, 급여를 검색하여

HIGH_SALARY 릴레이션에 삽입하라.



위의 질의를 위한 문장 구조는 아래와 같다.

 


  DELETE 문

  • 한 릴레이션으로부터 한 개 이상의 투플들을 삭제하는 데이터 조작어
  • 참조되는 릴레이션의 삭제 연산의 결과로 참조 무결성 제약조건이 위배될 수 있으나, 참조하는 릴레이션에서 투플을 삭제하면 참조 무결성 제약조건을 위배하지 않는다. -> INSERT문과 반대
  • 구문

DELETE FROM [tablename] WHERE [조건];

  • 전체 투플 삭제 : DELETE FROM [tablename];

 

질의 : DEPARTMENT 릴레이션에서 4번 부서를 삭제하라.



  

  UPDATE 문

  • 한 릴레이션에 들어 있는 투플들의 애트리뷰트 값들을 수정하는 데이터 조작어
  • 기본키나 외래키에 속하는 애트리뷰트의 값이 수정되면 참조 무결성 제약조건을 위배할 수 있다.
  • 구문

 

질의 : 사원 번호가 2106인 사원의 소속 부서를 3번 부서로 옮기고, 급여를 10% 올리시오.


[ 질의 실행 전 EMPLOYEE ]


[ 질의 실행 후 EMPLOYEE ]

 

  트리거(Trigger)

  • 명시된 이벤트(데이터베이스의 갱신)가 발생할 때마다 DBMS가 자동적으로 수행하는 쿼리문 또는 절차
  • 데이터베이스의 무결성을 유지하기 위한 일반적이고 강력한 도구
  • 트리거를 명시하려면 트리거를 활성화 시키는 사건인 이벤트(삽입, 삭제 등)와 트리거가 활성화되었을 때 수행되는 테스트인 조건, 트리거가 활성화되고 조건이 참일 때 수행되는 쿼리문(절차)동작을 표현해야 한다.
  • 트리거를 이벤트-조건-동작(ECA) 규칙이라고도 부른다. - Event, Condition, Action
  • 구문

  • MSSQL에서 트리거를 정의하는 문장은 SQL3의 트리거 문장과 동일하지는 않다.
  • 이벤트의 가능한 예로는 테이블에 투플 삽입, 삭제, 수정 등이 있다.
  • 조건은 임의의 형태의 프레디키트
  • 동작은 데이터베이스에 대한 임의의 갱신(INSERT, DELETE, UPDATE 쿼리문)
  • 어떤 이벤트가 발생했을 때 조건이 참이 되면 트리거와 연관된 동작이 수행되고, 거짓이면 아무 동작도 수행되지 않는다.
  • 삽입, 삭제, 수정 등이 일어나기 전에 동작하는 트리거와 일어난 후에 동작하는 트리거로 구분한다.


질의 : 새로운 사원이 입사할 대마다 사원의 급여가 1500000 미만인 경우에는 급여를 10% 인상하는 트리거를 작성하시오.


 이벤트 동작 조건

 

  • 트리거는 연쇄적으로 활성화될 수 있다. 그 과정은, 하나의 트리거가 활성화되어 이 트리거 내의 한 SQL문이 수행되고 그 결과로 다른 트리거를 활성화하여 그 트리거 내의 SQL문이 수행되는 것이다.

 

 


 

  SQL 개요

  • SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는데 중요한 요인 중 하나이다.
  • SQLIBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어이다.
  • 1986년에 ANSI(미국 표준 기구)에서 SQL 표준을 채택함으로써 SQL이 널리 사용되는데 기여
  • 다양한 상용 관계 DBMS마다 지원하는 SQL 기능에 다소 차이가 있다.
  • MSSQL에서는 추가기능이 존재한다.
  • SQL은 비절차적 언어(선언적 언어)이므로 사용자는 자신이 원하는 바(what)만 명시하며, 원하는 것을 처리하는 방법(how)은 명시할 수 없다.
  • 관계 DBMS는 사용자가 입력한 SQL문을 번역하여 사용자가 요구한 데이터를 찾는데 필요한 모든 과정(질의 처리 과정)을 담당한다.
  • 자연어에 가까운 구문을 사용하여 질의를 표현할 수 있다.
  • 대화식 SQL(interactive SQL)과 내포된 SQL(embedded SQL) 두 가지 인터페이스를 지원한다. 내포된 SQL이란 고급 프로그래밍 언어(C, C++, Java )에 내포되어 사용되는 SQL이다.


  SQL의 구성요소

  • 데이터 정의어 (Data Definition Language, DDL)

CREATE

DOMAIN

도메인을 생성

TABLE

테이블을 생성

VIEW

뷰를 생성

INDEX

인덱스를 생성 (SQL2 표준 X)

ALTER

TABLE

테이블의 구조(스키마)를 변경

DROP

DOMAIN

도메인을 제거

TABLE

테이블을 제거

VIEW

뷰를 제거

INDEX

인덱스를 제(SQL2 표준 X)

  • 데이터 조작어 (Data Manipulation Language, DML)
  • 데이터 제어어 (Data Control Language, DCL)

 

  데이터 정의어와 무결성 제약조건

  • 스키마의 생성과 제거 : SQL2에서는 동일한 데이터베이스 응용에 속하는 릴레이션, 도메인, 제약 조건, , 권한 등을 그룹화하기 위해서 스키마 개념을 지원한다.

CREATE SCHEMA DBNAME AUTHORIZATION KIM;

 

DROP SCHEMA DBNAME RESTRICT; // 하나 이상의 릴레이션이 존재하면 못지운다.

DROP SCHEMA DBNAME CASCADE;

 

  • 데이터 타입

데이터 타입

의미

INTEGER 또는 INT

정수형

SMALLINT

작은 정수형

NUMBER(n, s) 또는 DECIMAL(n, s)

n개의 숫자에서 소수 아래 숫자 s개인 십진수

REAL

실수형

FLOAT(n)

적어도 n개의 숫자가 표현되는 실수형

CHAR(n) 또는 CHARACTER(n)

n바이트 문자열, 디폴트는 1바이트

VARCHAR(n) 또는 CHARACTER VARYING(n)

최대 n바이트까지의 가변 길이 문자열

BIT(n) 또는 BIT VARYING(n)

n개의 비트열 또는 최대 n개까지의 가변 비트열

DATE

날짜형

BLOB

Binary Large Object, 멀티미디어 데이터 등을 저장


  • 릴레이션 정의

CREATE TABLE DEPARTMENT (

DEPTNO INTEGER NOT NULL,

DEPTNAME CHAR(10),

FLOOR INTEGER,

PRIMARY KEY(DEPTNO)

);

 

CREATE TABLE EMPLOYEE (

EMPNO INTEGER NOT NULL,

EMPNAME CHAR(10),

TITLE CHAR(10),

MANAGER INTEGER,

SALARY INTEGER,

DNO INTEGER,

PRIMARY KEY(EMPNO),

FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)

);


  • 릴레이션 제거 : DROP TABLE TABLENAME;

ex) DROP TABLE DEPARTMENT;

  • 릴레이션 스키마 변경 : ALTER TABLE TABLENAME [ADD] COLNAME NEW_DATATYPE;

ex) ALTER TABLE EMPLOYEE ADD PHONE CHAR(13);

  • 인덱스 생성 : CREATE INDEX INDEXNAME ON TABLENAME(COLNAME);

ex) CREATE INDEX EMPDNO_IDX ON EMPLOYEE(DNO);

* 외래 키의 경우 조인 참여가 잦기 때문에 인덱스 사용률이 높은 편이다.

  • 도메인 생성 : CREATE DOMAIN COLNAME DATATYPE DEFAULT ‘value’;

ex) CREATE DOMAIN DEPTNAME CHAR(10) DEFAULT 개발’;

  • 제약 조건 예시

CREATE TABLE EMPLOYEE (

EMPNO INTEGER NOT NULL,

EMPNAME CHAR(10) UNIQUE,  // 중복된 데이터를 거절(대체 키임을 의미)

TITLE CHAR(10) DEFAULT ‘사원’,

MANAGER INTEGER,

SALARY INTEGER CHECK(SALARY < 6000000),  // 조건을 만족하는 데이터만 허용

DNO INTEGER CHECK(DNO IN (1, 2, 3, 4)) DEFAULT 1, // 허용 가능 데이터 표시

PRIMARY KEY(EMPNO),

FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)

ON DELETE SET DEFAULT ON UPDATE CASCADE

);


- 자기 자신을 참조하는 경우

FOREIGN KEY(MANAGER) REFERENCES EMPLOYEE(EMPNO),

-> MANAGER(외래 키) 컬럼이 EMPNO(기본 키) 컬럼을 참조한다.

 

- 다른 릴레이션을 참조하는 경우

FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)

ON DELETE SET DEFAULT ON UPDATE CASCADE

-> EMPLOYEEDNO(외래 키) 컬럼이 DEPARTMENTDEPTNO(기본 키) 컬럼을 참조한다.

=> 참조되는 릴레이션(DEPARTMENT)에서 DELETE가 발생하면 삭제된 기본 키를 참조하던 외래 키(DNO)는 디폴트(1)을 가진다.

=> 참조되는 릴레이션(DEPARTMENT)에서 UPDATE가 발생하면 갱신된 기본 키를 참조하던 외래 키(DNO)는 갱신된 값을 상속 받는다.

 

- 또 다른 예시 : 조건 걸기

CREATE TABLE EMPLOYEE (

ID INTEGER,

NAME CHAR(10),

SALARY INTEGER,

MANAGER_SALARY INTEGER,

CHECK(MANAGER_SALARY > SALARY)

);

-> 매니저의 월급이 기본 사원의 월급보다 높은 투플(레코드)만 삽입을 허용함.

  • 참조 무결성 제약 조건 유지하기 위한 SQL

... ON DELETE NO ACTION

... ON DELETE CASCADE : 기본 키 삭제 시 연쇄적으로 외래 키도 삭제된다.

... ON DELETE SET NULL

... ON DELETE SET DEFAULT

 

... ON UPDATE NO ACTION

... ON UPDATE CASCADE : 기본키 수정 시 연쇄적으로 외래키도 수정된다.

... ON UPDATE SET NULL

... ON UPDATE SET DEFAULT

 

- ON INSERT 가 없는 이유 : 삽입의 경우 참조 무결성 제약조건을 위배하지 않으므로 반복적으로 확인하는 것은 오버헤드를 키우기 때문이다. (성능 저하)

- CASCADE 할 때, 외래키에는 반드시 인덱스가 있어야 한다.

 

  • 무결성 제약조건의 추가 및 삭제

ALTER TABLE STUDENT ADD CONSTRAINT STUDENT_PK

PRIMARY KEY(STNO);

 

ALTER TABLE STUDENT DROP CONSTRAINT STUDENT_PK;








  관계 데이터베이스의 언어

  • 관계 대수의 배경 : 먼저 SQL이란 Structure Query Language의 약자로, 데이터베이스에서 질의를 위해 사용되는 언어입니다. 과거에는 이 SQL문 대신 관계 대수라는 것을 이용하였습니다. 관계 대수는 상용 관계 DBMS들에서 널리 사용되는 SQL의 이론적인 기초이면서, SQL을 구현하고 최적화하기 위해 오늘날 DBMS의 내부 언어로서도 사용됩니다.
  • 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어

- 관계 해석 (Relational calculus) : 원하는 데이터만 명시하고 질의를 어떻게 수행할 것인지는 명시하지 않는 선언적인 언어

- 관계 대수 (Relational algebra) : 어떻게 질의를 수행할 것인가를 명시하는 절차적 언어

  •  SQL (Structure Query Language)

- 상용 관계 DBMS들의 사실상의 표준 질의어

- 사용자는 SQL을 사용하여 관계 데이터베이스에 릴레이션을 정의하고, DB의 정보를 검색하고, 관계 데이터베이스를 갱신하는 등 여러 가지 무결성 제약조건들을 명시할 수 있다.



  관계 대수의 특징

  • 기존의 릴레이션들로부터 새로운 릴레이션을 생성한다.
  • 릴레이션이나 관계 대수식의 결과 릴레이션에 연산자들을 적용하여 보다 복잡한 결과 릴레이션을 점차적으로 만들 수 있다.
  • 기본적인 연산자들의 집합으로 이루어진다.
  • 산술 연산자와 유사하게 단일 릴레이션이나 두 개의 릴레이션을 입력으로 받아 하나의 결과 릴레이션을 생성한다.
  • 결과 릴레이션은 또 다른 관계 연산자의 입력으로 사용될 수 있다.



  관계 연산자들의 종류와 표기법


분류

연산자

표기법

단항 또는 이항

필수적인 연산자

실렉션 (Selection)

단항

프로젝션 (Projection)

단항

합집합 (Union)

이항

차집합 (Difference)

이항

카티션 곱 (Cartesian Product)

이항

편의를 위해 유도된 연산자

교집합 (Intersection)

이항

세타 조인 (Theta Join)

이항

동등 조인 (Equijoin)

이항

자연 조인 (Natural Join)

*

이항

세미 조인 (Semijoin)

이항

디비전 (Division)

이항


  • Selection 연산자

- 한 릴레이션에서 실렉션 조건(Selection Condition 또는 Predicate)을 만족하는 투플들의 부분 집합을 생성하는 연산자. - 투플이 여러 개 있으나 중복 투플은 존재할 수 없다.

- 결과 릴레이션의 차수는 입력 릴레이션의 차수(열의 수)와 같다.

- 결과 릴레이션의 카디날리티(행의 수)는 항상 입력 릴레이션 것보다 작거나 같다.

- 실렉션 조건은 보통 릴레이션의 임의의 컬럼과 상수, 비교연산자[ =, <>, <=, <, =>, > ], 부울 연산자[ AND, OR, NOT ]를 포함한다.


  • Projection 연산자

- 한 릴레이션의 애트리뷰트들의 부분 집합을 구하는 연산자

- 결과로 생성되는 릴레이션은 스키마에 명시된 애트리뷰트들만 가진다.

- 결과 릴레이션에는 기본 키가 아닌 애트리뷰트에 한하여 중복된 투플들이 존재할 수 있다.



  • 집합 연산자

- 릴레이션이 투플들의 집합이기 때문에 기존의 집합 연산이 릴레이션에 적용된다.

- 합집합(Union), 교집합(Intersection), 차집합(Difference) 연산자

- 집합 연산자의 입력으로 사용되는 두 개의 릴레이션은 합집합 호환이어야 한다.

- 합집합 호환 (Union Compatible) : 집합 연산의 조건으로, 정의는 아래와 같다.

- 두 릴레이션 R1(A1, A2, ..., An)R2(B1, B2, ..., Bm)이 합집합 호환일 필요 충분 조건은 n=m이고, 모든 1<=i<=n에 대해 domain(Ai)=domain(Bi)

- 쉽게 말해, 컬럼 수가 동일해야 하고 스키마에서 정의한 컬럼의 데이터 타입이 동일해야 한다.

- 프로젝션 연산의 결과도 릴레이션이므로 합집합 호환이 된다면 두 결과 릴레이션은 집합 연산이 가능하다.

  • Union 연산자

- 두 릴레이션 RS의 합집합 R S R 또는 S에 있거나 RS 모두에 속한 투플들로 이루어진 릴레이션이다.

- 결과 릴레이션에서 중복된 투플들은 제외된다.

- 결과 릴레이션의 차수는 R 또는 S의 차수와 같으며, 애트리뷰트의 이름들은 R 또는 S의 애트리뷰트들의 이름과 같다.



  • Intersection 연산자

- 두 릴레이션 RS의 교집합 R S RS 모두에 속한 투플들로 이루어진 릴레이션이다.

- 결과 릴레이션의 차수는 R 또는 S의 차수와 같으며, 결과 릴레이션의 애트리뷰트 이름들은 R 또는 S의 애트리뷰트들의 이름과 같다.



  • Difference 연산자

- 두 릴레이션 RS의 차집합 (R - S) R에는 속하지만 S에는 속하지 않은 투플들로 이루어진 릴레이션이다.

- 결과 릴레이션의 차수는 R 또는 S의 차수와 같으며, 결과 릴레이션의 애트리뷰트 이름들은 R 또는 S의 애트리뷰트들의 이름과 같다.



  • Cartesian Product 연산자

- 카디날리티가 i인 릴레이션 R(A1, A2, ..., An)과 카디날리티가 j인 릴레이션 S(B1, B2, ..., Bm)의 카티션 곱 R S 는 차수가 (n+m)이고, 카디날리티가 (i*j)이고, 애트리뷰트가 (A1, A2, ..., An, B1, B2, ..., Bm)이며, RS의 투플들의 모든 가능한 조합으로 이루어진 릴레이션이다.

- 카티션 곱의 결과 릴레이션의 크기는 매우 클 수 있으며, 사용자가 실제로 원하는 것은 카티션 곱의 결과 릴레이션의 일부인 경우가 대부분이므로 카티션 곱 자체는 유용한 연산자가 아니다.



  • 조인 연산자

- 두 개의 릴레이션으로부터 연관된 투플들을 결합하는 연산자

- 관계 데이터베이스에서 두 개 이상의 릴레이션들의 관계를 다루는데 매우 중요한 연산자이다.

  • 세타 조인 (Theta Join) 과 동등 조인 (Equijoin)

- 두 릴레이션 R(A1, A2, ..., An)S(B1, B2, ..., Bm)의 세타 조인의 결과는 차수가 (n+m)이고, 애트리뷰트가 (A1, A2, ..., An, B1, B2, ..., Bm)이며, 조인 조건을 만족하는 투플들로 이루어진 릴레이션이다.

- 세타 조인 조건은 { =, <>, <=, <, >=, > } 중 하나이다.

- 동등 조인 조건은 세타 조인 중에서 비교 연산자가 =인 조인이다.



  • 자연 조인 (Natural Join)

- 동등 조인의 결과 릴레이션에서 조인 컬럼의 중복을 제외한 조인

- 여러 가지 조인 연산자들 중에서 가장 자주 사용된다.

- 실제로 관계 데이터베이스에서 대부분의 질의는 실렉션, 프로젝션, 자연 조인으로 표현 가능하다.



  • Division 연산자

 차수가 (n+m)인 릴레이션 R(A1, A2, ..., An, B1, B2, ..., Bm)과 차수가 m인 릴레이션 S(B1, B2, ..., Bm)의 디비전 R  S는 차수가 n이고, S에 속하는 모든 투플 u에 대응하는 투플 tu(투플 t와 투플 u가 결합한 것)가 R에 존재하는 투플 t들의 집합



  

  관계 대수의 한계

  • 관계 대수는 산술 연산을 할 수 없다.
  • 정렬을 나타낼 수 없다.
  • 데이터베이스를 수정할 수 없다. -> 레코드 삽입, 삭제, 수정이 불가능
  • 프로젝션 연산의 결과에 중복된 투플을 나타내는 것이 필요할 때가 있는데 이를 명시하지 못한다.
 

  추가된 관계 대수 연산자

  • 집단 함수

질의 : 모든 사원들의 급여의 평균은 얼마인가?


  • 그룹화

질의 : 각 부서별 사원들의 급여의 평균은 얼마인가?


  • 외부 조인

- 상대 릴레이션에서 대응되는 투플을 갖지 못하는 투플이나 조인 컬럼에 널값이 들어 있는 투플들을 다루기 위해서 조인 연산을 확장한 조인이다.

- 두 릴레이션에서 대으오디는 투플들을 결합하면서, 대응되는 투플을 갖지 않는 투플과 조인 컬럼에 널값을 갖는 투플도 결과에 포함시킨다.






+ Recent posts