제2절_DDL(DATA_DEFINITION_LANGUAGE)
2012.03.09 14:32
1. 데이터 유형
- 숫자 타입
ANSI/ISO 기준 : NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE PRECISION
SQL Server와 Sybase : 작은 정수형, 정수형, 큰 정수형, 실수형 등 + MONEY, SMALLMONEY
Oracle : 숫자형 타입에 대해서 NUMBER 한 가지 숫자 타입의 데이터 유형만 지원
- 벤더에서 ANSI/ISO 표준을 사용할 때는 기능을 중심으로 구현하므로, 일반적으로 표준과 다른 용어를 사용하는 것이 허용
(ex: NUMERIC → NUMBER, WINDOW FUNCTION → ANALYTIC/RANK FUNCTION)
- 테이블의 칼럼이 가지고 있는 대표적인 4가지 데이터 유형
기타 유형 : ANSI/ISO에서 Binary String Type, Binary Large Object String Type, National Character String Type, Boolean Type 등
- 문자열 유형 : CHAR 유형과 VARCHAR 유형의 차이
VARCHAR 유형 : 가변 길이, CHAR 유형 : 고정길이
비교 방법의 차이 :
CHAR에서는 문자열을 비교할 때 공백(BLANK)을 채워서 비교
VARCHAR 유형에서는 맨 처음부터 한 문자씩 비교하고 공백도 하나의 문자로 취급
예) CHAR 유형'AA' = 'AA ' 예) VARCHAR 유형 'AA' ≠ 'AA '
(실험)
2. CREATE TABLE
가. 테이블과 칼럼 정의 : 후보키중에 하나를 선정하여 기본키 칼럼으로 지정
(예) 선수 테이블
(예) 부서와 사원 테이블
나. CREATE TABLE
CREATE TABLE 테이블이름 ( 칼럼명1 DATATYPE DEFAULT 형식, 칼럼명2 DATATYPE DEFAULT 형식,
칼럼명3 DATATYPE DEFAULT 형식 ) ;
다음은 테이블 생성 시에 주의해야 할 몇 가지 규칙이다.
- 테이블명 : 객체를 의미할 수 있는 적절한 이름을 사용
- 벤더에서 사전에 정의한 예약어(Reserved word)는 쓸 수 없다. - A-Z, a-z, 0-9, _, $, # 문자만 허용된다.
- 테이블명이 잘못된 사례
(예) 선수 테이블 생성
Oracle |
SQL Server |
CREATE TABLE PLAYER ( PLAYER_ID CHAR(7) NOT NULL, PLAYER_NAME VARCHAR2(20) NOT NULL, TEAM_ID CHAR(3) NOT NULL, E_PLAYER_NAME VARCHAR2(40), NICKNAME VARCHAR2(30), JOIN_YYYY CHAR(4), POSITION VARCHAR2(10), BACK_NO NUMBER(2), NATION VARCHAR2(20), BIRTH_DATE DATE, SOLAR CHAR(1), HEIGHT NUMBER(3), WEIGHT NUMBER(3), CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID), CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID) ); |
CREATE TABLE PLAYER ( PLAYER_ID CHAR(7) NOT NULL, PLAYER_NAME VARCHAR(20) NOT NULL, TEAM_ID CHAR(3) NOT NULL, E_PLAYER_NAME VARCHAR(40), NICKNAME VARCHAR(30), JOIN_YYYY CHAR(4), POSITION VARCHAR(10), BACK_NO TINYINT, NATION VARCHAR(20), BIRTH_DATE DATE, SOLAR CHAR(1), HEIGHT SMALLINT, WEIGHT SMALLINT, CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID), CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID) ); |
테이블 생성 예제에서 추가적인 주의 사항 몇 가지
- 테이블 생성시 대/소문자 구분은 하지 않는다. 기본적으로 테이블이나 칼럼명은 대문자로 만들어진다.
- DATETIME 데이터 유형에는 별도로 크기를 지정하지 않는다.
- 문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시해야 한다.
- 칼럼과 칼럼의 구분은 콤마로 하되, 마지막 칼럼은 콤마를 찍지 않는다.
- 칼럼에 대한 제약조건이 있으면 CONSTRAINT를 이용하여 추가할 수 있다.
다. 제약조건(CONSTRAINT)
제약조건(CONSTRAINT) : 데이터의 무결성을 유지하기 위한 데이터베이스의 보편적인 방법
조건에 맞는 데이터가 없을 때의 공집합과도 다르다.
‘NULL’은 ‘아직 정의되지 않은 미지의 값’이거나 ‘현재 데이터를 입력하지 못하는 경우’를 의미
- DEFAULT 의미
데이터 입력 시에 칼럼의 값이 지정되어 있지 않을 경우 기본값(DEFAULT)
예제 팀 테이블
테이블명 : TEAM
테이블 설명 : K-리그 선수들의 소속팀에 대한 정보를 가지고 있는 테이블
칼럼명 : =>
제약조건 : 기본 키(PRIMARY KEY) → TEAM_ID (제약조건명은 TEAM_ID_PK)
NOT NULL → REGION_NAME, TEAM_NAME, STADIUM_ID (제약조건명은 미적용)
Oracle |
SQL Server |
CREATE TABLE TEAM ( TEAM_ID CHAR(3) NOT NULL, REGION_NAME VARCHAR2(8) NOT NULL, TEAM_NAME VARCHAR2(40) NOT NULL, E_TEAM_NAME VARCHAR2(50), ORIG_YYYY CHAR(4), STADIUM_ID CHAR(3) NOT NULL, ZIP_CODE1 CHAR(3), ZIP_CODE2 CHAR(3), ADDRESS VARCHAR2(80), DDD VARCHAR2(3), TEL VARCHAR2(10), FAX VARCHAR2(10), HOMEPAGE VARCHAR2(50), OWNER VARCHAR2(10), CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID), CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID) ); |
CREATE TABLE TEAM ( TEAM_ID CHAR(3) NOT NULL, REGION_NAME VARCHAR(8) NOT NULL, TEAM_NAME VARCHAR(40) NOT NULL, E_TEAM_NAME VARCHAR(50), ORIG_YYYY CHAR(4), STADIUM_ID CHAR(3) NOT NULL, ZIP_CODE1 CHAR(3), ZIP_CODE2 CHAR(3), ADDRESS VARCHAR(80), DDD VARCHAR(3), TEL VARCHAR(10), FAX VARCHAR(10), HOMEPAGE VARCHAR(50), OWNER VARCHAR(10), CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID), CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID) ); |
라. 생성된 테이블 구조 확인
예제 선수(PLAYER) 테이블의 구조를 확인한다.
실행 결과 SQL Server
exec sp_help 'dbo.PLAYER' go
마. SELECT 문장을 통한 테이블 생성 사례
SELECT 문장을 활용해서 테이블을 생성할 수 있는 방법(CTAS: Create Table ~ As Select ~)
CTAS 기법 사용시 주의할 점 :
기존 테이블의 제약조건 중에 NOT NULL만 새로운 복제 테이블에 적용이 되고,
기본키, 고유키, 외래키, CHECK 등의 다른 제약 조건은 없어진다는 점이다.
제약 조건을 추가하기 위해서는 뒤에 나오는 ALTER TABLE 기능을 사용해야 한다.
SQL Server에서는 Select ~ Into ~ 를 활용하여 위와 같은 결과를 얻을 수 있다.
단, 칼럼 속성에 Identity를 사용했다면 Identity 속성까지 같이 적용이 된다.
예제 선수(PLAYER) 테이블과 같은 내용으로 TEAM_TEMP라는 복사 테이블을 만들어 본다.
예제 SQL Server
SELECT * INTO TEAM_TEMP FROM TEAM; (1개 행이 영향을 받음)
3. ALTER TABLE
가. ADD COLUMN :
주의 : 새롭게 추가된 칼럼은 테이블의 마지막 칼럼이 되며 칼럼의 위치를 지정할 수는 없다.
예제 PLAYER 테이블에 ADDRESS(데이터 유형은 가변 문자로 자릿수 80자리로 설정한다.) 칼럼을 추가한다.
예제 SQL Server
ALTER TABLE PLAYER ADD ADDRESS VARCHAR(80);
나. DROP COLUMN
예제 앞에서 PLAYER 테이블에 새롭게 추가한 ADDRESS 칼럼을 삭제한다.
다. MODIFY COLUMN
ALTER TABLE 명령을 이용해 칼럼의 데이터 유형, 디폴트(DEFAULT) 값, NOT NULL 제약조건에 대한 변경을 포함
SQL Server ALTER TABLE 테이블명 ALTER (칼럼명1 데이터 유형 DEFAULT 식 NOT NULL, 칼럼명2 데이터 유형 …);
칼럼을 변경할 때는 몇 가지 사항을 고려해서 변경해야 한다.
- 해당 칼럼의 크기를 늘릴 수는 있지만 줄이지는 못한다. 이는 기존의 데이터가 훼손될 수 있기 때문이다.
- 해당 칼럼이 NULL 값만 가지고 있거나 테이블에 아무 행도 없으면 칼럼의 폭을 줄일 수 있다.
- 해당 칼럼이 NULL 값만을 가지고 있으면 데이터 유형을 변경할 수 있다.
- 해당 칼럼의 DEFAULT 값을 바꾸면 변경 작업 이후 발생하는 행 삽입에만 영향을 미치게 된다.
- 해당 칼럼에 NULL 값이 없을 경우에만 NOT NULL 제약조건을 추가할 수 있다.
예제 TEAM 테이블의 ORIG_YYYY 칼럼의 데이터 유형을 CHAR(4)→VARCHAR2(8)으로 변경하고, 향후 입력되는 데이터의 DEFAULT 값으로 '20020129'을 적용하고, 모든 행의 ORIG_YYYY 칼럼에 NULL이 없으므로 제약조건을 NULL → NOT NULL로 변경한다.
ALTER TABLE 테이블명 RENAME COLUMN 변경해야 할 칼럼명 TO 새로운 칼럼명;
=> RENAME COLUMN으로 칼럼명이 변경되면, 해당 칼럼과 관계된 제약조건에 대해서도 자동으로 변경되는 장점이 있지만, ADD/DROP COLUMN 기능처럼 ANSI/ISO에 명시되어 있는 기능이 아니고 Oracle 등 일부 DBMS에서만 지원하는 기능이다.
sp_rename 변경해야 할 칼럼명, 새로운 칼럼명, 'COLUMN';
sp_rename 'dbo.TEAM_TEMP.TEAM_ID', 'TEAM_TEMP_ID', 'COLUMN';
주의: 엔터티 이름 부분을 변경하면 스크립트 및 저장 프로시저를 손상시킬 수 있다.
라. DROP CONSTRAINT
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
예제 PLAYER 테이블의 외래키 제약조건을 삭제한다.
예제 SQL Server
ALTER TABLE PLAYER DROP CONSTRAINT PLAYER_FK; 명령이 완료되었다.
마. ADD CONSTRAINT
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);
예제 PLAYER 테이블에 TEAM 테이블과의 외래키 제약조건을 추가한다.
제약조건명은 PLAYER_FK로 하고, PLAYER 테이블의 TEAM_ID 칼럼이 TEAM 테이블의 TEAM_ID를 참조하는 조건이다.
예제 PLAYER 테이블이 참조하는 TEAM 테이블을 제거해본다.
예제 PLAYER 테이블이 참조하는 TEAM 테이블의 데이터를 삭제해본다.
위와 같이 참조 제약조건을 추가하면 PLAYER 테이블의 TEAM_ID 칼럼이 TEAM 테이블의 TEAM_ID 칼럼을 참조하게 된다. 참조 무결성 옵션에 따라서 만약 TEAM 테이블이나 TEAM 테이블의 데이터를 삭제하려 할 경우 외부(PLAYER 테이블)에서 참조되고 있기 때문에 삭제가 불가능하게 제약을 할 수 있다. 즉, 외부키(FK)를 설정함으로써 실수에 의한 테이블 삭제나 필요한 데이터의 의도하지 않은 삭제와 같은 불상사를 방지하는 효과를 볼 수 있다.
4. RENAME TABLE
SQL Server에서는 sp_rename을 이용하여 테이블 이름을 변경할 수 있다.
예제 RENAME 문장을 이용하여 TEAM 테이블명을 다른 이름으로 변경하고, 다시 TEAM 테이블로 변경한다.
5. DROP TABLE
DROP TABLE 테이블명 CASCADE CONSTRAINT;
CASCADE CONSTRAINT 옵션은 해당 테이블과 관계가 있었던 참조되는 제약조건에 대해서도 삭제한다는 것을 의미한다.
SQL Server에서는 CASCADE 옵션이 존재하지 않으며 테이블을 삭제하기 전에 참조하는 FOREIGN KEY 제약 조건 또는 참조하는 테이블을 먼저 삭제해야 한다.
예제 PLAYER 테이블을 제거한다.
6. TRUNCATE TABLE
TRUNCATE TABLE PLAYER;
TRUNCATE TABLE은 테이블 자체가 삭제되는 것이 아니고, 해당 테이블에 들어있던 모든 행들이 제거되고 저장 공간을 재사용 가능하도록 해제한다. 테이블 구조를 완전히 삭제하기 위해서는 DROP TABLE을 실행하면 된다.
예제 TRUNCATE TABLE을 사용하여 해당 테이블의 모든 행을 삭제하고 테이블 구조를 확인한다.
예제 DROP TABLE을 사용하여 해당 테이블을 제거하고 테이블 구조를 확인한다.
예제 SQL Server
DROP TABLE TEAM; 명령이 완료되었다.
exec sp_help 'dbo.TEAM'; 메시지 15009, 수준 16, 상태 1, 프로시저 sp_help, 줄 66 데이터베이스 'northwind'에 엔터티 'dbo.TEAM'이(가) 없거나 이 작업에 적합하지 않다.
TRUNCATE는 데이터 구조의 변경 없이 테이블의 데이터를 일괄 삭제하는 명령어로 DML로 분류할 수도 있지만 내부 처리 방식이나 Auto Commit 특성 등으로 인해 DDL로 분류하였다.
테이블에 있는 데이터를 삭제하는 명령어는 TRUNCATE TABLE 명령어 이외에도 다음 DML 절에서 살펴볼 DELETE 명령어가 있다. 그러나 DELETE와 TRUNCATE는 처리하는 방식 자체가 다르다.
테이블의 전체 데이터를 삭제하는 경우, 시스템 활용 측면에서는 DELETE TABLE 보다는 시스템 부하가 적은 TRUNCATE TABLE을 권고한다. 단, TRUNCATE TABLE의 경우 정상적인 복구가 불가능하므로 주의해야 한다.
- SQL 전문가 자격증 (bysql.net 2012년 1차 스터디)
- 작성자: 박우창
- 최초작성일: 2012년 03월 09 일
- 본문서는 bysql.net 스터디 결과입니다 .본 문서를 인용하실때는 출처를 밝혀주세요. http://www.bysql.net
- 문서의 잘못된 점이나 질문사항은 본 문서에 댓글로 남겨주세요. ^^
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
18 | 제5절_WHERE_절 | 보라빛고양이 | 2012.03.10 | 14892 |
17 | 제4절_TCL(TRANSACTION_CONTROL_LANGUAGE) | 보라빛고양이 | 2012.03.10 | 8185 |
16 | 제3절_DML(DATA_MANIPULATION_LANGUAGE) | balto | 2012.03.09 | 6863 |
» | 제2절_DDL(DATA_DEFINITION_LANGUAGE) [1] | balto | 2012.03.09 | 11745 |
14 | 제1절_관계형_데이터베이스_개요 | balto | 2012.03.09 | 10458 |
13 | 제5절_데이터베이스_구조와_성능 | 오예스 | 2012.03.07 | 6108 |
12 | 제4절_대량_데이터에_따른_성능 | 오예스 | 2012.03.07 | 7106 |
11 | 제3절_반정규화와_성능 | ljw | 2012.03.04 | 15303 |
10 | 제2절_정규화와_성능 | ljw | 2012.03.04 | 10403 |
9 | 제1절_성능_데이터_모델링의_개요 | ljw | 2012.03.04 | 44552 |
8 | 제4절_관계(Relationship) [1] | 실천하자 | 2012.03.04 | 13044 |
7 | 제3절_속성(Attribute) | 실천하자 | 2012.03.04 | 7279 |
6 | 제2절_엔터티(Entity) | 실천하자 | 2012.03.04 | 9734 |
5 | 제1절_데이터_모델의_이해 | 실천하자 | 2012.03.03 | 22613 |
4 | 제5절_식별자 | ljw | 2012.03.03 | 18966 |
3 | Front Page | 운영자 | 2012.02.20 | 186713 |
2 | 제3절_조인_수행_원리 | 실천하자 | 2012.04.11 | 6977 |
1 | 제3절_조인_기본_원리 | 보라빛고양이 | 2012.05.30 | 3858 |
칼럼의 default 제거를 modify 로는 삭제가 안되네요.
null로 업데이트는 할 수 있어도 삭제는 불가능하다는 군요.;;;;;;;;;