쌓고 쌓다

[Oracle] 테이블 생성 및 조작(CREATE, ALTER, DROP TABLE) 본문

프로그래밍/SQL

[Oracle] 테이블 생성 및 조작(CREATE, ALTER, DROP TABLE)

승민아 2022. 11. 27. 17:21

테이블 생성

CREATE TABLE table_name
(
 column datatype [DEFAULT expression] [column_constraint_claues]
 [, ...]
);
  • table_name : 생성될 테이블 이름
  • column : 생성될 칼럼 이름
  • datatype : 칼럼에 대한 데이터 타입과 길이
  • DEFAULT expression : 데이터 입력 시 값이 생략된 경우에 입력되는 기본 값
  • column_constraint_clause : 칼럼에 대해 정의되는 무결성 제약조건 ( NOT NULL, UNIQUE 등등.. )

 

EX) 주소룩 테이블 생성

CREATE TABLE address
(id NUMBER(3),
 name VARCHAR2(50),
 addr VARCHAR2(100),
 phone VARCHAR2(30),
 email VARCHAR2(100)
);

 

DEFAULT 옵션(기본값)

칼럼의 입력 값이 생략된 경우 NULL 대신 기본값이 들어간다.

기본값으로 리터럴값, 표현식, SQL함수, SYSDATE, USER를 사용한다.

칼럼이나 의사칼럼(NEXTVAL< CURRVAL)은 불가능함.

addr VARCHAR2(100) DEFAULT 'KOREA'

 

EX)

CREATE TABLE example_table
(
 name VARCHAR2(10),
 addr VARCHAR2(100) DEFAULT 'KOREA'
);

INSERT INTO example_table(name)
VALUES ('테스트');

 

테이블 생성 확인

DESC [테이블이름];

테이블의 생성 여부, 구조, 칼럼 이름, 데이터 타입과 크기, NOT NULL 무결성 제약조건 확인 가능하다.

 

EX)

DESC example_table;

-개인 예제-

더보기
CREATE TABLE lecture
(
 lec_no NUMBER(2),
 name VARCHAR2(20) NOT NULL,
 nickname VARCHAR2(20) UNIQUE,
 major VARCHAR2(20),
 address VARCHAR2(500),
 PRIMARY KEY (lec_no)
);

COMMENT ON COLUMN lecture.lec_no IS '강사번호';
COMMENT ON COLUMN lecture.name IS '강사이름';
COMMENT ON COLUMN lecture.nickname IS '강사닉네임';
COMMENT ON COLUMN lecture.major IS '전공';
COMMENT ON COLUMN lecture.address IS '주소';

CREATE TABLE class_schedule
(
 schedule_no NUMBER(2),
 lec_no NUMBER(2),
 name VARCHAR2(50) NOT NULL,
 sdate DATE NOT NULL,
 edate DATE NOT NULL,
 loc VARCHAR2(50),
 total_time NUMBER(3),
 reg_cnt NUMBER(3),
 application_edate DATE NOT NULL,
 PRIMARY KEY (schedule_no),
 FOREIGN KEY (lec_no) REFERENCES lecture(lec_no)
);

COMMENT ON COLUMN class_schedule.schedule_no IS '교육일정번호';
COMMENT ON COLUMN class_schedule.lec_no IS '교육강사번호(외래키)';
COMMENT ON COLUMN class_schedule.name IS '교육명';
COMMENT ON COLUMN class_schedule.sdate IS '교육시작일';
COMMENT ON COLUMN class_schedule.edate IS '교육마감일';
COMMENT ON COLUMN class_schedule.loc IS '교육장소';
COMMENT ON COLUMN class_schedule.total_time IS '총교육시간';
COMMENT ON COLUMN class_schedule.reg_cnt IS '교육수강정원';
COMMENT ON COLUMN class_schedule.application_edate IS '교육신청마감일';

 

서브쿼리를 이용한 테이블 생성

테이블의 복사 생성이 가능하다.

  • CREATE TABLE 명령문에서 서브 쿼리를 이용해 다른 테이블의 구조와 데이터를 복사 가능.
  • CREATE TABLE 명령문에서 지정한 칼럼의 수와 데이터 타입이 일치해야 함.
  • 칼럼 이름을 명시하지 않을 경우, 서브 쿼리 칼럼 이름과 동일
  • 무결성 제약조건은 NOT NULL 조건만 복사된다.
    • 기본키, 참조 키와 같은 제약조건은 재정의 해야 함.
    • default 옵션에서 정의한 값은 복사된다.
CREATE TABLE table_name
    [column [, column2, ...]]
AS subquery;

 

EX)

-- 주소록 테이블의 구조와 데이터를 복사하여 addr_second 테이블을 생성
CREATE TABLE addr_second(id, name, phone, email)
AS SELECT * FROM address;

