SQL Structured Query Language
SQL은 사용자가 처리를 원하는 데이터가 무엇인지만 제시하고 어떻게 처리하는 지 제시하지 않기 때문에 비절차적 데이터 언어 특성을 가진다.
SQL문의 구성
SQL | 데이터 정의 | 테이블 생성 | CREATE TABLE |
테이블 변경 | ALTER TABLE | ||
테이블 제거 | DROP TABLE | ||
뷰 생성 | CREATE VIEW | ||
뷰 삭제 | DROP VIEW | ||
데이터 조작 | 데이터 검색 | SELECT | |
데이터 삽입 | INSERT | ||
데이터 수정 | UPDATE | ||
데이터 삭제 | DELETE | ||
데이터 제어 | 권한 부여 | GRANT | |
권한 회수 | REVOKE | ||
정상적 완료 | COMMIT | ||
복구 | ROLLBACK |
SQL의 특징
- ANSI, ISO에서 정한 관계 데이터베이스 표준 언어이다.
- 관계 대수와 관계 해석을 기초로한 혼합 언어이다.
- 데이터 정의, 조작, 제어 기능을 모두 갖추고 있다.
- 비절차식 언어이며 대화식 질의어로 사용할 수 있다.
SQL의 장점
- 모든 관계 데이터베이스의 언어
- 우수한 이식성
- 단일 언어로 여러가지 기능 수행
- 내장 언어와 대화식 언어 지원
- 집합 단위 연산
- 표현력 풍부, 구조 간단
SQL의 분류
(1) 데이터 정의어 (DDL)
- 스키마, 도메인, 테이블, 뷰, 인덱스를 정의하거나 변경, 삭제할 때 사용하는 언어
- 논리적 데이터 구조와 물리적 데이터 구조의 사상을 정의
- 데이터베이스 관리자나 데이터베이스 설계자가 사용한다.
데이터 정의어 세 가지 유형
- CREATE : 스키마, 도메인, 테이블, 뷰, 인덱스를 정의
- ALTER : TABLE에 대한 정의를 변경
- DROP : 스키마, 도메인, 테이블, 뷰, 인덱스를 삭제
(2) 데이터 조작어 (DML)
- 사용자의 질의를 통해 실제 데이터를 처리하는 언어
- 사용자와 데이터베이스 시스템 간의 인터페이스를 제공
- 테이블에 새 데이터를 삽입하거나 저장된 데이터를 수정/삭제/검색하는 기능을 제공
데이터 조작어 네 가지 유형
- SELECT: 테이블에서 조건에 맞는 튜플 검색
- INSERT: 테이블에 새로운 튜플을 삽입
- DELETE: 테이블에서 조건에 맞는 튜플 삭제
- UPDATE: 테이블에서 조건에 맞는 튜플의 내용을 변경
(3) 데이터 제어어 (DCL)
- 데이터의 보안, 무결성, 회복, 병행 수행 제어 등을 정의하는데 사용되는 언어
- 데이터베이스 관리자가 데이터 관리를 목적으로 사용
- 보안을 위해 데이터에 대한 접근 및 사용 권한을 사용자별로 부여하거나 취소하는 기능을 하는 언어다.
데이터 제어어의 네 가지 유형
- COMMIT: 명령에 의해 수행된 결과를 물리적 디스크로 저장하고 데이터베이스 조작 작업이 완료되었음을 관리자에게 통보
- ROLLBACK: 데이터베이스 조작 작업이 비정상적으로 종료되었을 때 원래 상태로 복구
- GRANT: 데이터베이스 사용자에게 사용 권한을 부여
- REVOKE: 데이터베이스 사용자의 사용 권한을 취소
데이터 정의
데이터 정의 언어
- SQL의 DDL로 처리할 수 있는 관계에 대한 정보
- 각 관계의 스키마
- 각 속성들과 이들의 도메인
- 무결성 제약조건
- 각 관계의 색인
- 각 관계의 보안과 권한 정보
- 각 관계의 물리적 저장구조
데이터 정의 언어의 기능
- 스키마의 생성과 제거
- 릴레이션 정의: 테이블, 속성의 이름과 데이터 타입을 명시
- 인덱스 생성과 삭제
- 도메인 생성
- 뷰의 생성과 삭제
CREATE | DOMAIN | 도메인 생성 |
TABLE | 테이블 생성 | |
VIEW | 뷰 생성 | |
INDEX | 인덱스를 생성 | |
ALTER | TABLE | 테이블의 구조 변경 |
DROP | DOMAIN | 도메인 제거 |
TABLE | 테이블 제거 | |
VIEW | 뷰 제거 | |
INDEX | 인덱스 제거 |
데이터 정의어 종류
데이터 타입
각 속성에 담을 데이터의 특성을 고려하여 타입을 정한다. 테이블을 구성하는 각 속성의 데이터 타입을 선택한 후에는 속성의 널 값 허용 여부와 기본 값 필요 여부를 결정해야한다. 기본적으로 테이블 생성시 각 속성은 널 값이 허용이 되며 널 값이 허용되지 않게 하고 싶은 경우 속성 다음에 NOT NULL 키워드를 붙이도록 한다.
데이터 타입 | 의미 |
INT 또는 INTEGER | 1 워드 (4바이트 정수형) |
SMALLINT | INT보다 작은 정수 |
CHAR(n) 또는 CHARACTER(n) | 길이가 n인 고정 길이의 문자열 |
VARCHAR(n) 또는 CHARACTER VARYING(n) | 최대 길이가 n인 가변 길이 문자열 |
NUMERIC(p, s) 또는 DECIMAL(p, s) | 고정 소수점 실수 p는 소수점을 제외한 전체 숫자 길이 s는 소수점 이하의 숫자 길이 |
FLOAT(n) | 더블 워드 부동 소수점 길이가 n인 부동 소수점 실수 |
REAL | 부동 소수점 실수 |
DATETIME 또는 DATE | 년, 월, 일로 표현되는 날짜 |
TIME | 시, 분, 초로 표현되는 시간 |
1) 기본키가 아니더라도 널 값을 허용하지 않는 속성의 경우 NOT NULL 키워드를 붙인다.
ex) 회원번호 VARCHAR(10) NOT NULL -> 널 값을 허용하지 않는 최대 10길이를 갖는 가변 길이의 회원번호를 속성으로 저장
2) 속성에 기본값을 설정하고 싶다면 DEFAULT 키워드를 이용하여 사용자가 해당 속성에 값을 입력하지 않았을 때 기본값이 저장되도록 한다.
ex) 가중치 INT DEFAULT : 가중치 속성에 기본값이 0으로 설정된다.
ex) 평점 CHAR(2) DEFAULT 'a' : 평점 속성에 기본값이 'a'으로 설정된다.
관계형 데이터베이스 회원 테이블 예시
CREATE TABLE 회원 ( 회원번호 SMALLINT NOT NULL,
회원명 CHAR(16),
전화번호 CHAR(20),
성별 CHAR(8),
생년월일 DATE );
기본 테이블 TABLE
CREATE TABLE을 통해 테이블을 정의한다. CREATE TABLE 문은 생성할 테이블을 구성하는 속성들의 이름과 데이터 타입및 제약 사항에 대한 정의, 기본키/대체키/외래키의 정의, 데이터 무결성에 대한 제약조건의 정의등을 포함한다.
1) 테이블 정의
CREATE TABLE 테이블이름 (
① 속성 데이터 타입 [NOT NULL] [DEFAULT 기본값]
② [PRIMIARY KEY (속성 리스트)] // 기본키를 설정하되 테이블당 하나만 있을 수 있다.
③ [UNIQUE (속성 리스트)] // 대체키로 테이블에 여러개 존재할 수 있다.
④ [FOREIGN KEY (속성 리스트) REFERENCES 테이블 이름(속성 리스트)] // 외래키로 테이블에 여러개 존재할 수 있다.
[ON DELETE 옵션] [ON UPDATE 옵션]
⑤ [CONSTRAINT 이름] [CHECK 조건] // 데이터 무결성을 위한 제약조건으로 테이블에 여러 개 존재할 수 있다.
);
모든 SQL 문은 세미콜론으로 문장 끝을 표시한다.
2) 데이터베이스의 테이블 확장
테이블은 ALTER TABLE 문으로 변경할 수 있다. ALTER TABLE 문을 이용해 새로운 속성 추가, 기존 속성 삭제, 새로운 제약조건 추가, 기존 제약조건 삭제 등이 가능하다.
① 관계형 데이터베이스의 테이블 확장
관계형 데이터베이스 테이블에 새로운 필드를 추가하는 것을 의미한다.
ALTER TABLE 테이블 이름
ADD 속성 이름 데이터 타입 [NOT NULL] [DEFAULT 기본값]
② 속성의 삭제
테이블의 기존 속성을 삭제하는 ALTER TABLE 문의 기본 형식은 다음과 같다.
ALTER TABLE 테이블 이름
DROP 속성 이름 CASCADE | RESTRICT;
속성을 삭제할 때는 제약 조건이나 참조하는 다른 속성을 함께 삭제할 수 있다. CASCADE는 그런 삭제를 허용하고 RESTRICT는 제약 조건이나 참조하는 다른 속성이 있을 경우 삭제가 수행되지 않도록 한다.
3) 데이터베이스 테이블 삭제
데이터베이스의 테이블 삭제(DROP)란 기존에 생성했던 테이블을 삭제하는 것을 의미한다.
DROP TABLE 테이블 이름 CASCADE | RESTRICT;
DROP TABLE 문을 작성할 때 삭제할 테이블을 참조하는 다른 테이블도 함께 삭제하려면 CASCADE를 지정한다. RESTRICT는 참조가 있으면 삭제를 하지 않는다.
DROP TABLE 회원 CASCADE;
회원 테이블은 관계형 데이터베이스 시스템에서 삭제된다. 따라서 회원 테이블 안에 있는 각 필드의 값과 필드는 모두 삭젝되고 인덱스나 뷰도 함께 삭제된다.
색인 INDEX
색인은 파일에 있는 레코드를 찾아주는 보조적인 파일이다. 색인은 정렬되어 있으며 검색을 빨리하도록 도와준다.
CREATE INDEX 문은 SQL 표준은 아니나 대부분의 상용 관계 DBMS가 이를 지원한다. CREATE INDEX문은 릴레이션 하나 이상의 애트리뷰트에 대해 인덱스를 생성한다.
인덱스는 검색 속도를 향상 시키지만 인덱스를 저장하기위해 추가적인 저장 공간이 필요하고 갱신 연산의 속도를 저하시킨다. 인덱스를 생성하면 DEFAULT는 오름차순이다. 인덱스가 정의된 릴레이션의 튜플에 변경점이 발생하면 DBMS가 자동으로 인덱스에 반영한다. 찾고자하는 레코드를 쉽게 검색하기 위해서 각 레코드들의 저장 위치를 목록으로 작성하는데 이를 색인이라고 하고 이 작업을 색인화라고 한다.
1) 인덱스 생성
CREATE INDEX 문은 이미 생성된 기본 테이블에 색인을 추가할 때 사용하는 것이다.
CREATE [UNIQUE] INDEX 색인이름
ON 테이블명(속성 [ASC/DESC])
[CLUSTER];
- [UNIQUE] : 색인화에 사용되는 속성값중 중복이 있다면 제거하여 색인을 만든다.
- [ASC/DESC] : 오름차순/내림차순을 설정한다.
- [CLUSTER] : 색인값을 물리적인 저장소의 실제 데이터와 일치시킨다. 하나의 테이블에서 한 번밖에 생성할 수 없다.
2) 인덱스 삭제
DROP INDEX 인덱스 이름;
데이터 조작
데이터 조작어는 데이터 정의에 의해서 생성된 테이블에서 원하는 데이터의 추출, 갱신, 삽입, 삭제 등의 연산을 통해 자료를 이용하기 위해 사용하는 명령어이다.
주로 SELECT 문을 이용하여 테이블에서 원하는 데이터를 검색한다.
단순 질의
1) 조건이 없는 기본 검색
SELECT [ALL | DISTINCT] 속성 리스트
FROM 테이블 리스트;
검색하고 싶은 속성의 이름을 콤마로 구분하여 나열한다.
- 회원 테이블에서 회원번호, 회원명, 성멸을 검색
SELECT 회원번호, 회원명, 성별
FROM 회원;
- 도서코드 테이블에서 존재하는 모든 속성을 검색
SELECT *
FROM 도서코드;
- 도서코드 테이블에서 대여로 속성에 대해 중복을 제거하고 검색
SELECT DISTINCT 대여료
FROM 도서코드;
- 도서코드 테이블에서 도서코드와 대여로를 검색하되 대여로는 단가로 출력 (출력하는 속성명을 변경)
SELECT 도서코드, 대여료 AS 단가
FROM 도서코드;
2) 조건이 있는 기본 탐색
조건을 만족하는 데이터만 검색하는 SELECT 문의 기본 형식
SELECT [ALL | DISTINCT] 속성리스트
FROM 테이블
[WHERE 조건];
WHERE 조건에 사용될 수 있는 비교 연산자와 논리 연산자는 다음과 같다.
비교 연산자: =(같음), <>(다름), 부등호 <, >, >=, <=
논리 연산자: AND, OR, NOT
- 도서관리 테이블에서 도서코드가 S02인 도서명, 저자, 출판사를 검색
SELECT 도서명, 저자, 출판사
FROM 도서관리
WHERE 도서코드 = 'S02';
- 대여현황 테이블에서 회원번호가 1이고 대여료가 1000원 이상인 도서명, 대여일자, 반납일자를 검색
SELECT 도서명, 대여일자, 반납일자
FROM 대여현황
WHERE 회원번호 = 1 AND 대여료 >= 1000;
- 대여현황 테이블에서 회원번호가 1이거나 대여료가 1000원 이상인 도서명, 대여일자, 반납일자를 검색
SELECT 도서명, 대여일자, 반납일자
FROM 대여현황
WHERE 회원번호 = 1 OR 대여료 >= 1000;
3) 산술식을 이용
- 도서코드 테이블에서 도서코드와 대여료를 검색하되, 대여료에 300원을 더해 인상 대여료라는 새로운 이름으로 검색
SELECT 도서코드, 대여료 + 300 AS 인상 대여료
FROM 도서코드;
4) LIKE를 사용한 검색
검색 조건을 몰라 부분적으로 일치하는 데이터를 검색하고 싶다면 LIKE 키워드를 이용
% : 정규식 표현 *처럼 0개 이상의 문자
_: 한개의 문자
LIKE '데이터%' 데이터로 시작하는 문자열
LIKE '%데이터' 데이터로 끝나는 문자열
LIKE '__한%' 세 번째 글자가 '한'인 문자열
5) NULL을 이용한 검색
특정 속성의 값이 NULL인 지 아닌지 비교하려면 IS NULL 혹은 IS NOT NULL을 이용한다. (등호를 사용할 수 없다)
- 회원 테이블에서 우수회원이 아직 입력되지 않은 회원번호, 회원명을 검색
SELECT 회원번호, 회원명
FROM 회원
WHERE 우수회원 IS NULL;
6) 정렬 검색
SELECT 문의 검색 결과 테이블은 일반적으로 DBMS가 정한 순서로 출력된다.
SELECT [ALL | DISTINCT] 속성
FROM 테이블
[ WHERE 조건 ]
[ ORDER BY 속성 리스트 [ ASC | DESC ] ];
[ LIMIT n ]
ORDER BY 키워드에 의해 정렬의 기준이 되는 속성을 지정한다. 기본 정렬 방법은 오름차순이다.
LIMIT : 결과 중 상위 n 개만을 표시
- 회원 테이블에서 생년월일을 기준으로 내림차순이 되도록 모든 열을 검색
SELECT *
FROM 회원
ORDER BY 생년월일 DESC;
(1) 집계 함수
집계 함수를 이용하여 특정 속성에 대한 계산 결과를 만들어낼 수 있다.
함수 | 의미 | 사용 가능한 속성의 타입 |
COUNT | 속성 값의 개수 | 모든 데이터 |
MAX | 최댓값 | |
MIN | 최솟값 | |
SUM | 합계 | 숫자 데이터 |
AVG | 평균 |
SUM 함수
- 대여현황 테이블에서 1번 회원의 대여료 합계를 검색
SELECT SUM(대여료) AS '대여료 합계'
FROM 대여료 현황
WHERE 회원번호='1';
COUNT 함수
- 회원 테이블에서 회원수를 검색
SELECT COUNT(회원번호) AS '회원 수'
FROM 회원;
- 중복없는 COUNT
SELECT COUNT(DISTINCT 도서코드) AS '도서코드 수'
FROM 도서관리;
(2) 그룹 검색
SELECT [ALL | DISTINCT] 속성
FROM 테이블
[ WHERE 조건 ]
[ GROUP BY 속성 리스트 [HAVING 조건] ]
[ ORDER BY 속성 리스트 [ ASC | DESC ] ];
테이블에서 특정 속성의 값이 같은 튜플을 모아 그룹을 만들고 그룹별로 검색을 하기위해 GROUP BY 키워드를 이용한다.
- 대여현황 테이블에서 회원별 대여료의 합계를 검색
SELECT 회원번호, SUM(대여료) AS 대여료 합계
FROM 대여현황
GROUP BY 회원번호;
그룹을 나누는 기준이 SELECT 절에 같에 같이 작성하는 것이 좋다. 어떤 기준으로 나누었는 지 명확하기 때문이다.
- 대여현황 테이블에서 회원별 대여횟수와 대여료의 평균을 검색
SELECT 회원번호, COUNT(*) AS 대여횟수, AVG(대여료) AS 대여료 평균
FROM 대여현황
GROUP BY 회원번호;
- 대여현황 테이블에서 대여횟수가 3개 이상인 회원별 대여횟수와 대여료의 평균을 검색
SELECT 회워번호, COUNT(*) AS 대여횟수, AVG(대여료) AS 대여료 평균
FROM 대여현황
GROUP BY 회원번호
HAVING COUNT(*)>=3;
조인 질의
여러 개의 테이블을 연결하여 데이터를 검색하는 것을 조인 검색이라한다. 조인 검색을 하려면 테이블을 연결해주는 속성이 필요하고 이 속성을 조인 속성이라한다. 주로 테이블의 관계를 나타내는 외래키를 조인 속성으로 이용한다.
- 대여한 회원명과 도서명을 검색
SELECT 회워명, 도서명
FROM 회원 JOIN 대여현황
ON 회원.회원번호 = 대여현황.회훤번호;
- ON 절은 두 속성이 같아야하는 조인 조건을 의미한다.
기타 기능
SELECT 문안에 다른 SELECT 문이 포함되어 있을 수 있다. 다른 SELECT 문 안에 내표된 SELECT문을 부속 질의문 또는 서브 질의문이라고 한다. 서브 질의문이 상위 질의문보다 먼저 수행된다.
다중 행 부속 질의문(서브 쿼리)에 사용 가능한 연산자
- IN : 서브 쿼리의 결과 중 일치하는 것이 하나라도 있다면 참
- NOT IN : " 결과 중 일치하는 것이 없을 경우 참
- EXISTS : 결과값이 하나라도 존재하면 참
- NOT EXISTS : 결과값이 없다면 참
- ALL : 결과 값에 대해 모두와 비교한 결과가 참이면 검색 조건이 만족
- ANY 또는 SOME : 결과 값에 대해 하나라도 비교가 참이면 검색 조건이 만족
- 우수회원이 대여한 도서코드와 도서명을 검색
SELECT 도서코드, 도서명
FROM 대여현황
WHERE 회원번호 IN (SELECT 회원번호
FROM 회원
WHERE 우수회원 = TRUE);
다른 테이블에서 먼저 서브 쿼리문을 실행한 후에 상위 쿼리문을 실행한다.
ALL을 이용
- 대여현황 테이블에서 회원번호가 1인 회원의 모든 대여료보다 큰 도서의 도서코드, 장르, 대여료를 검색
SELECT 도서코드, 장르, 대여료
FROM 도서코드
WHERE 대여료 > ALL (SELECT 대여료
FROM 대여현황
WHERE 회원번호=1);
EXISTS를 이용
- 회원 테이블에서 대여일자가 '2014-05-28'인 회원명을 검색
SELECT 회원명
FROM 회원
WHERE EXISTS (SELECT *
FROM 대여환황
WHERE 대여일자 = '2014-05-28' AND 회원번호 = 회원.회원번호);
UNION을 이용
- 도서코드 테이블에서 대여료과 1000보다 큰 도서코드와 도서관리 테이블에서 출판사가 민선인 도서코드를 통합하여 검색
선택 속성이 같아야한다.
SELECT 도서코드
FROM 도서코드
WHERE 대여료 > 1000
UNION
SELECT 도서코드
FROM 도서관리
WHERE 출판사 = '민선';
갱신 연산
데이터 삽입
테이블에 새로운 튜플을 삽입하기 위해 필요한 SQL문은 INSERT이다.
INSERT를 이용하여 튜플을 삽입하는 방법은 두가지인데, 테이블을 이용하여 직접 삽입 방법과 서브 쿼리문을 이용하는 방법이다.
직접 삽입
INSERT
INTO 테이블 이름[속성 리스트]
VALUES (속성값 리스트);
INTO 키워드와 함께 튜플을 삽입할 테이블의 이름을 제시한 후 속성의 이름을 나열한다. 나열한 순서대로 VALUES 키워드 다음 속성값들이 차례대로 삽입된다.
1) 직접 삽입
ex)
INSERT INTO 회원(회원번호, 회원명, 전화번호, 성별, 생년월일, 우수회원)
VALUES (7, '김아무개', '010-2312-2321', '남', '1999'09-23', TRUE);
2) 서브 쿼리를 통해 탐색된 값을 삽입
INSERT INTO 백화도서(도서코드, 장르, 대여료)
SELECT 도서코드, 장르, 대여료
FROM 도서코드
WHERE 출판사 = '백하';
도서코드 테이블에서 검색한 튜플들을 백화도서 테이블에 삽입한다.
데이터 갱신
저장된 데이터를 수정하기 위해 사용되는 SQL 명령어는 UPDATE이다.
UPDATE 테이블이름
SET 속성이름1=값1, 속성이름2=값2,...
[WHERE 조건];
WHERE 조건절은 해당 조건이 만족하는 튜플 속성만 값을 수정한다.
- 도서코드 테이블에서 도서코드가 S05인 대여료를 2000으로 수정하세요
UPDATE 도서코드
SET 대여료 = 2000
WHERE 도서코드 'S05';
데이터 삭제
테이블에 저장된 데이터를 삭제하기 위해 필요한 SQL 명령어는 DELETE 이다.
DELETE
FROM 테이블 이름
[WHERE 조건];
- 도서코드 테이블의 모든 튜플을 삭제
DELETE
FROM 도서코드
- 도서코드 테이블에서 출판사가 백하 또는 이가인 레코드를 삭제
DELETE
FROM 도서코드
WHERE 도서코드 IN (SELECT 도서코드
FROM 도서관리
WHERE 출판사 = '백하' OR 출판사 = '이가');
뷰 View
뷰는 원칙적으로 하나 이상의 기본 테이블로부터 유도된 이름을 가진 가상 테이블을 말한다.
기본 테이블은 물리적으로 구현되어 데이터가 실제로 저장되지만 뷰는 물리적으로 구현되어 있지 않다.
뷰는 정의만 시스템내에 저장했다가 실행시간에 테이블을 구축한다.
시스템은 일반 사용자에게 뷰와 기본 테이블 사이에 차이가 없게 만들어 주지만 뷰에 대한 데이터 갱신 연산에는 약간의 제한이 있다. 뷰는 데이터 보정 작업, 처리 작업 시험 등 임시적인 작업을 위한 용도로 활용되고 있다.
(1) 뷰의 특징
기본 테이블과 같은 형태의 구조를 사용하며 조작도 기본 테이블과 같다.
뷰는 가상 테이블이므로 물리적으로 구현되지 않는다.
데이터의 논리적 독립성을 제공한다.
뷰를 통해서만 데이터에 접근하면 뷰에 나타나지 않은 데이터를 보호할 수 있다.
(2) 뷰의 장점
논리적 독립성을 제공
여러 사용자의 상이한 응용이나 요구를 지원한다.
사용자의 데이터 관리를 간단하게 한다.
접근 제어를 통한 자동 보안을 제공
(3) 뷰의 단점
독립적인 인덱스를 가질 수 없다.
ALTER VIEW 문을 사용할 수 없다. 뷰의 정의를 변경하지 못한다.
뷰로 구성된 내용에 대한 삽입, 삭제, 갱신 연산에 제약이 있다.
뷰 정의
SQL에서 뷰는 다른 테이블에서 유도된 단일 테이블로서 다른 테이블들은 기본 테이블이거나 이전에 정의된 뷰일 수도 있다.
CREATE VIEW 뷰(열 이름 리스트)
AS SELECT 문
[WITH CHECK OPTION];
SELECT 문을 삽입할 수 있으며 WITH CHECK OPTION은 생성한 뷰에 삽입이나 수정 연산을 할 때 SELECT 문에서 제시한 뷰의 수정의 조건을 위반하면 수행되지 않도록 하는 제약조건을 제시한다.
- 대여 현황 테이블에서 회원번호가 1인 회원의 회원번호, 도서명, 대여일자를 나타내는 VIEW를 대여회원의 이름으로 만드세요
CREATE VIEW 대여회원(회원번호, 도서명, 대여일자)
AS SELECT 회원번호, 도서명, 대여일자
FROM 대여현황
WHERE 회원번호 = 1
WITH CHECK OPTION;
- 대여현황 테이블에서 회워별 대여횟수를 나타내는 VIEW를 회원별 대여횟수의 이름으로 만드세요
CREATE VIEW 회워별 대여횟수(회원번호, 대여횟수)
AS SELECT 회원번호, count(*)
FROM 대여현황
GROUP BY 회원번호
WITH CHECK OPTION;
뷰에 관한 DML 연산
CREATE VIEW 문으로 만들어진 뷰는 일반 테이블과 같이 원하는 데이터를 검색할 수 있다.
실제 대상을
- 대여회원 뷰에서 대여일자가 2014-03-14 이후의 모든 내용을 검색
SELECT * FROM 대여회원 WHERE 대여일자 > '2014-03-14'
INSERT, UPDATE, DELETE 문도 뷰를 대상으로 수행할 수 있다. 뷰에 대한 삽입, 수정, 삭제 연산도 기본 테이블에 수행되기 때문에 결과적으로는 기본 테이블이 변한다.
하지만 모든 뷰에 삽입, 수정, 삭제가 허용되는 것은 아니며 다음 같은 경우이다.
- 뷰의 열이 상수나 산술 연산자 또는 함수가 사용된 산술식으로 만들어지는 경우
- 집단 함수로 만들어진 열을 가진 뷰
- DISTINCT, GROUP BY 또는 HAVING 사용되어 정의된 뷰
- 뷰 정의문의 FROM 절에서 범위 테이블이 둘 이상 관련된 뷰
- 변경할 수 없는 뷰를 기초로 정의된 뷰
'Computer Science 기본 지식 > 데이터 베이스' 카테고리의 다른 글
DB (6) 회복 (0) | 2021.05.14 |
---|---|
DB (6) 정규화 (0) | 2021.05.13 |
DB (4) 관계 데이터베이스 (0) | 2021.05.09 |
DB (3) 개체-관계 모델링 (0) | 2021.05.09 |
DB (2) 데이터베이스 시스템 (0) | 2021.05.09 |