본문 바로가기

Database

[SQL] DDL - CREATE/ ALTER/ DROP

DDL(DATA DEFINITION LANGUAGE): 데이터 정의 언어

오라클에서 제공하는 객체(OBJECT)를
새로 만들고(CREATE) 구조를 변경하고 (ALTER) 구조자체를 삭제하는(DROP) 명령문

CREATE, ALTER, DROP!

객체의 값이 아닌,
구조자체를 정의하는 언어로 주로 DB관리자, 설계자가 사용

오라클에서의 객체(구조):
테이블(TALBE) , 뷰 (VIEW), 시퀀스(SEQUENCE), 인덱스, 패키지, 트리거, 프로시져, 함수, 동의어, 사용자 등..

 CREATE 

1. CREATE TABLE

테이블이란? : 행, 열로 구성되는 가장 기본적인 데이터베이스 객체 ( 자바의 클래스)
모든 데이터는 테이블을 통하여 저장됨 (데이터를 보관하고자 한다면 테이블을만들어야 함)
CREATE TABLE 테이블명 (
컬럼명 자료형,
컬럼명 자료형,
컬럼명 자료형
....
);

 

2. 오라클의 데이터타입 (자료형)

 CHAR(바이트수)  -고정길이 문자  (아무리 적은 값이 들어와도 공백으로 채워서 처음 할당된 크기 유지)
 - 최대 2000byte / 디폴트 값은 1byte
 - 주로 들어올 값의 글자수가 정해져있는 경우 사용 
   (예: 성별: 남 / 여, M/F)
 - 숫자, 영문자, 특수문자 => 1글자당 1BYTE
   한글 => 1글자당 3BYTE
 VARCHAR2(바이트수)  - 가변길이 문자 (지정 바이트보다 적은 값이 들어오면 그 값에 맞춰서 크기가 줄어듦)
 - 최대 4000BYTE / 디폴트 값은 1byte 
 LONG   최대 2GB 크기의 가변길이 문자형 
NUMBER - 가변숫자
- 최대 22BYTE

- 값의 범위 : 1.0e - 130 ~ 9.99999..9e125 -- 10^-130~ 10^126

- 정밀도 : 전체 자리수(1~38)
- 스케일 : 소숫점이하의 자리수   (생략시 DEFALUT 0, 스케일 음수시 정수부분 반올림)
FLOAT  - NUMBER의 하위타입 
DATE 연, 월, 일, 시, 분, 초 까지 입력 가능

'+', '-' 연산의 대상
* SYSDATE : 시스템이 제공하는 현 날짜정보를 제공하는 함수


< ALTER >

객체 구조를 수정하는 구문
수정내용: 
  [1] 컬럼 추가, 수정, 삭제
  [2] 제약조건 추가OR 삭제(제약조건 수정은 불가함, 삭제 후 새롭게 추가해야함),
  [3] 테이블명/컬럼명/제약조건명 수정

  [1] 컬럼 추가, 수정, 삭제

 ALTER TABLE  테이블명 수정할내용;
 
1)컬럼 추가 (ADD)
    ALTER TABLE 테이블명 ADD 추가할컬럼명 데이터타입 [DEFAULT] (생략가능)
    
2) 컬럼수정 (MODIFY) 
  - 데이터타입 수정 : 
    ALTER TABLE 테이블명 MODIFY 수정할컬럼명 바꾸고자하는 데이터타입; 
  - DEFAULT값 수정 : 
	ALTER TABLE 테이블명 MODIFY 수정할컬럼명  DEFAULT 바꾸고자하는 기본값;

3)컬럼삭제 
    ALTER TABLE 테이블명 DROP COLUMN 삭제하고자 하는 컬럼명;
SELECT * FROM DEPT_COPY;
--CNAME컬럼 추가

ALTER TABLE DEPT_COPY ADD CNAME VARCHAR2(20);
-- 새로 컬럼이 만들어지고 기본값 NULL로 채워짐
-- DEPT ID컬럼의 데이터타입을 CHAR(3)으로 변경 
ALTER TABLE DEPT_COPY MODIFY DEPT_ID CHAR(3);
--현재 변경하고자하는 컬럼에 이미 담겨있는 값과 완전히 다른타입으로는 변경불가
-- (문자 -> 숫자 불가, 문자열 사이즈 축소(x) :큰값을 작은값에 넣을 수 없어서, 문자열사이즈 확대 O) 

ALTER TABLE DEPT_COPY MODIFY DEPT_ID NUMBER; 
----column to be modified must be empty to change datatype 오류!
ALTER TABLE DEPT_COPY MODIFY DEPT_TITLE VARCHAR2(10); 
---cannot decrease column length because some value is too big 오류!

-- DEPT_TITLE컬럼의 데이터타입을 VARCHAR2(40)로, 
-- LOCATION_ID컬럼의 데이터타입을 VARCHAR2(4)로,
--LNAME 컬럼의 기본값을 미국으로 변경


