"데이터 정의어"의 두 판 사이의 차이
leejia1222 (토론 | 기여) |
|||
1번째 줄: | 1번째 줄: | ||
− | '''데이터 정의어'''<!--데이터정의어-->(DDL, Data Definition Language)는 새로운 데이터베이스를 구축하기 위해 [[스키마]](schema)를 정의하거나 | + | '''데이터 정의어'''<!--데이터정의어-->(DDL, Data Definition Language)는 새로운 데이터베이스를 구축하기 위해 [[스키마]](schema)를 정의하거나 기존 스키마의 정의를 삭제 또는 수정하기 위해 사용하는 [[데이터 언어]](data language)이다. 즉, 새로 만들려는 데이터베이스의 전체적인 구조를 설명하거나 데이터의 종류와 관계, 이미 정의된 스키마의 구조나 제약조건 등을 변경 또는 삭제하고 싶어 이를 [[데이터베이스 관리시스템]](DBMS)에 알릴 때 사용한다. 데이터 정의어로 정의된 스키마는 [[데이터 사전]](Data Dictionary)이라는 특별한 파일에 여러 개의 [[테이블]]로 저장되고, 삭제나 수정이 발생하면 이 내용도 데이터 사전에 반영된다. 데이터 사전에 저장된 스키마 정보는 사용자나 데이터베이스 관리 시스템이 필요할 때 참고할 수 있다.<ref>〈[https://terms.naver.com/entry.naver?docId=3431106&cid=58430&categoryId=58430 데이터 정의어]〉, 《네이버지식백과》</ref> |
==개요== | ==개요== | ||
− | 데이터베이스 언어인 DDL, DCL, DML 중 DML 즉, 데이터 정의어는 데이터베이스 내의 객체 생성, 삭제, 변경을 명령을 의미하며 주로 관리자가 사용하는 명령이다. 데이터 정의어는 데이터 조작어와 달리 명령어를 수행하자마자 데이터베이스에 수행한 내용이 바로 반영되는 | + | 데이터베이스 언어인 DDL, DCL, DML 중 DML 즉, 데이터 정의어는 데이터베이스 내의 객체 생성, 삭제, 변경을 명령을 의미하며 주로 관리자가 사용하는 명령이다. 데이터 정의어는 데이터 조작어와 달리 명령어를 수행하자마자 데이터베이스에 수행한 내용이 바로 반영되는 커밋(commit)이 있다. [[롤백]](rollback)을 통한 실행취소가 불가능하기 때문에 사용할 때 주의해야 한다. 명령어 중 CREATE, DROP, ALTER, TRUNCATE 등이 있으며 CREATE는 새로운 데이터 베이스 관계, [[뷰]](view), [[인덱스]](index), [[저장 프로시저]](stored procedure) 만들기 등을 수행할 수 있다. DROP 명령어는 이미 존재하는 데이터 베이스 관계, 뷰, 인덱스, 저장 프로시저를 제거할 수 있고, ALTER는 이미 존재하는 데이터베이스 개체에 대한 변경, 이름 변경의 역할을 한다. TRUNCATE는 관계에서 데이터를 제거하며 다시 복구할 수 없다.<ref> 미니송, 〈[https://dany-it.tistory.com/161 데이터베이스 언어(DDL, DML, DCL) - DO의 IT]〉, 《티스토리》, 2017-12-05 </ref><ref name="오라클"> pridiot, 〈[https://pridiot.tistory.com/118 (Oracle) 데이터 정의어 (DDL : Data Definition Language) - pridiot]〉, 《티스토리》, 2019-09-29 </ref> |
==생성== | ==생성== | ||
CREATE 문은 관계형 데이터베이스 관리시스템의 관리하에 객체를 생성하는 데이터 정의 언어(DDL) 명령이다. 사용하는 데이터베이스 관리시스템의 구현을 통해 CREATE 문장으로 만들 수 있는 개체의 유형은 다르다. 그러나 대부분의 RDBMS의 구현은 표(테이블), 정의 영역(도메인), 색인(인덱스), 이용자(사용자), 별명(별칭), 저장프로시저 및 데이터베이스 작성을 지원하고 있다.<ref> 〈[https://ko.wikipedia.org/wiki/CREATE_(SQL) CREATE (SQL)]〉, 《위키백과》 </ref> | CREATE 문은 관계형 데이터베이스 관리시스템의 관리하에 객체를 생성하는 데이터 정의 언어(DDL) 명령이다. 사용하는 데이터베이스 관리시스템의 구현을 통해 CREATE 문장으로 만들 수 있는 개체의 유형은 다르다. 그러나 대부분의 RDBMS의 구현은 표(테이블), 정의 영역(도메인), 색인(인덱스), 이용자(사용자), 별명(별칭), 저장프로시저 및 데이터베이스 작성을 지원하고 있다.<ref> 〈[https://ko.wikipedia.org/wiki/CREATE_(SQL) CREATE (SQL)]〉, 《위키백과》 </ref> | ||
+ | |||
===테이블 생성=== | ===테이블 생성=== | ||
테이블을 생성하기 위해 테이블 이름, 속성이름, 속성의 데이터 타입을 지정할 때 CREATE TABLE 명령을 사용한다. 테이블을 생성할 때 여러 속성을 지정할 수 있기 때문에 필요한 만큼 기술할 수 있으며, 필드의 [[NULL]] 값의 허가여부, [[기본키]](primary key)와 그를 참조하는 [[외래키]](Foreign key)의 지정, 속성의 제약조건을 기술할 수 있다.<ref name="SQL"> 〈[https://helloblog.net/sql-ddl-1/ SQL 데이터 정의 언어(DDL) – 1]〉, 《helloblog.net》 </ref> | 테이블을 생성하기 위해 테이블 이름, 속성이름, 속성의 데이터 타입을 지정할 때 CREATE TABLE 명령을 사용한다. 테이블을 생성할 때 여러 속성을 지정할 수 있기 때문에 필요한 만큼 기술할 수 있으며, 필드의 [[NULL]] 값의 허가여부, [[기본키]](primary key)와 그를 참조하는 [[외래키]](Foreign key)의 지정, 속성의 제약조건을 기술할 수 있다.<ref name="SQL"> 〈[https://helloblog.net/sql-ddl-1/ SQL 데이터 정의 언어(DDL) – 1]〉, 《helloblog.net》 </ref> | ||
− | + | ||
− | + | ; 일반적 테이블 생성문 | |
CREATE TABLE 테이블명 | CREATE TABLE 테이블명 | ||
(속성명 데이터_타입 [제약 조건], | (속성명 데이터_타입 [제약 조건], | ||
125번째 줄: | 126번째 줄: | ||
|align=center|참조하는 테이블이 있을 경우, 데이터 변경 불가 | |align=center|참조하는 테이블이 있을 경우, 데이터 변경 불가 | ||
|} | |} | ||
− | CONSTRAINT 문(제약조건문)으로 속성에 조건을 설정할 수 있다. '생년월일'속성의 값 범위를 지정하기 위해 '생년월일 제약'인 제약조건을 만들어 CHECK(생년월일>='1980-01-01')을 사용하여 1980년 1월 1일부터의 값을 넣을 수 있게 된다. CONSTRAINT 문을 이용하여 외래키를 지정하는 방법도 있다.<ref> PRO HYEON, 〈[https://antaehyeon.github.io/doc/2018/06/28/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%95%94%EA%B8%B0%EB%85%B8%ED%8A%B8-(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-3%EC%9E%A5)/]〉, 《깃허브》, 2018-06-28 </ref> | + | CONSTRAINT 문(제약조건문)으로 속성에 조건을 설정할 수 있다. '생년월일'속성의 값 범위를 지정하기 위해 '생년월일 제약'인 제약조건을 만들어 CHECK(생년월일>='1980-01-01')을 사용하여 1980년 1월 1일부터의 값을 넣을 수 있게 된다. CONSTRAINT 문을 이용하여 외래키를 지정하는 방법도 있다.<ref> PRO HYEON, 〈[https://antaehyeon.github.io/doc/2018/06/28/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%95%94%EA%B8%B0%EB%85%B8%ED%8A%B8-(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-3%EC%9E%A5)/ (정보처리기사)실기 암기노트 데이터베이스 3장]〉, 《깃허브》, 2018-06-28 </ref> |
− | + | ; FOREIGN절에 CONSTRAINT절 사용 | |
CREATE TABLE 학생 | CREATE TABLE 학생 | ||
(이름 VARCHAR(15) NOT NULL, | (이름 VARCHAR(15) NOT NULL, | ||
137번째 줄: | 138번째 줄: | ||
===스키마 생성=== | ===스키마 생성=== | ||
− | [[스키마]](schema)는 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것을 말한다. 다시말해 속성, 개체, 관계에 대한 정의와 유지해야할 제약조건을 기술한것이다. 어떤 구조로 데이터가 저장되는 지를 나타내는 데이터베이스 구조를 스키마라고 칭한다.<ref>〈[https://itkjspo56.tistory.com/94 (SQL) 스키마란 무엇인가?]〉, | + | [[스키마]](schema)는 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것을 말한다. 다시말해 속성, 개체, 관계에 대한 정의와 유지해야할 제약조건을 기술한것이다. 어떤 구조로 데이터가 저장되는 지를 나타내는 데이터베이스 구조를 스키마라고 칭한다.<ref>〈[https://itkjspo56.tistory.com/94 (SQL) 스키마란 무엇인가?]〉, 《티스토리》, 2020-11-03 </ref> |
− | + | ; 일반적 스키마 생성문 | |
CREATE SCHEMA 스키마명; | CREATE SCHEMA 스키마명; | ||
스키마명을 지정하여 현재 연결된 데이터베이스에 새 스키마를 만든다. 스키마 이름은 임의의 이름을 지정할 수 있지만, 'pg_'로 시작하는 이름은 특별한 의미를 가지므로 사용할 수 없다. 스키마를 생성하려면 명령을 실행하는 역할이 슈퍼 유저이거나 스키마를 만들 데이터베이스에서 CREATE 권한을 가지고 있어야 한다. 스키마의 소유자를 지정하여 스키마를 만들 수 있는데 형식은 다음과 같다. 이 경우 소유자는 생성자의 직 ,간접적 구성원이거나 슈퍼 유저이어야 한다.<ref> 〈[http://www.devkuma.com/books/pages/1461 스키마 생성(CREATE SCHEMA)]〉, 《데브쿠마》, 2020-10-31 </ref> | 스키마명을 지정하여 현재 연결된 데이터베이스에 새 스키마를 만든다. 스키마 이름은 임의의 이름을 지정할 수 있지만, 'pg_'로 시작하는 이름은 특별한 의미를 가지므로 사용할 수 없다. 스키마를 생성하려면 명령을 실행하는 역할이 슈퍼 유저이거나 스키마를 만들 데이터베이스에서 CREATE 권한을 가지고 있어야 한다. 스키마의 소유자를 지정하여 스키마를 만들 수 있는데 형식은 다음과 같다. 이 경우 소유자는 생성자의 직 ,간접적 구성원이거나 슈퍼 유저이어야 한다.<ref> 〈[http://www.devkuma.com/books/pages/1461 스키마 생성(CREATE SCHEMA)]〉, 《데브쿠마》, 2020-10-31 </ref> | ||
− | + | ; 스키마 소유자 지정 | |
CREATE SCHEMA 스키마명 AUTHORIZATION 소유자_ID; | CREATE SCHEMA 스키마명 AUTHORIZATION 소유자_ID; | ||
CREATE SCHEMA 대학교 AUTHORIZATION 박교수; | CREATE SCHEMA 대학교 AUTHORIZATION 박교수; | ||
+ | |||
===뷰 생성=== | ===뷰 생성=== | ||
[[뷰]](view)는 쿼리의 결과를 가상 테이블로 만드는 것으로 SELECT 문을 사용하여 지정한 테이블의 속성을 뷰로 나타낼 수 있다. 사용자가 필요한 정보만 요구에 맞게 가공할 수 있기 때문에 편리성이 증가하며, 가상의 테이블을 만듦으로써 실제 테이블의 변경, 수정이 일어나지 않아 보안성이 증가된다는 장점이 있다.<ref> solacci, 〈[https://solabim.tistory.com/6 DataBase(뷰 개념, 생성, 삭제, 수정)(뷰 권한 오류)]〉, 《티스토리》, 2018-11-12 </ref> | [[뷰]](view)는 쿼리의 결과를 가상 테이블로 만드는 것으로 SELECT 문을 사용하여 지정한 테이블의 속성을 뷰로 나타낼 수 있다. 사용자가 필요한 정보만 요구에 맞게 가공할 수 있기 때문에 편리성이 증가하며, 가상의 테이블을 만듦으로써 실제 테이블의 변경, 수정이 일어나지 않아 보안성이 증가된다는 장점이 있다.<ref> solacci, 〈[https://solabim.tistory.com/6 DataBase(뷰 개념, 생성, 삭제, 수정)(뷰 권한 오류)]〉, 《티스토리》, 2018-11-12 </ref> | ||
− | + | ; 일반적 뷰 생성문 | |
CREATE VIEW 뷰명(속성, 속성...) | CREATE VIEW 뷰명(속성, 속성...) | ||
AS SELECT 속성, 속성 | AS SELECT 속성, 속성 | ||
FROM 테이블명 | FROM 테이블명 | ||
WHERE 조건 | WHERE 조건 | ||
− | + | ||
+ | ; 뷰 생성문 예시 | ||
CREATE VIEW 인터넷 고객(성명, 전화번호) | CREATE VIEW 인터넷 고객(성명, 전화번호) | ||
AS SELECT 성명, 전화번호 | AS SELECT 성명, 전화번호 | ||
161번째 줄: | 164번째 줄: | ||
===인덱스 생성=== | ===인덱스 생성=== | ||
− | 테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해 사용하는 것이 [[인덱스]](INDEX)이다. 테이블의 크기가 크면 클수록 탐색하는 시간이 많이 늘어나게 되는데 인덱스를 사용하여 테이블 전체를 읽지 않아도 검색과 질의에 대한 빠른 처리가 가능해진다. 테이블에 대한 인덱스를 생성하고 정렬시키는 것이 가능하다. 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하거나 조인(join)이 자주 사용되는 열에 생성하는 것이 좋다. 하지만 단일 테이블에 인덱스가 많아진다면 속도가 느려질 수 있고 데이터가 중복도가 많은 열에는 인덱스를 만들어도 효과가 없다.<ref>〈[http://tcpschool.com/mysql/mysql_index_create INDEX 생성]〉, 《TCP School》 </ref><ref> Kangjieun11, 〈[https://jie0025.tistory.com/107 | + | 테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해 사용하는 것이 [[인덱스]](INDEX)이다. 테이블의 크기가 크면 클수록 탐색하는 시간이 많이 늘어나게 되는데 인덱스를 사용하여 테이블 전체를 읽지 않아도 검색과 질의에 대한 빠른 처리가 가능해진다. 테이블에 대한 인덱스를 생성하고 정렬시키는 것이 가능하다. 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하거나 조인(join)이 자주 사용되는 열에 생성하는 것이 좋다. 하지만 단일 테이블에 인덱스가 많아진다면 속도가 느려질 수 있고 데이터가 중복도가 많은 열에는 인덱스를 만들어도 효과가 없다.<ref>〈[http://tcpschool.com/mysql/mysql_index_create INDEX 생성]〉, 《TCP School》 </ref><ref> Kangjieun11, 〈[https://jie0025.tistory.com/107 (MySQL) 인덱스(index), 클러스터/보조인덱스]〉, 《티스토리》, 2021-05-25 </ref> |
− | + | ; 일반적 인덱스 생성문 | |
CTEATE [UNIQUE][CLUSTERED|NUNCLUSTERED] INDEX 인덱스명 | CTEATE [UNIQUE][CLUSTERED|NUNCLUSTERED] INDEX 인덱스명 | ||
ON 테이블명(속성[ASC|DESC], 속성[ASC|DESC, ...) | ON 테이블명(속성[ASC|DESC], 속성[ASC|DESC, ...) | ||
− | * '''UNIQUE''': 중복을 제거한다. | + | * '''UNIQUE''' : 중복을 제거한다. |
− | * '''CLUSTERED''': 데이터가 자동으로 정렬되는 [[클러스터드 인덱스]]로 설정한다. 테이블당 하나만 생성이 가능하다. | + | * '''CLUSTERED''' : 데이터가 자동으로 정렬되는 [[클러스터드 인덱스]]로 설정한다. 테이블당 하나만 생성이 가능하다. |
− | * '''NUNCLUSTERED''': 데이터가 정렬되지 않으나 데이터 위치에 대한 포인터가 정렬되는 [[넌 클러스터트 인덱스]]로 설정한다. 테이블당 여러 개 생성이 가능하다. | + | * '''NUNCLUSTERED''' : 데이터가 정렬되지 않으나 데이터 위치에 대한 포인터가 정렬되는 [[넌 클러스터트 인덱스]]로 설정한다. 테이블당 여러 개 생성이 가능하다. |
− | * '''ASC''': 데이터를 오름차순으로 정렬한다. 생략이 가능하다. | + | * '''ASC''' : 데이터를 오름차순으로 정렬한다. 생략이 가능하다. |
− | * '''DESC''': 데이터를 내림차순 정렬로 한다. | + | * '''DESC''' : 데이터를 내림차순 정렬로 한다. |
− | + | ; 인덱스 생성문 예시 | |
− | |||
CREATE INDEX 출석_idx | CREATE INDEX 출석_idx | ||
ON 학생(학생 번호); | ON 학생(학생 번호); | ||
출석을 쉽게 하기 위해 인덱스를 생성했다고 가정하면, 학생 테이블의 학생번호를 오름차순으로 하여 나타냄으로 인덱스를 설정할 수 있다. | 출석을 쉽게 하기 위해 인덱스를 생성했다고 가정하면, 학생 테이블의 학생번호를 오름차순으로 하여 나타냄으로 인덱스를 설정할 수 있다. | ||
+ | |||
===도메인 생성=== | ===도메인 생성=== | ||
[[도메인]](domain)은 하나의 속성이 가질 수 있는 동일한 타입의 원자값으로 속성의 데이터 범위 즉, 데이터 타입의 범위를 정의하는 것이다. 정의된 도메인은 일반적인 데이터 타입처럼 사용할 수 있다.<ref> gillog, 〈[https://velog.io/@gillog/DBDomain-Data-Dictionary (DB)Domain, Data Dictionary]〉, 《티스토리》, 2020-10-28 </ref> | [[도메인]](domain)은 하나의 속성이 가질 수 있는 동일한 타입의 원자값으로 속성의 데이터 범위 즉, 데이터 타입의 범위를 정의하는 것이다. 정의된 도메인은 일반적인 데이터 타입처럼 사용할 수 있다.<ref> gillog, 〈[https://velog.io/@gillog/DBDomain-Data-Dictionary (DB)Domain, Data Dictionary]〉, 《티스토리》, 2020-10-28 </ref> | ||
− | + | ; 일반적 도메인 생성문 | |
CREATE DOMAIN 도메인명 데이터_타입 | CREATE DOMAIN 도메인명 데이터_타입 | ||
[DEFAULT 기본값] | [DEFAULT 기본값] | ||
[CONSTRAINT 제약조건명 CHECK (범위 값)]; | [CONSTRAINT 제약조건명 CHECK (범위 값)]; | ||
− | + | ; 도메인 생성문 예시 | |
CREATE DOMAIN GANDER CHAR(1)s | CREATE DOMAIN GANDER CHAR(1)s | ||
DEFAULT '남' | DEFAULT '남' | ||
188번째 줄: | 191번째 줄: | ||
'남','여'와 같이 정해진 1개의 문자로 표현되는 도메인'GANDER'를 정의하는 SQL 문을 작성할 때 위 예시처럼 나타내어진다. 기본 값을 '남'으로 지정하고 제약조건문을 통하여 '남', '여'로 데이터 값을 제한한다. | '남','여'와 같이 정해진 1개의 문자로 표현되는 도메인'GANDER'를 정의하는 SQL 문을 작성할 때 위 예시처럼 나타내어진다. 기본 값을 '남'으로 지정하고 제약조건문을 통하여 '남', '여'로 데이터 값을 제한한다. | ||
+ | |||
===트리거 생성=== | ===트리거 생성=== | ||
[[트리거]](Trigger)는 테이블에 대한 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때를 반응하여 자동으로 실행되는 작업이다. 즉, 사용자가 DML 문이 실행될 때마다 직접 호출하는 것이 아닌 데이터베이스에서 자동적으로 호출하는 것이 가장 큰 특징이다. 예로 다른 테이블의 삭제로 인하여 그 테이블의 데이터가 필요하게 되면 데이터가 없어 사용할 수 없게 되고, 테이블의 변경으로 이전 데이터의 필요 ㅅ시 잘못된 데이터를 가져올 수 있는 현상이 생기게 되어 데이터의 신뢰성을 떨어트리게 된다. 그것을 방지하기 위해 테이블에 대한 수정이나 삭제가 이루어질 때마다 번거로움은 물론 데이터의 구조도 망가질 가능성이 커지기 때문에 자동으로 변경, 저장해 주는 기능을 가진 트리거가 그 사용 용도이다.<ref> 뵙뵙, 〈[https://hanhyx.tistory.com/20 트리거(TRIGGER) 란 무엇인가? 실습을 통한 기초 이해하기]〉, 《티스토리》, 2020-07-28 </ref> | [[트리거]](Trigger)는 테이블에 대한 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때를 반응하여 자동으로 실행되는 작업이다. 즉, 사용자가 DML 문이 실행될 때마다 직접 호출하는 것이 아닌 데이터베이스에서 자동적으로 호출하는 것이 가장 큰 특징이다. 예로 다른 테이블의 삭제로 인하여 그 테이블의 데이터가 필요하게 되면 데이터가 없어 사용할 수 없게 되고, 테이블의 변경으로 이전 데이터의 필요 ㅅ시 잘못된 데이터를 가져올 수 있는 현상이 생기게 되어 데이터의 신뢰성을 떨어트리게 된다. 그것을 방지하기 위해 테이블에 대한 수정이나 삭제가 이루어질 때마다 번거로움은 물론 데이터의 구조도 망가질 가능성이 커지기 때문에 자동으로 변경, 저장해 주는 기능을 가진 트리거가 그 사용 용도이다.<ref> 뵙뵙, 〈[https://hanhyx.tistory.com/20 트리거(TRIGGER) 란 무엇인가? 실습을 통한 기초 이해하기]〉, 《티스토리》, 2020-07-28 </ref> | ||
− | + | ; 일반적 트리거 생성문 | |
CREATE TRIGGER 트리거명 [동작시기 옵션][동작 옵션] ON 테이블명 | CREATE TRIGGER 트리거명 [동작시기 옵션][동작 옵션] ON 테이블명 | ||
REFERENCING [NEW | OLD] TABLE AS 테이블명 | REFERENCING [NEW | OLD] TABLE AS 테이블명 | ||
[FOR EACH ROW | [FOR EACH ROW | ||
WHEN 조건식] | WHEN 조건식] | ||
− | 트리거 BODY; | + | 트리거 BODY;<ref name="트리거"> 모든기록, 〈[https://all-record.tistory.com/61 데이터베이스 DDL]〉, 《티스토리》 </ref> |
− | '동작 시기 옵션'에는 AFTER와 BEFORE가 사용되며 트리거가 실행될 때를 지정하게 된다. AFTER는 테이블의 변경이 실행된 후 트리거를 실행할 때 사용하고, BEFORE는 테이블의 변경 전에 트리거를 실행하고 싶으면 사용하면 된다. '동작 옵션'에는 INSERT(삽입), DELETE(삭제), UPDATE(갱신)이 있으며 트리거가 실행되게 할 작업의 종류를 지정할 수 있다. 테이블의 삭제에 관하여 트리거가 반응하도록 하려면 DELETE를 사용하면 된다. '테이블 선택 옵션'에는 트리거가 적용될 테이블의 상태의 종류를 지정한다. 예를 들어 삭제가 발생한 시점에서 전과 후로 테이블을 나뉘게 되어 사용된다. 삭제가 되기 전 테이블 참조 시 OLD를 사용하고, 삭제 후 테이블 참조 시에는 NEW를 사용하면 된다. 'FOR EACH ROW WHEN 조건식'의 사용은 조건식에 대해 행이 조건이 만족하게 될 때, 만족하는 여러 개의 행에 대해 트리거가 반복적으로 여러 번 수행하는 행 트리거가 된다. '트리거 | + | '동작 시기 옵션'에는 AFTER와 BEFORE가 사용되며 트리거가 실행될 때를 지정하게 된다. AFTER는 테이블의 변경이 실행된 후 트리거를 실행할 때 사용하고, BEFORE는 테이블의 변경 전에 트리거를 실행하고 싶으면 사용하면 된다. '동작 옵션'에는 INSERT(삽입), DELETE(삭제), UPDATE(갱신)이 있으며 트리거가 실행되게 할 작업의 종류를 지정할 수 있다. 테이블의 삭제에 관하여 트리거가 반응하도록 하려면 DELETE를 사용하면 된다. '테이블 선택 옵션'에는 트리거가 적용될 테이블의 상태의 종류를 지정한다. 예를 들어 삭제가 발생한 시점에서 전과 후로 테이블을 나뉘게 되어 사용된다. 삭제가 되기 전 테이블 참조 시 OLD를 사용하고, 삭제 후 테이블 참조 시에는 NEW를 사용하면 된다. 'FOR EACH ROW WHEN 조건식'의 사용은 조건식에 대해 행이 조건이 만족하게 될 때, 만족하는 여러 개의 행에 대해 트리거가 반복적으로 여러 번 수행하는 행 트리거가 된다. '트리거 BODY' 부분에는 트리거 발생시 수행할 SQL 문을 작성하면 된다.작성할 때는 BEGIN으로 문장을 시작하고 END로 끝나야 된다.<ref name="트리거"/> |
− | BODY' 부분에는 트리거 발생시 수행할 SQL 문을 작성하면 된다.작성할 때는 BEGIN으로 문장을 시작하고 END로 끝나야 된다.<ref name="트리거"/> | ||
− | + | ; 트리거 생성문 예제 | |
CREATE TRIGGER 학년정보_TR BEFORE INSERT ON 학생 | CREATE TRIGGER 학년정보_TR BEFORE INSERT ON 학생 | ||
REFERENCING NEW TABLE AS new_table | REFERENCING NEW TABLE AS new_table | ||
208번째 줄: | 211번째 줄: | ||
END; | END; | ||
사용법의 이해를 하기 위해선 예시를 보고 해석을 해보아야 한다. 첫 문장을 천천히 해석하면 '학생'테이블에 '삽입'이 일어나기 '전'에 학년정보_TR이 동작하게 설정되었다. 그 밑줄을 해석하면 새 테이블에 적용하며 테이블 이름은 'new_table'이 된다. FOR EACH ROW의 사용으로 조건문인 학년이 NULL 값이면 '신입생'을 치환하는 트리거가 된다.<ref name="트리거"/> | 사용법의 이해를 하기 위해선 예시를 보고 해석을 해보아야 한다. 첫 문장을 천천히 해석하면 '학생'테이블에 '삽입'이 일어나기 '전'에 학년정보_TR이 동작하게 설정되었다. 그 밑줄을 해석하면 새 테이블에 적용하며 테이블 이름은 'new_table'이 된다. FOR EACH ROW의 사용으로 조건문인 학년이 NULL 값이면 '신입생'을 치환하는 트리거가 된다.<ref name="트리거"/> | ||
+ | |||
==변경== | ==변경== | ||
데이터베이스에서 테이블의 속성을 추가, 삭제, 수정할 때 SQL 명령어인 ALTER를 사용한다. 관계의 구조를 수정하며 속성을 추가하거나, 속성을 삭제, 속성의 이름이 바꾸거나, 속성의 크기를 조정하거나, 데이터베이스에 있는 테이블의 속성 데이터 형식을 변경할 수 있다. 따라서 ALTER는 열이 나 특성에만 작동한다고 말할 수 있다. 새로운 속성을 추가할 때 기본적으로 모든 튜플의 해당 속성 값을 NULL로 초기화된다.<ref name="차이점"> 〈[https://ko.gadget-info.com/difference-between-alter SQL에서 ALTER 및 UPDATE 명령의 차이점]〉, 《Gadget-info.com》 </ref> | 데이터베이스에서 테이블의 속성을 추가, 삭제, 수정할 때 SQL 명령어인 ALTER를 사용한다. 관계의 구조를 수정하며 속성을 추가하거나, 속성을 삭제, 속성의 이름이 바꾸거나, 속성의 크기를 조정하거나, 데이터베이스에 있는 테이블의 속성 데이터 형식을 변경할 수 있다. 따라서 ALTER는 열이 나 특성에만 작동한다고 말할 수 있다. 새로운 속성을 추가할 때 기본적으로 모든 튜플의 해당 속성 값을 NULL로 초기화된다.<ref name="차이점"> 〈[https://ko.gadget-info.com/difference-between-alter SQL에서 ALTER 및 UPDATE 명령의 차이점]〉, 《Gadget-info.com》 </ref> | ||
− | + | ; 일반적 테이블 속성 추가, 변경, 삭제문 | |
ALTER TABLE 테이블명 ADD 속성명 데이터타입[DEFAULT '기본값']; | ALTER TABLE 테이블명 ADD 속성명 데이터타입[DEFAULT '기본값']; | ||
ALTER TABLE 테이블명 ALTER 속성명 데이터타입[SET DEFAULT '기본값']; | ALTER TABLE 테이블명 ALTER 속성명 데이터타입[SET DEFAULT '기본값']; | ||
− | ALTER TABLE 테이블명 DROP COULUMN 속성명 [CASCADE]; | + | ALTER TABLE 테이블명 DROP COULUMN 속성명 [CASCADE];<ref name="참고"> 딱지의겨울, 〈[https://1-day-1-coding.tistory.com/37 (정보처리기사 실기) 8장 요약 키워드 정리 _ SQL 응용]〉, 《티스토리》, 2021-04-16 </ref> |
− | + | ; 테이블 속성 추가, 변경, 삭제문 예시 | |
ALTER TABLE 학생 ADD 학년 VARCHAR(3); | ALTER TABLE 학생 ADD 학년 VARCHAR(3); | ||
ALTER TABLE 학생 ALTER 학번 VARCHAR(10) NOT NULL; | ALTER TABLE 학생 ALTER 학번 VARCHAR(10) NOT NULL; | ||
223번째 줄: | 227번째 줄: | ||
===ALTER와 UPDATE=== | ===ALTER와 UPDATE=== | ||
ALTER와 UPDATE 두 가지 모두 SQL에서 수정 명령을 맡고 있는데 ALTER는 데이터 정의어 UPDATE는 데이터 조작어라는 차이도 있지만 사용하는 데 있어 그 사용 범위가 다르다. ALTER는 테이블에 대한 변경이 이루어질 때 사용하는 것이고, UPDATE는 하나의 관계에 있는 하나 이상의 [[튜플]](tuple)의 속성 값을 수정하는 것이다. 즉 ALTER보다는 세부적인 수정이 이루어질 때 사용한다.<ref name="차이점"/> | ALTER와 UPDATE 두 가지 모두 SQL에서 수정 명령을 맡고 있는데 ALTER는 데이터 정의어 UPDATE는 데이터 조작어라는 차이도 있지만 사용하는 데 있어 그 사용 범위가 다르다. ALTER는 테이블에 대한 변경이 이루어질 때 사용하는 것이고, UPDATE는 하나의 관계에 있는 하나 이상의 [[튜플]](tuple)의 속성 값을 수정하는 것이다. 즉 ALTER보다는 세부적인 수정이 이루어질 때 사용한다.<ref name="차이점"/> | ||
+ | |||
==삭제== | ==삭제== | ||
테이블, 스키마, 인덱스, 도메인, 제약조건, 뷰의 삭제를 할 때 DROP을 사용하여 삭제를 하게 된다. | 테이블, 스키마, 인덱스, 도메인, 제약조건, 뷰의 삭제를 할 때 DROP을 사용하여 삭제를 하게 된다. | ||
− | + | ; 일반적 삭제문 | |
DROP SCHEMA 스키마명 [CASCADE | RESTRICTED]; | DROP SCHEMA 스키마명 [CASCADE | RESTRICTED]; | ||
DROP DOMAIN 도메인명 [CASCADE | RESTRICTED]; | DROP DOMAIN 도메인명 [CASCADE | RESTRICTED]; | ||
231번째 줄: | 236번째 줄: | ||
DROP VIEW 뷰명 [CASCADE | RESTRICTED]; | DROP VIEW 뷰명 [CASCADE | RESTRICTED]; | ||
DROP INDEX 인덱스명 [CASCADE | RESTRICTED]; | DROP INDEX 인덱스명 [CASCADE | RESTRICTED]; | ||
− | DROP CONSTRAINT 제약조건명; | + | DROP CONSTRAINT 제약조건명;<ref name="참고"/> |
CASCADE는 제거할 요소가 참조하는 다른 모든 개체를 연쇄제거하게 된다. 주 테이블의 데이터 제거 시에 각 외래키와 관계를 맺고 있는 모든 데이터를 제거하는 [[참조 무결성]](referential integrity) 제약 조건을 설정하기 위해 사용된다. RESTICTED는 다른 개체가 제거할 요소를 참조 중 일 때 제거를 취소하여 문제 발생을 줄여주게 된다.<ref name="참고"/> | CASCADE는 제거할 요소가 참조하는 다른 모든 개체를 연쇄제거하게 된다. 주 테이블의 데이터 제거 시에 각 외래키와 관계를 맺고 있는 모든 데이터를 제거하는 [[참조 무결성]](referential integrity) 제약 조건을 설정하기 위해 사용된다. RESTICTED는 다른 개체가 제거할 요소를 참조 중 일 때 제거를 취소하여 문제 발생을 줄여주게 된다.<ref name="참고"/> | ||
237번째 줄: | 242번째 줄: | ||
===TRUNCATE와 DELETE=== | ===TRUNCATE와 DELETE=== | ||
TRUNCATE는 테이블에서의 모든 행(속성)을 삭제하게 되는 데이터 정의 언어이다. DROP의 사용은 지정된 테이블이 모두 사라지지만 TRUNCATE의 사용은 테이블의 틀만 남기고 전부 삭제된다고 보면 된다. DELETE는 테이블의 지정된 데이터만을 삭제할 때 사용된다. DROP은 전체, TRUNCATE은 테이블만 남기고, DELETE 테이블의 내용 순으로 삭제범위로 나뉜다고 생각하면 된다. TRUNCATE는 무결성을 유지하는 메커니즘을 생략하여 빠르게 제거를 실현하지만 데이터의 무결성을 흩트리게 되어 사용에 유의해야 한다. DELETE의 사용은 WHERE 절을 사용한 정교한 삭제가 가능하고 삭제 후 다시 복귀가 가능하지만 여러 번 사용해야 되는 경우가 생기므로 [[트랜잭션 로그]](transaction log) 공간을 더 사용하게 되는 경우가 있다.<ref> 〈[https://ko.wikipedia.org/wiki/TRUNCATE_(SQL) TRUNCATE (SQL)]〉, 《위키백과》 </ref> | TRUNCATE는 테이블에서의 모든 행(속성)을 삭제하게 되는 데이터 정의 언어이다. DROP의 사용은 지정된 테이블이 모두 사라지지만 TRUNCATE의 사용은 테이블의 틀만 남기고 전부 삭제된다고 보면 된다. DELETE는 테이블의 지정된 데이터만을 삭제할 때 사용된다. DROP은 전체, TRUNCATE은 테이블만 남기고, DELETE 테이블의 내용 순으로 삭제범위로 나뉜다고 생각하면 된다. TRUNCATE는 무결성을 유지하는 메커니즘을 생략하여 빠르게 제거를 실현하지만 데이터의 무결성을 흩트리게 되어 사용에 유의해야 한다. DELETE의 사용은 WHERE 절을 사용한 정교한 삭제가 가능하고 삭제 후 다시 복귀가 가능하지만 여러 번 사용해야 되는 경우가 생기므로 [[트랜잭션 로그]](transaction log) 공간을 더 사용하게 되는 경우가 있다.<ref> 〈[https://ko.wikipedia.org/wiki/TRUNCATE_(SQL) TRUNCATE (SQL)]〉, 《위키백과》 </ref> | ||
+ | |||
{{각주}} | {{각주}} | ||
242번째 줄: | 248번째 줄: | ||
* 〈[https://terms.naver.com/entry.naver?docId=3431106&cid=58430&categoryId=58430 데이터 정의어]〉, 《네이버지식백과》 | * 〈[https://terms.naver.com/entry.naver?docId=3431106&cid=58430&categoryId=58430 데이터 정의어]〉, 《네이버지식백과》 | ||
* 미니송, 〈[https://dany-it.tistory.com/161 데이터베이스 언어(DDL, DML, DCL) - DO의 IT]〉, 《티스토리》, 2017-12-05 | * 미니송, 〈[https://dany-it.tistory.com/161 데이터베이스 언어(DDL, DML, DCL) - DO의 IT]〉, 《티스토리》, 2017-12-05 | ||
− | * pridiot, 〈[https://pridiot.tistory.com/118 (Oracle) 데이터 정의어 (DDL : Data Definition Language) - pridiot]〉, 《티스토리》, 2019-09-29 | + | * pridiot, 〈[https://pridiot.tistory.com/118 (Oracle) 데이터 정의어 (DDL : Data Definition Language) - pridiot]〉, 《티스토리》, 2019-09-29 |
− | * 〈[https://ko.wikipedia.org/wiki/CREATE_(SQL) CREATE (SQL)]〉, 《위키백과》 | + | * 〈[https://ko.wikipedia.org/wiki/CREATE_(SQL) CREATE (SQL)]〉, 《위키백과》 |
− | * 〈[https://helloblog.net/sql-ddl-1/ SQL 데이터 정의 언어(DDL) – 1]〉, 《helloblog.net》 | + | * 〈[https://helloblog.net/sql-ddl-1/ SQL 데이터 정의 언어(DDL) – 1]〉, 《helloblog.net》 |
* IT 양햄찌(jhnyang), 〈[https://jhnyang.tistory.com/307 (ORACLE, MYSQL, SQL) CREATE TABLE 테이블 생성하고 주키(기본키)지정하기, 테이블생성법, 제약조건 설정(NOT NULL)]〉, 《티스토리》, 2020-07-19 | * IT 양햄찌(jhnyang), 〈[https://jhnyang.tistory.com/307 (ORACLE, MYSQL, SQL) CREATE TABLE 테이블 생성하고 주키(기본키)지정하기, 테이블생성법, 제약조건 설정(NOT NULL)]〉, 《티스토리》, 2020-07-19 | ||
* 1D1C, 〈[https://1d1cblog.tistory.com/95 2020 정보처리기사 필기 - 3.3 SQL 응용(1) ]〉, 《티스토리》, 2020-03-02 | * 1D1C, 〈[https://1d1cblog.tistory.com/95 2020 정보처리기사 필기 - 3.3 SQL 응용(1) ]〉, 《티스토리》, 2020-03-02 | ||
* ehdtnn , 〈[https://ehdtnn.tistory.com/777 외래키, 외래키 옵션]〉, 《티스토리》, 2021-08-12 | * ehdtnn , 〈[https://ehdtnn.tistory.com/777 외래키, 외래키 옵션]〉, 《티스토리》, 2021-08-12 | ||
− | * PRO HYEON, 〈[https://antaehyeon.github.io/doc/2018/06/28/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%95%94%EA%B8%B0%EB%85%B8%ED%8A%B8-(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-3%EC%9E%A5)/]〉, 《깃허브》, 2018-06-28 | + | * PRO HYEON, 〈[https://antaehyeon.github.io/doc/2018/06/28/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC-%EC%8B%A4%EA%B8%B0-%EC%95%94%EA%B8%B0%EB%85%B8%ED%8A%B8-(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-3%EC%9E%A5)/ (정보처리기사)실기 암기노트 데이터베이스 3장]〉, 《깃허브》, 2018-06-28 |
− | * 〈[https://itkjspo56.tistory.com/94 (SQL) 스키마란 무엇인가?]〉, | + | * 〈[https://itkjspo56.tistory.com/94 (SQL) 스키마란 무엇인가?]〉, 《티스토리》, 2020-11-03 |
* 〈[http://www.devkuma.com/books/pages/1461 스키마 생성(CREATE SCHEMA)]〉, 《데브쿠마》, 2020-10-31 | * 〈[http://www.devkuma.com/books/pages/1461 스키마 생성(CREATE SCHEMA)]〉, 《데브쿠마》, 2020-10-31 | ||
* solacci, 〈[https://solabim.tistory.com/6 DataBase(뷰 개념, 생성, 삭제, 수정)(뷰 권한 오류)]〉, 《티스토리》, 2018-11-12 | * solacci, 〈[https://solabim.tistory.com/6 DataBase(뷰 개념, 생성, 삭제, 수정)(뷰 권한 오류)]〉, 《티스토리》, 2018-11-12 | ||
* 〈[http://tcpschool.com/mysql/mysql_index_create INDEX 생성]〉, 《TCP School》 | * 〈[http://tcpschool.com/mysql/mysql_index_create INDEX 생성]〉, 《TCP School》 | ||
− | * Kangjieun11, 〈[https://jie0025.tistory.com/107 | + | * Kangjieun11, 〈[https://jie0025.tistory.com/107 (MySQL) 인덱스(index), 클러스터/보조인덱스]〉, 《티스토리》, 2021-05-25 |
* gillog, 〈[https://velog.io/@gillog/DBDomain-Data-Dictionary (DB)Domain, Data Dictionary]〉, 《티스토리》, 2020-10-28 | * gillog, 〈[https://velog.io/@gillog/DBDomain-Data-Dictionary (DB)Domain, Data Dictionary]〉, 《티스토리》, 2020-10-28 | ||
* 뵙뵙, 〈[https://hanhyx.tistory.com/20 트리거(TRIGGER) 란 무엇인가? 실습을 통한 기초 이해하기]〉, 《티스토리》, 2020-07-28 | * 뵙뵙, 〈[https://hanhyx.tistory.com/20 트리거(TRIGGER) 란 무엇인가? 실습을 통한 기초 이해하기]〉, 《티스토리》, 2020-07-28 | ||
* 모든기록, 〈[https://all-record.tistory.com/61 데이터베이스 DDL]〉, 《티스토리》 | * 모든기록, 〈[https://all-record.tistory.com/61 데이터베이스 DDL]〉, 《티스토리》 | ||
* 〈[https://ko.gadget-info.com/difference-between-alter SQL에서 ALTER 및 UPDATE 명령의 차이점]〉, 《Gadget-info.com》 | * 〈[https://ko.gadget-info.com/difference-between-alter SQL에서 ALTER 및 UPDATE 명령의 차이점]〉, 《Gadget-info.com》 | ||
− | * 딱지의겨울, 〈[https://1-day-1-coding.tistory.com/37 | + | * 딱지의겨울, 〈[https://1-day-1-coding.tistory.com/37 (정보처리기사 실기) 8장 요약 키워드 정리 _ SQL 응용]〉, 《티스토리》, 2021-04-16 |
* 〈[https://ko.wikipedia.org/wiki/TRUNCATE_(SQL) TRUNCATE (SQL)]〉, 《위키백과》 | * 〈[https://ko.wikipedia.org/wiki/TRUNCATE_(SQL) TRUNCATE (SQL)]〉, 《위키백과》 | ||
2021년 8월 13일 (금) 11:47 판
데이터 정의어(DDL, Data Definition Language)는 새로운 데이터베이스를 구축하기 위해 스키마(schema)를 정의하거나 기존 스키마의 정의를 삭제 또는 수정하기 위해 사용하는 데이터 언어(data language)이다. 즉, 새로 만들려는 데이터베이스의 전체적인 구조를 설명하거나 데이터의 종류와 관계, 이미 정의된 스키마의 구조나 제약조건 등을 변경 또는 삭제하고 싶어 이를 데이터베이스 관리시스템(DBMS)에 알릴 때 사용한다. 데이터 정의어로 정의된 스키마는 데이터 사전(Data Dictionary)이라는 특별한 파일에 여러 개의 테이블로 저장되고, 삭제나 수정이 발생하면 이 내용도 데이터 사전에 반영된다. 데이터 사전에 저장된 스키마 정보는 사용자나 데이터베이스 관리 시스템이 필요할 때 참고할 수 있다.[1]
목차
개요
데이터베이스 언어인 DDL, DCL, DML 중 DML 즉, 데이터 정의어는 데이터베이스 내의 객체 생성, 삭제, 변경을 명령을 의미하며 주로 관리자가 사용하는 명령이다. 데이터 정의어는 데이터 조작어와 달리 명령어를 수행하자마자 데이터베이스에 수행한 내용이 바로 반영되는 커밋(commit)이 있다. 롤백(rollback)을 통한 실행취소가 불가능하기 때문에 사용할 때 주의해야 한다. 명령어 중 CREATE, DROP, ALTER, TRUNCATE 등이 있으며 CREATE는 새로운 데이터 베이스 관계, 뷰(view), 인덱스(index), 저장 프로시저(stored procedure) 만들기 등을 수행할 수 있다. DROP 명령어는 이미 존재하는 데이터 베이스 관계, 뷰, 인덱스, 저장 프로시저를 제거할 수 있고, ALTER는 이미 존재하는 데이터베이스 개체에 대한 변경, 이름 변경의 역할을 한다. TRUNCATE는 관계에서 데이터를 제거하며 다시 복구할 수 없다.[2][3]
생성
CREATE 문은 관계형 데이터베이스 관리시스템의 관리하에 객체를 생성하는 데이터 정의 언어(DDL) 명령이다. 사용하는 데이터베이스 관리시스템의 구현을 통해 CREATE 문장으로 만들 수 있는 개체의 유형은 다르다. 그러나 대부분의 RDBMS의 구현은 표(테이블), 정의 영역(도메인), 색인(인덱스), 이용자(사용자), 별명(별칭), 저장프로시저 및 데이터베이스 작성을 지원하고 있다.[4]
테이블 생성
테이블을 생성하기 위해 테이블 이름, 속성이름, 속성의 데이터 타입을 지정할 때 CREATE TABLE 명령을 사용한다. 테이블을 생성할 때 여러 속성을 지정할 수 있기 때문에 필요한 만큼 기술할 수 있으며, 필드의 NULL 값의 허가여부, 기본키(primary key)와 그를 참조하는 외래키(Foreign key)의 지정, 속성의 제약조건을 기술할 수 있다.[5]
- 일반적 테이블 생성문
CREATE TABLE 테이블명 (속성명 데이터_타입 [제약 조건], 속성명 데이터_타입 [제약 조건], PRIMARY KEY (속성명) FOREIGN KEY (속성명) REFERENCES 참조할 테이블명(속성명) [ON UPDATE [NO ACTION┃CASCADE┃SET NULL┃SET DEFAULT]] [ON DELETE [NO ACTION┃CASCADE┃SET NULL┃SET DEFAULT]] CONSTRAINT 제약조건명 CHECK(제약조건));
속성에 들어갈 데이터의 타입을 설정해 줄 수 있다. 각 데이터베이스 관리시스템별로 지원하는 데이터 타입이 있고 지원하지 않는 데이터 타입이 있으니 사용하는 데이터 타입이 지원되는지 확인하고 사용해야 한다.[6]
데이터 타입[6] 데이터 타입 의미 CHAR 특정 문자열 개수를 지정할 때 사용
(보통 글자 수가 정해져있을 때, 주민등록번호, 전화번호 등)VARCHAR 가변길이의 문자열을 저장할 때 최대 길이를 지정
(글자 수가 정해져 있지 않을 때, 이름, 주소 등)VARCHAR2 가변길이의 문자열을 저장할 때 최대 길이를 지정, 속성 데이터 길이의 편차가 심할 경우 사용
(MySQL, MariaDB 지원안함)NUMBER 숫자에 사용되는 테이터 타입으로 소수점 저장이 가능
(MySQL, MariaDB는 INT로 사용)LONG VARCHAR2와 유사하며 긴 가변길이의 문자를 저장할 때 사용 DATE 날짜에 사용되는 데이터 타입
데이터의 무결성 유지를 위하여 속성의 제약조건을 부여한다. 속성을 기본키와 외래키로 지정해 주거나 속성에 조건을 설정할 수 있다.
제약 조건[6] 제약조건 의미 NOT NULL 값이 꼭 입력되어야 할 때 사용, NULL을 허용하지 않음 UNIQUE 해당 속성에 중복 값을 허용하고 싶지 않을 때 사용 PRIMARY KEY 기본키를 지정할 때 사용하는 조건으로 테이블 당 한 개의 기본키만 생성 가능 FOREIGN KEY 외래키를 지정할 때 사용. REFERRENCES와 같이 사용하여 참조할 테이블의 속성을 지정해야 함 CHECK 속성에 입력되는 데이터를 특정 조건에 맞는 데이터만 입력받고 싶을 때 사용 DEFAULT 값이 입력되지 않았을 때 디폴트에 지정된 값(기본 값)으로 입력 INDEX 인덱스를 지정할 때 사용
간단히 예를 들어 적용해보면, '이름','학번', 전공', '성별', '생년월일'로 구성된 학생 테이블을 정의하는 SQL 문을 작성한다고 가정한다. 각 속성마다 제약조건과 입력되는 데이터 타입을 확인해 주어야 한다. 다음과 같이 속성에 제약조건이 있다고 가정한다.[7]
- '이름'속성은 값은 무조건 존재해야 하며 '학번'속성은 기본키로 지정된다.
- '전공'속성은 다른 '학과'테이블의 '학과 코드'라는 속성을 참고하게 되는 외래키로 지정되며 학과 테이블에 삭제가 일어나면 관련 튜플은 NULL 값이 되며, 변경이 일어나면 '전공'의 속성도 같이 변경되게 해야 한다.
- '생년월일' 속성은 1980-01-01 이후에 데이터만 입력될 수 있으며, 제약 조건의 이름은 '생년월일 제약'으로 정의한다.
- '성별'속성은 도메인'GANDER'를 사용한다.
CREATE TABLE 학생 (이름 VARCHAR(15) NOT NULL, 학번 CHAR(8), 전공 CHAR(5), 성별 GANDER, 생년월일 DATE, PRIMARY KEY(학번), FOREIGN KEY(전공) REFRRENCES 학과(학과코드) ON DELETE SET NULL, ON UPDATE CASCADE, CONSTRAINT 생년월일제약 CHECK(생년월일>='1980-01-01'));
처음 테이블명에 있어서 생성 규칙이 존재한다. 테이블명은 문자로 시작해야 한다. 즉, 숫자가 아닌 한글, 영어로 시작해야 한다. 테이블명의 길이는 30byte 이하여야 되며 특수문자의 사용이 가능하다. 테이블명의 중복은 허용되지 않는다. 이 점들을 잘 기억하여 테이블명을 작성해야 한다. 이후 각 속성을 정의하면 되는데 각 속성명과 데이터 타입을 지정해 주게 된다. 이름은 사람마다 글자 수가 다르기 때문에 최대 15자리로 제한한 VARCHAR(15)을 사용하는 것을 볼 수 있다. 데이터 타입 지정 후 속성의 조건을 설정하게 되는데 '이름'속성의 값은 무조건 존재해야 하기 때문에 NULL 값이 될 수 없음을 의미한다. 데이터 타입 뒤에 NOT NULL을 사용하게 되면서 설정된다. '성별'속성은 지정된 'GANDER'도메인(Domain)을 사용하기에 속성명 뒤에 기입하면 된다. 속성의 기본적 정의 후에 기본키, 외래키를 지정해 준다. '학번'속성이 기본키로 지정되었기에 PRIMART KEY(학번)을 기입하면 된다. 외래키는 '전공' 속성이며 '학과'테이블에 있는 '학과코드' 속성을 참조(reference) 하기에 FOREIGN KEY(전공) REFRRENCES 학과(학과코드)를 기입해준다. 외래키의 참조 옵션은 다음과 같다.
외래키 옵션[8] 조건 옵션 의미 삭제 시(ON DELETE) CASCADE 참조하는 테이블의 속성 데이터 삭제 시 따라 삭제됨 SET NULL 참조하는 테이블 속성 데이터 삭제 시 NULL 값으로 변경 SET DEFAULT 참조하는 테이블 속성 데이터 삭제 시 기본값으로 변경 NO ACTION RESTRICT과 동일, 옵션을 지정하지 않았을 경우 자동 선택됨 RESTRICT 참조하는 테이블이 있을 경우, 데이터 삭제 불가 변경 시(ON UPDATE) CASCADE 참조하는 테이블의 속성 데이터 변경 시 따라 변경됨 SET NULL 참조하는 테이블 속성 데이터 변경 시 NULL 값으로 변경 SET DEFAULT 참조하는 테이블 속성 데이터 변경 시 기본값으로 변경 NO ACTION RESTRICT과 동일, 옵션을 지정하지 않았을 경우 자동 선택됨 RESTRICT 참조하는 테이블이 있을 경우, 데이터 변경 불가
CONSTRAINT 문(제약조건문)으로 속성에 조건을 설정할 수 있다. '생년월일'속성의 값 범위를 지정하기 위해 '생년월일 제약'인 제약조건을 만들어 CHECK(생년월일>='1980-01-01')을 사용하여 1980년 1월 1일부터의 값을 넣을 수 있게 된다. CONSTRAINT 문을 이용하여 외래키를 지정하는 방법도 있다.[9]
- FOREIGN절에 CONSTRAINT절 사용
CREATE TABLE 학생 (이름 VARCHAR(15) NOT NULL, 학번 CHAR(8) PRIMARY KEY, 전공 CHAR(5), 성별 GANDER, 생년월일 DATE, CONSTRAINT 생년월일제약 CHECK(생년월일>='1980-01-01'), CONSTRAINT 제약조건명 FOREIGN(전공) REFERENCES 학과(학과코드));
스키마 생성
스키마(schema)는 데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것을 말한다. 다시말해 속성, 개체, 관계에 대한 정의와 유지해야할 제약조건을 기술한것이다. 어떤 구조로 데이터가 저장되는 지를 나타내는 데이터베이스 구조를 스키마라고 칭한다.[10]
- 일반적 스키마 생성문
CREATE SCHEMA 스키마명;
스키마명을 지정하여 현재 연결된 데이터베이스에 새 스키마를 만든다. 스키마 이름은 임의의 이름을 지정할 수 있지만, 'pg_'로 시작하는 이름은 특별한 의미를 가지므로 사용할 수 없다. 스키마를 생성하려면 명령을 실행하는 역할이 슈퍼 유저이거나 스키마를 만들 데이터베이스에서 CREATE 권한을 가지고 있어야 한다. 스키마의 소유자를 지정하여 스키마를 만들 수 있는데 형식은 다음과 같다. 이 경우 소유자는 생성자의 직 ,간접적 구성원이거나 슈퍼 유저이어야 한다.[11]
- 스키마 소유자 지정
CREATE SCHEMA 스키마명 AUTHORIZATION 소유자_ID;
CREATE SCHEMA 대학교 AUTHORIZATION 박교수;
뷰 생성
뷰(view)는 쿼리의 결과를 가상 테이블로 만드는 것으로 SELECT 문을 사용하여 지정한 테이블의 속성을 뷰로 나타낼 수 있다. 사용자가 필요한 정보만 요구에 맞게 가공할 수 있기 때문에 편리성이 증가하며, 가상의 테이블을 만듦으로써 실제 테이블의 변경, 수정이 일어나지 않아 보안성이 증가된다는 장점이 있다.[12]
- 일반적 뷰 생성문
CREATE VIEW 뷰명(속성, 속성...) AS SELECT 속성, 속성 FROM 테이블명 WHERE 조건
- 뷰 생성문 예시
CREATE VIEW 인터넷 고객(성명, 전화번호) AS SELECT 성명, 전화번호 FROM 고객 WHERE 사용 서비스 = '인터넷'
예시를 보면 인터넷 서비스를 사용하는 고객의 성명과 전화번호가 담긴 뷰를 생성하는 것이다. 데이터 조작어(Data Manipulation Language, DML)인 SELECT 문을 사용하여 '고객'테이블의 사용 서비스가 '인터넷'인 고객의 '성명'과'전화번호'속성의 데이터를 뷰로 나타낼 수 있다.
인덱스 생성
테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해 사용하는 것이 인덱스(INDEX)이다. 테이블의 크기가 크면 클수록 탐색하는 시간이 많이 늘어나게 되는데 인덱스를 사용하여 테이블 전체를 읽지 않아도 검색과 질의에 대한 빠른 처리가 가능해진다. 테이블에 대한 인덱스를 생성하고 정렬시키는 것이 가능하다. 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하거나 조인(join)이 자주 사용되는 열에 생성하는 것이 좋다. 하지만 단일 테이블에 인덱스가 많아진다면 속도가 느려질 수 있고 데이터가 중복도가 많은 열에는 인덱스를 만들어도 효과가 없다.[13][14]
- 일반적 인덱스 생성문
CTEATE [UNIQUE][CLUSTERED|NUNCLUSTERED] INDEX 인덱스명 ON 테이블명(속성[ASC|DESC], 속성[ASC|DESC, ...)
- UNIQUE : 중복을 제거한다.
- CLUSTERED : 데이터가 자동으로 정렬되는 클러스터드 인덱스로 설정한다. 테이블당 하나만 생성이 가능하다.
- NUNCLUSTERED : 데이터가 정렬되지 않으나 데이터 위치에 대한 포인터가 정렬되는 넌 클러스터트 인덱스로 설정한다. 테이블당 여러 개 생성이 가능하다.
- ASC : 데이터를 오름차순으로 정렬한다. 생략이 가능하다.
- DESC : 데이터를 내림차순 정렬로 한다.
- 인덱스 생성문 예시
CREATE INDEX 출석_idx ON 학생(학생 번호);
출석을 쉽게 하기 위해 인덱스를 생성했다고 가정하면, 학생 테이블의 학생번호를 오름차순으로 하여 나타냄으로 인덱스를 설정할 수 있다.
도메인 생성
도메인(domain)은 하나의 속성이 가질 수 있는 동일한 타입의 원자값으로 속성의 데이터 범위 즉, 데이터 타입의 범위를 정의하는 것이다. 정의된 도메인은 일반적인 데이터 타입처럼 사용할 수 있다.[15]
- 일반적 도메인 생성문
CREATE DOMAIN 도메인명 데이터_타입 [DEFAULT 기본값] [CONSTRAINT 제약조건명 CHECK (범위 값)];
- 도메인 생성문 예시
CREATE DOMAIN GANDER CHAR(1)s DEFAULT '남' CONSTRAINT VALD-SEX CHECK (VALUE IN('남'.'여'));
'남','여'와 같이 정해진 1개의 문자로 표현되는 도메인'GANDER'를 정의하는 SQL 문을 작성할 때 위 예시처럼 나타내어진다. 기본 값을 '남'으로 지정하고 제약조건문을 통하여 '남', '여'로 데이터 값을 제한한다.
트리거 생성
트리거(Trigger)는 테이블에 대한 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때를 반응하여 자동으로 실행되는 작업이다. 즉, 사용자가 DML 문이 실행될 때마다 직접 호출하는 것이 아닌 데이터베이스에서 자동적으로 호출하는 것이 가장 큰 특징이다. 예로 다른 테이블의 삭제로 인하여 그 테이블의 데이터가 필요하게 되면 데이터가 없어 사용할 수 없게 되고, 테이블의 변경으로 이전 데이터의 필요 ㅅ시 잘못된 데이터를 가져올 수 있는 현상이 생기게 되어 데이터의 신뢰성을 떨어트리게 된다. 그것을 방지하기 위해 테이블에 대한 수정이나 삭제가 이루어질 때마다 번거로움은 물론 데이터의 구조도 망가질 가능성이 커지기 때문에 자동으로 변경, 저장해 주는 기능을 가진 트리거가 그 사용 용도이다.[16]
- 일반적 트리거 생성문
CREATE TRIGGER 트리거명 [동작시기 옵션][동작 옵션] ON 테이블명 REFERENCING [NEW | OLD] TABLE AS 테이블명 [FOR EACH ROW WHEN 조건식] 트리거 BODY;[17]
'동작 시기 옵션'에는 AFTER와 BEFORE가 사용되며 트리거가 실행될 때를 지정하게 된다. AFTER는 테이블의 변경이 실행된 후 트리거를 실행할 때 사용하고, BEFORE는 테이블의 변경 전에 트리거를 실행하고 싶으면 사용하면 된다. '동작 옵션'에는 INSERT(삽입), DELETE(삭제), UPDATE(갱신)이 있으며 트리거가 실행되게 할 작업의 종류를 지정할 수 있다. 테이블의 삭제에 관하여 트리거가 반응하도록 하려면 DELETE를 사용하면 된다. '테이블 선택 옵션'에는 트리거가 적용될 테이블의 상태의 종류를 지정한다. 예를 들어 삭제가 발생한 시점에서 전과 후로 테이블을 나뉘게 되어 사용된다. 삭제가 되기 전 테이블 참조 시 OLD를 사용하고, 삭제 후 테이블 참조 시에는 NEW를 사용하면 된다. 'FOR EACH ROW WHEN 조건식'의 사용은 조건식에 대해 행이 조건이 만족하게 될 때, 만족하는 여러 개의 행에 대해 트리거가 반복적으로 여러 번 수행하는 행 트리거가 된다. '트리거 BODY' 부분에는 트리거 발생시 수행할 SQL 문을 작성하면 된다.작성할 때는 BEGIN으로 문장을 시작하고 END로 끝나야 된다.[17]
- 트리거 생성문 예제
CREATE TRIGGER 학년정보_TR BEFORE INSERT ON 학생 REFERENCING NEW TABLE AS new_table FOR EACH ROW WHEN new_table.학년 = BEGIN SET new_table.학년 = '신입생' END;
사용법의 이해를 하기 위해선 예시를 보고 해석을 해보아야 한다. 첫 문장을 천천히 해석하면 '학생'테이블에 '삽입'이 일어나기 '전'에 학년정보_TR이 동작하게 설정되었다. 그 밑줄을 해석하면 새 테이블에 적용하며 테이블 이름은 'new_table'이 된다. FOR EACH ROW의 사용으로 조건문인 학년이 NULL 값이면 '신입생'을 치환하는 트리거가 된다.[17]
변경
데이터베이스에서 테이블의 속성을 추가, 삭제, 수정할 때 SQL 명령어인 ALTER를 사용한다. 관계의 구조를 수정하며 속성을 추가하거나, 속성을 삭제, 속성의 이름이 바꾸거나, 속성의 크기를 조정하거나, 데이터베이스에 있는 테이블의 속성 데이터 형식을 변경할 수 있다. 따라서 ALTER는 열이 나 특성에만 작동한다고 말할 수 있다. 새로운 속성을 추가할 때 기본적으로 모든 튜플의 해당 속성 값을 NULL로 초기화된다.[18]
- 일반적 테이블 속성 추가, 변경, 삭제문
ALTER TABLE 테이블명 ADD 속성명 데이터타입[DEFAULT '기본값']; ALTER TABLE 테이블명 ALTER 속성명 데이터타입[SET DEFAULT '기본값']; ALTER TABLE 테이블명 DROP COULUMN 속성명 [CASCADE];[19]
- 테이블 속성 추가, 변경, 삭제문 예시
ALTER TABLE 학생 ADD 학년 VARCHAR(3); ALTER TABLE 학생 ALTER 학번 VARCHAR(10) NOT NULL; ALTER TABLE 학생 DROP COLUMN 학년;
존재하는 '학생' 테이블에 '학년' 속성을 추가할 때 ADD를 사용하여 3자리까지 쓸 수 있는 속성을 추가하게 된다. 테이블에 있는 속성의 데이터 타입을 변경, 추가할 때 ALTER를 사용하여 '학번'속성의 최대 글자 수를 10자리로 늘려주고 NULL 값(빈 공란)을 사용할 수 없도록 추가해 준 것이다. 원래 있던 테이블의 속성을 삭제하려면 DROP을 사용하여 '학년'속성을 삭제할 수 있다. 이때 '학년'속성을 참조하고 있는 다른 테이블의 속성 값을 같이 삭제하려면 CASCADE를 뒤에 붙여줌으로써 연쇄삭제를 할 수 있다.
ALTER와 UPDATE
ALTER와 UPDATE 두 가지 모두 SQL에서 수정 명령을 맡고 있는데 ALTER는 데이터 정의어 UPDATE는 데이터 조작어라는 차이도 있지만 사용하는 데 있어 그 사용 범위가 다르다. ALTER는 테이블에 대한 변경이 이루어질 때 사용하는 것이고, UPDATE는 하나의 관계에 있는 하나 이상의 튜플(tuple)의 속성 값을 수정하는 것이다. 즉 ALTER보다는 세부적인 수정이 이루어질 때 사용한다.[18]
삭제
테이블, 스키마, 인덱스, 도메인, 제약조건, 뷰의 삭제를 할 때 DROP을 사용하여 삭제를 하게 된다.
- 일반적 삭제문
DROP SCHEMA 스키마명 [CASCADE | RESTRICTED]; DROP DOMAIN 도메인명 [CASCADE | RESTRICTED]; DROP TABLE 테이블명 [CASCADE | RESTRICTED]; DROP VIEW 뷰명 [CASCADE | RESTRICTED]; DROP INDEX 인덱스명 [CASCADE | RESTRICTED]; DROP CONSTRAINT 제약조건명;[19]
CASCADE는 제거할 요소가 참조하는 다른 모든 개체를 연쇄제거하게 된다. 주 테이블의 데이터 제거 시에 각 외래키와 관계를 맺고 있는 모든 데이터를 제거하는 참조 무결성(referential integrity) 제약 조건을 설정하기 위해 사용된다. RESTICTED는 다른 개체가 제거할 요소를 참조 중 일 때 제거를 취소하여 문제 발생을 줄여주게 된다.[19]
TRUNCATE와 DELETE
TRUNCATE는 테이블에서의 모든 행(속성)을 삭제하게 되는 데이터 정의 언어이다. DROP의 사용은 지정된 테이블이 모두 사라지지만 TRUNCATE의 사용은 테이블의 틀만 남기고 전부 삭제된다고 보면 된다. DELETE는 테이블의 지정된 데이터만을 삭제할 때 사용된다. DROP은 전체, TRUNCATE은 테이블만 남기고, DELETE 테이블의 내용 순으로 삭제범위로 나뉜다고 생각하면 된다. TRUNCATE는 무결성을 유지하는 메커니즘을 생략하여 빠르게 제거를 실현하지만 데이터의 무결성을 흩트리게 되어 사용에 유의해야 한다. DELETE의 사용은 WHERE 절을 사용한 정교한 삭제가 가능하고 삭제 후 다시 복귀가 가능하지만 여러 번 사용해야 되는 경우가 생기므로 트랜잭션 로그(transaction log) 공간을 더 사용하게 되는 경우가 있다.[20]
각주
- ↑ 〈데이터 정의어〉, 《네이버지식백과》
- ↑ 미니송, 〈데이터베이스 언어(DDL, DML, DCL) - DO의 IT〉, 《티스토리》, 2017-12-05
- ↑ pridiot, 〈(Oracle) 데이터 정의어 (DDL : Data Definition Language) - pridiot〉, 《티스토리》, 2019-09-29
- ↑ 〈CREATE (SQL)〉, 《위키백과》
- ↑ 〈SQL 데이터 정의 언어(DDL) – 1〉, 《helloblog.net》
- ↑ 6.0 6.1 6.2 IT 양햄찌(jhnyang), 〈(ORACLE, MYSQL, SQL) CREATE TABLE 테이블 생성하고 주키(기본키)지정하기, 테이블생성법, 제약조건 설정(NOT NULL)〉, 《티스토리》, 2020-07-19
- ↑ 1D1C, 〈2020 정보처리기사 필기 - 3.3 SQL 응용(1) 〉, 《티스토리》, 2020-03-02
- ↑ ehdtnn , 〈외래키, 외래키 옵션〉, 《티스토리》, 2021-08-12
- ↑ PRO HYEON, 〈(정보처리기사)실기 암기노트 데이터베이스 3장〉, 《깃허브》, 2018-06-28
- ↑ 〈(SQL) 스키마란 무엇인가?〉, 《티스토리》, 2020-11-03
- ↑ 〈스키마 생성(CREATE SCHEMA)〉, 《데브쿠마》, 2020-10-31
- ↑ solacci, 〈DataBase(뷰 개념, 생성, 삭제, 수정)(뷰 권한 오류)〉, 《티스토리》, 2018-11-12
- ↑ 〈INDEX 생성〉, 《TCP School》
- ↑ Kangjieun11, 〈(MySQL) 인덱스(index), 클러스터/보조인덱스〉, 《티스토리》, 2021-05-25
- ↑ gillog, 〈(DB)Domain, Data Dictionary〉, 《티스토리》, 2020-10-28
- ↑ 뵙뵙, 〈트리거(TRIGGER) 란 무엇인가? 실습을 통한 기초 이해하기〉, 《티스토리》, 2020-07-28
- ↑ 17.0 17.1 17.2 모든기록, 〈데이터베이스 DDL〉, 《티스토리》
- ↑ 18.0 18.1 〈SQL에서 ALTER 및 UPDATE 명령의 차이점〉, 《Gadget-info.com》
- ↑ 19.0 19.1 19.2 딱지의겨울, 〈(정보처리기사 실기) 8장 요약 키워드 정리 _ SQL 응용〉, 《티스토리》, 2021-04-16
- ↑ 〈TRUNCATE (SQL)〉, 《위키백과》
참고자료
- 〈데이터 정의어〉, 《네이버지식백과》
- 미니송, 〈데이터베이스 언어(DDL, DML, DCL) - DO의 IT〉, 《티스토리》, 2017-12-05
- pridiot, 〈(Oracle) 데이터 정의어 (DDL : Data Definition Language) - pridiot〉, 《티스토리》, 2019-09-29
- 〈CREATE (SQL)〉, 《위키백과》
- 〈SQL 데이터 정의 언어(DDL) – 1〉, 《helloblog.net》
- IT 양햄찌(jhnyang), 〈(ORACLE, MYSQL, SQL) CREATE TABLE 테이블 생성하고 주키(기본키)지정하기, 테이블생성법, 제약조건 설정(NOT NULL)〉, 《티스토리》, 2020-07-19
- 1D1C, 〈2020 정보처리기사 필기 - 3.3 SQL 응용(1) 〉, 《티스토리》, 2020-03-02
- ehdtnn , 〈외래키, 외래키 옵션〉, 《티스토리》, 2021-08-12
- PRO HYEON, 〈(정보처리기사)실기 암기노트 데이터베이스 3장〉, 《깃허브》, 2018-06-28
- 〈(SQL) 스키마란 무엇인가?〉, 《티스토리》, 2020-11-03
- 〈스키마 생성(CREATE SCHEMA)〉, 《데브쿠마》, 2020-10-31
- solacci, 〈DataBase(뷰 개념, 생성, 삭제, 수정)(뷰 권한 오류)〉, 《티스토리》, 2018-11-12
- 〈INDEX 생성〉, 《TCP School》
- Kangjieun11, 〈(MySQL) 인덱스(index), 클러스터/보조인덱스〉, 《티스토리》, 2021-05-25
- gillog, 〈(DB)Domain, Data Dictionary〉, 《티스토리》, 2020-10-28
- 뵙뵙, 〈트리거(TRIGGER) 란 무엇인가? 실습을 통한 기초 이해하기〉, 《티스토리》, 2020-07-28
- 모든기록, 〈데이터베이스 DDL〉, 《티스토리》
- 〈SQL에서 ALTER 및 UPDATE 명령의 차이점〉, 《Gadget-info.com》
- 딱지의겨울, 〈(정보처리기사 실기) 8장 요약 키워드 정리 _ SQL 응용〉, 《티스토리》, 2021-04-16
- 〈TRUNCATE (SQL)〉, 《위키백과》
같이 보기