CREATE TABLE addr_second
AS SELECT * FROM address;

-- 주소록 테이블에서 id, name 칼럼만 복사하여 addr_third 테이블을 생성
CREATE TABLE addr_third
AS SELECT id, name FROM address;

 

테이블 구조 복사

테이블 생성 시에 데이터는 복사하지 않고 구조만 복사한다.

서브 쿼리의 WHERE 조건절에 거짓이 되는 조건을 설정하여 출력 결과 집합이 없도록 한다.

CREATE TABLE table_name
AS SELECT * FROM source_table WHERE condition;

condition : 거짓이 되는 조건을 설정하자. (EX, WHERE 1=2)

 

EX)

-- 주소록 테이블에서 id, name 칼럼 구조만 복사하여 addr_fourth 테이블을 생성 (데이터는 X)
CREATE TABLE addr_fourth
AS SELECT * FROM address WHERE 1=2;

 

테이블 구조 변경

ALTER TABLE 명령문을 쓴다.

칼럼 추가, 삭제, 타입이나 길이의 변경 작업을 한다.

 

테이블 칼럼 추가

ALTER TABLE table_name
ADD (column datatype [DEFAULT expression]
     [, column datatype] ... );
  • ALTER TABLE ... ADD 구조이다.
  • 추가된 칼럼은 테이블의 마지막 부분에 추가되며, 위치 지정은 불가능하다.

EX)

-- 주소록 테이블에 문자 타입을 가지는 comments 칼럼을 추가하라. (기본값: 'No Comment')
ALTER TABLE address
ADD (comments DATE DEFAULT 'No Comment');

 

테이블 칼럼 삭제

ALTER TABLE ... DROP COLUMN 명령문을 쓴다.

2개 이상의 칼럼이 존재하는 테이블에 대해서만 삭제 가능하다.

하나의 칼럼만 삭제 가능하다.

ALTER TABLE table_name DROP COLUMN column_name;

 

EX)

-- 주소록 테이블에서 comments 칼럼을 삭제
ALTER TABLE address
DROP COLUMN comments;

 

테이블 칼럼 변경

테이블 칼럼의 타입, 크기, 기본 값 변경 가능하다.

ALTER TABLE ... MODIFY 명령문을 사용한다.

  • 기존 칼럼에 데이터가 없는 경우
    • 칼럼 타입이나 크기 변경이 자유롭다.
  • 기존 칼럼에 데이터가 있는 경우
    • 타입 변경은 CHAR와 VARCHAR2 내에서만 가능하다.
    • 저장된 데이터의 크기보다 같거나 클 경우에만 변경이 가능하다.
    • 숫자 타입에서 정밀도 증가 가능
  • 기본 값 변경하면 입력되는 데이터부터 적용된다.
ALTER TABLE table_name
MODIFY (column datatype [DEFAULT expression]
        [, column datatype]... );

 

EX)

-- 주소록 테이블에서 phone 칼럼의 크기를 50으로 증가
ALTER TABLE address
MODIFY phone VARCHAR2(50);

/*
만약 기존의 데이터가 있으면 아래의 쿼리는 작게 지정할 수 없기에 오류 발생.
ALTER TABLE address
MODIFY phone VARCHAR2(5);
*/

 

테이블 칼럼 이름 변경

-- lecture 테이블의 hp 칼럼 이름을 cellphone으로 변경
ALTER TABLE lecture
RENAME COLUMN hp to cellphone;

 

테이블 이름 변경

RENAME 명령문 사용한다.

RENAME old_table TO new_table;

 

EX)

-- addr_second 테이블 이름을 client_address로 변경
RENAME addr_second TO client_address;

 

테이블 삭제

  • 테이블과 데이터를 모두 삭제한다.
  • DROP TABLE 명령문 사용한다.
  • 삭제할 테이블의 기본 키나 고유 키를 다른 테이블에서 참조하고 있는 경우 삭제 불가능하다.
    • 참조하는 테이블을 우선 삭제해야 함.
    • DROP TABLE 명령문 끝에 CASCADE CONSTRAINTS 옵션을 사용하면 제약조건을 동시에 삭제한다.
DROP TABLE table_name [CASCADE CONSTRAINTS]

 

EX) 

-- addr_third 테이블을 삭제
DROP TABLE addr_third;

 

'프로그래밍 > SQL' 카테고리의 다른 글

[Oracle] 테이블, 칼럼에 COMMENT(주석) 추가  (0) 2022.11.27
[Oracle] TRUNCATE  (0) 2022.11.27
[Oracle] 시퀀스(SEQUENCE)  (0) 2022.11.27
[Oracle] UPDATE, DELETE, MERGE  (0) 2022.11.24
[Oracle] INSERT  (0) 2022.11.21
Comments