ALTER TABLE DEPT_COPY MODIFY DEPT_TITLE VARCHAR2(40);
ALTER TABLE DEPT_COPY MODIFY LOCATION_ID VARCHAR2(4);
ALTER TABLE DEPT_COPY MODIFY LNAME DEFAULT '미국';

ALTER TABLE DEPT_COPY
MODIFY DEPT_TITLE VARCHAR2(40)
MODIFY LOCATION_ID VARCHAR2(4)
MODIFY LNAME DEFAULT '미국';

 

 * ALTER 테이블을 이용해 값을 바꿔도 실제 테이블 내 값(기존 값)은 바뀌지 않는다. 구조만 바뀔뿐!
CREATE TABLE DEPT_COPY3
AS SELECT * FROM DEPT_COPY;

ALTER TABLE DEPT_COPY3 DROP COLUMN DEPT_ID;
ROLLBACK;   * DDL 구문은 복구가 불가능하다
ALTER TABLE DEPT_COPY3 DROP COLUMN DEPT_ID;
ALTER TABLE DEPT_COPY3 DROP COLUMN DEPT_TITLE;
ALTER TABLE DEPT_COPY3 DROP COLUMN CNAME;
ALTER TABLE DEPT_COPY3 DROP COLUMN LNAME;

* 마지막 컬럼 삭제시도시 오류발생!: cannot drop all columns in a table
 테이블에 최소 한개의 컬럼은 남아있어야 한다!


[2] 제약조건 추가OR 삭제

<제약조건 추가>
NOT NULL : ALTER TABLE 테이블명 MODIFY 컬럼명 NOT NULL;
UNIQUE:  ALTER TABLE 테이블명 ADD UNIQUE (ZJFFJAAUD)
CHECK: ALTER TABLE 테이블명 ADD CHECK (컬럼명)
PRIMARY KEY: ALTER TABLE 테이블명 ADD PRIMARY KEY(컬럼명)
FOREIGN KEY: ALTER TABLE 테이블명 ADD FOREIGN KEY(컬럼명) REFERENCES 참조테이블명(컬럼명

<제약조건 삭제>
PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK: ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명
NOT NULL : ALTER TABLE 테이블명 MODIFY 컬럼명 NULL 
   (NULL제약조건은 DROP 대신 NULL로 수정해야함)

 

<제약조건 추가>
ALTER TABLE DEPT_COPY
ADD CONSTRAINT DCOPY_PK PRIMARY KEY(DEPT_ID)
ADD CONSTRAINT DCOPY_DQ UNIQUE (DEPT_TITLE)
MODIFY LNAME CONSTRAINT DCOPY_NN NOT NULL;


<제약조건 삭제>
---DCOPY_PK 제약조건 지우기

ALTER TABLE DEPT_COPY DROP CONSTRAINT DCOPY_PK; -- 해당 제약조건명가진 친구가 날라감
ALTER TABLE DEPT_COPY MODIFY LNAME NULL; -- NULL제약조건은 DROP 대신 NULL로 수정해야함

 [3] 테이블명/컬럼명/제약조건명 수정(RENAME)

 

--- 컬럼명, 제약조건명, 테이블명 변경 (RENAME)
-- 3-1 컬럼명 변경: RENAME COLUMN 기존컬럼명 TO 바꿀컬럼명
ALTER TABLE DEPT_COPY RENAME COLUMN DEPT_TITLE TO DEPT_NAME; 

SELECT * FROM DEPT_COPY;
-- 3-2 제약조건명 변경: RENAME CONSTRAINT 기존제약조건명 TO 바꿀제약조건명
ALTER TABLE DEPT_COPY RENAME CONSTRAINT SYS_C0010798 TO DCOPY_98;

--3-3 테이블명 변경 RENAME TO 바꿀테이블명
ALTER TABLE DEPT_COPY RENAME TO DEPT_TEST;

< DROP>

객체를 삭제하는 구문
참조되는 자식객체를 가진 부모테이블은 삭제가 불가함
==> FOREIGN KEY로 참조되는 부모테이블을 지우려면,
      자식테이블을 먼저 삭제해야 부모테이블 삭제가능
-- 방법1: 자식, 부모테이블 순차삭제
DROP TABLE 자식테이블;
DROP TABLE 부모테이블;

-- 방법2: 부모테이블만 삭제하되 맞물려있는 제약조건도 함께 삭제
DROP TABLE 부모테이블 CASCADE CONSTRAINT;



'Database' 카테고리의 다른 글

[SQL] TCL(COMMIT, ROLLBACK, SAVEPOINT)  (1) 2022.10.05
[SQL] DCL - GRANT, REVOKE  (1) 2022.10.05
[SQL] DML - INSERT/ UPDATE /DELETE  (0) 2022.10.04
[SQL] 제약조건 (CONSTRAINTS)  (0) 2022.10.04
[SQL] 서브쿼리 (SUBQUERY)  (0) 2022.10.04