DATABASE(oracleDB 11g)/SQL

[SQL]DDL(Data Definition Language) 의 기초

SEUNGSAMI 2019. 1. 31. 16:03

DDL(Data Definition Language) 

의 기초




테이블 생성

create table 테이블명( 컬럼명 자료형(표현할 범위) );

의 구조를 따른다.

1
2
3
4
5
6
create table test(
name varchar2(10),
age number(3),
tel varchar2(20),
address varchar2(50)
);
cs


테이블 복사

create table test2 as select * from test1;

의 구조를 따른다.

1
2
3
4
create table emp
as
select last_name, salary, department_id
from employees;
cs

이경우, 테이블의 구조 뿐만 아니라 데이터까지 전부 복사된다.


테이블 구조 복사

1
2
3
4
create table emp
as
select last_name, salary from employees
where 1 = 0;
cs

테이블의 구조만 복사할경우 위와 비슷한데, where에 무조건 거짓인 조건을 넣어주어서 데이터가 복사되지 않게 한다.

주로 1=0이라는 거짓 조건을 사용한다.



컬럼 추가

alter table (테이블명)

add ( 컬럼명 자료형(표현할범위) );

1
alter table emp add( department_id varchar2 (20));
cs

이 경우 emp 테이블에 department_id라는 컴럼이 추가 되지만, 그 안에는 데이터가 없다.



컬럼 변경

alter table (테이블명)

modify ( 컬럼명 바꿀자료형(표현할범위) );

1
alter table emp modify( phone number(30) );
cs

이 경우 phone에는 데이터가 없는 상황이므로 데이터 타입이 변경 된다.


컬럼을 변결할때는 데이터가 존재할 경우 데이터 타입을 변경할 수 없다. 

단 char와 varchar2 는 가능하다.

또한 컬럼명은 변경할 수 없다.

크기는 기존 데이터보다 같거나 크게 변경만 가능하다.

컬럼을 변경하는 것은 별로 추천하지 않는 것이다.



컬럼 삭제

alter table 테이블명 drop column 컬럼명;

1
alter table emp drop column adress;
cs

다음과 같이 컬럼을 삭제할 수 있다.



컬럼 비활성화

컬럼을 삭제할때 다른 쪽에서 컬럼을 이용하고 있을 수 있다. 그렇기 때문에 실제로는 컬럼을 논리적으로 비활성화 시킨 후에 사용시간이 적은 시간에 삭제하는 작업을 진행한다.

한번 비활성화 한 컬럼은 다시 활성화 시킬 수 없다. 메모리만 차지하고 삭제와 같다고 생각하면 된다.


alter table 테이블명 set unused( 컬럼명);

1
alter table emp set unused(phone);
cs


select * from user_unused_col_tabs;

1
select * from user_unused_col_tabs;
cs

을 사용할 경우 비활성화 한 컬럼의 갯수를 테이블별로 확인할수 있다.


이후 비활성화된 컬럼을 삭제하면 된다. 그래야 저장공간을 확보할 수 있다.

이때 비활성화 한 컬럼을 제거하는 방법은

alter table 테이블명 drop unused column;

1
alter table emp drop unused column;
cs

을 이용하면 된다.



테이블의 모든 데이터 삭제

truncate table 테이블명;

의 형식으로 이용한다.

*AUTO COMMIT이 실행 된다.

그러므로 DELETE보다 빠르게 데이터 삭제가 가능하나, AUTO COMMIT이 진행되기 에 ROLLBACK이 불가능하다.(사용에 주의가 요함)


테이블 삭제

drop table 테이블명;

의 형식이다.

1
drop table emp;
cs



<추가정보: sequence 생성>

1
2
3
4
5
create sequence testseq
start with 1
maxvalue 999999
nocache
nocycle;
cs


autoincrement 대신

1
select seq.NEXTVAL from dual;
cs

를 사용한다.


sequence를 확인할때

1
select * from user_sequences;
cs

를 사용한다.


이 seqeunce는 지금 잘 이해가 안가므로 다음에 다시 정리하겠다.


SQL을 배운지 얼마 되지 않아 잘못된 내용이 있을 수 있습니다. 틀린 내용이있다면, 댓글로 달아주세요.

'DATABASE(oracleDB 11g) > SQL' 카테고리의 다른 글

[SQL]TCL(트랜잭션 관리) 기초  (0) 2019.02.01
[SQL]DML(Data Manupulation Language)의 기초  (0) 2019.01.31
[SQL]서브쿼리(SUBQUERY)의 기초  (0) 2019.01.30
[SQL]계층적 질의  (0) 2019.01.30
[SQL]GROUP BY의 확장  (0) 2019.01.30