KH/Oracle

# 13 DDL -CREATE,DROP,RENAME,ALTER,TRUNCATE , ROWID

오늘의 진 2022. 8. 30. 13:33

DDL (Data Definition Language)

: 데이터 정의어, 테이블 구조 생성, 변경 및 삭제 

CREATE  데이터 베이스 객체를 생성
DROP 데이터 베이스 객체를 삭제
RENAME 데이터베이스의 이름을 변경
ALTER 기존에 존재하는 데이터베이스 객체를 다시 정의
TRUNCATE 테이블을 최초 생성 상태로 만들며 ROLLBACK 불가능

 

CREATE,ALTER,DROP,RENAME,TRANCATE 등 DDL을 사용하면 자동 COMMIT이 적용된다. (자동 적용)


CREATE TABLE

 

: 새로운 테이블을 생성한다. 

CREATE TABLE table_name(
        컬럼명1  데이터타입,
        컬럼명2 데이터타입,
              ...........
      ) ;

 

        [ 식별자 ]         

  • 반드시 문자로 시작해야한다.
  • 오라클에서 사용되는 예약어나 다른 객체명과 중복이 불가능하다.(중복되면 안된다.)
  • A~Z까지의 대소문자,0~9까지의 숫자, 특수기호는('_', '$', '#')만 포함가능하다.
  • 1~30글자 까지 가능하다.
  • 공백을 허용하지 않는다.

 

 

 

 

(예)

create table TEST1( empno number(4),  ename varchar2(20),  sal number(7,2));

insert into test1(empno,ename,sal) values(34,'korea',345.7);     // 테이블에 하나의 레코드 집어 넣기(DML 명령)

 

 

 

서브쿼리로 테이블 생성하기 

create table emp_01 
as
select* from emp;          (emp에 있는 모든것을 가져다가 emp_01로 만들겟다는 의미)

>> 레코드 값은 들어가지만 권한(예를들면 null에 대한 처리)까지는 복사되지 않는다. 그냥 값만 복사된다. 

 

(예) 30번 부서 사람들만 들어있는 테이블 생성하기 

>>  create table emp_02 as select* from emp where deptno=30;

 

 

(예) emp테이블에서 월급이 평균 이상인 사람들만 가져와서 테이블 생성하기 

create table test1_2 as select* from emp where sal>(select avg(sal) from emp);

 

 

 

(예) 두개의 테이블에서 값 가져와서 테이블 만들기 

create table emp_03
as
select ename, dname,loc,sal from emp, dept 
where emp.deptno=dept.deptno  and  emp.deptno=30;

 

create table emp_04 
as
select ename, sal, grade from emp,salgrade 
where sal between losal and hisal;

 

 

(예) 원하는 컬럼만 가져오기 

create table emp_004
as
select ename, sal,hiredate from emp 
where sal>1500;

 

(예) 구조만 가지고 오고 싶은 경우 

create table emp_05
as
select * from emp 
where 1=0;

1=0을 만족하는 값은 존재하지 않는다. 즉 만족하는 레코드가 없음으로 레코드는 복사되지 않고 틀만 복사된다.

꼭 1=0 이 아니더라도  where에서 모든것에 만족하지 않는 조건을 주면 된다. 

 

만약 다시 값을 모두 집어 넣고 싶다면 ?

insert into emp_05 select * from emp ;     // emp의 모든 내용이 emp_05로 복사된다. 

 

 

 

Q) dept 테이블의 구조와 동일한 테이블 dept_01을 구조만 있는 테이블로 만드시오 

create table dept_01 as select * from dept where 0=1;
다시 값 넣기 
insert into dept_01 select* from dept;

 

     ROWID     

: ROWID 데이타 형은 테이블에서 행위 위치를 지정하는 논리적인 주소값이다. 

(행마다 고유한 rowid를 부여받는다. )

 

ROWID는 데이터 베이스 번체에서 중복되지 않는 유일한 값으로 테이블에 새로운 행이 삽입되면

테이블 내부에서 의사 컬럼 형태로(쉐도우 형태) 자동적으로 생성된다. 

ROWID는 테이블의 특정 레코드에 랜덤으로 접근하기 위해 주로 사용한다. 

 

ROWID는 DB에 저장되지 않으며 DB Data도 아니다. 

 

형태

32 bit 10 bit 22 bit 16bit
000000  FFF BBBBBB RRR
데이터 객체번호 상대적파일번호 블럭번호 행번호

(총 80bit : 10바이트)

 

행마다 고유한 rowid를 부여받는다. 

이것은 디비에 저장되지 않으며 검색을 위한 것이다.

 

AAAR3s /  AAE/ AAAACX /AAA

객체번호 / 파일번호/ 블럭번호 / 행번호 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Q) 테이블명 : EMP_06

     컬럼  :  EMPNO number(4) , ENAME varchar2(20) , JOB varchar2(16), DEPTNO number(2)  인 테이블 생성

create table emp_06(
 EMPNO number(4) , ENAME varchar2(20) , JOB varchar2(16), DEPTNO number(2)
);

 

 

 


ALTER

 

: ALTER문으로 테이블의 구조를 변경 한다. 

 

구조변경이란 컬럼을 추가(ADD), 삭제(DROP), 수정(MODIFY) 한다는 뜻이다. 

 

ALTER문으로 테이블의 구조를 변경할때는 

ALTER TABLE 테이블이름

추가 : ADD((컬럼명 자료형),(컬럼명 자료형) .....)
삭제 : DROP culumn ((컬럼명 자료형),(컬럼명 자료형) .....)
수정 : MODIFY  ((컬럼명 자료형),(컬럼명 자료형) .....)
컬럼명 변경 : RENAME COLUMN    원래이름  TO 바뀔이름 ; 

 

ADD COLUMN 절을 사용하여 새로운 컬럼 추가

 : 원하는 위치에 넣을 수 없고 새로운 컬럼은 테이블 맨 마지막에 추가된다. 

이미 이전에 추가한 로우가 존재한다면 그 로우에도 컬럼이 추가되지만 컬럼 값은 NULL 값으로 입력된다. 

 

 

 

   [추가]   

>> alter table emp_06 add(sal number(5));  // 맨 밑에 추가됨

>> 컬럼 mgr 자체는 추가가 가능하지만 그안의 값은 null 이다. 

 

 

 

 

 

 

 

 

   [수정]   

>>  alter table emp_06 modify(sal number(8,3));

   [삭제]   

>> alter table emp_06 drop column sal;

 

 

 

 

- 테이블안에 내용이 들어있는 경우 주의할점 - 

 

→ 내용이 들어있는경우들어있는 내용의 크기보다 작게 축소는 불가능하고 확대는 가능하다.

    들어있는 레코드의 크기보다 크게는 축소 가능 

 

→ 레코드가 들어있어도 테이블을 지우는 것은 가능하다. 

 

 

 


DROP TABLE

 

: 테이블 삭제 

 

  • 기존 테이블의 존재를 제거한다.
  • 한번 제거한 데이터들은 다시 복구하기 힘들다. 
  • 테이블 삭제와 무결성 제약조건

: 삭제하고자 하는 테이블의 기본 키나 고유 키를 다른 테이블에서 참조해서 사용하는 경우에는 

  해당 테이블을 제거할 수 없다. 이러한 경우에는 참조하는 테이블들을 먼저 제거한 후에 해당테이블을 삭제해야 한다. 

 

 

[형식]
DROP TABLE 테이블명

 

(예)

BIN : 복구용 테이블(리사이클 빈) 이 생성된다. 

 

drop table emp_04 purge; 라고 하면 리사이클 빈 안만들어짐

 

purge를 뒤에 적어주면 리사이클 빈 생성 안함.

 

 

 

 

 

 

 

 

 

  • 리사이클 빈이 있을때 삭제한 파일을 다시 되돌리는 방법 
flashback table test1 to before drop;
purge recyclebin ; // 리사이클 빈도 지워줌 (휴지통 비우기)

 

  • 테이블의 모든 레코드를 삭제하는 방법
TRUNCATE TABLE  테이블명 ; 

(예)

테이블은 그대로 있고 테이블 안의 모든 레코드를 삭제한다. 

 

  • 지워진 테이블 명을 보고싶을때 
show RECYCLEBIN;

 

 


컬럼명 변경

 

ALTER TABLE  테이블명 RENAME COLUMN 원래 컬럼명  TO 바뀔 컬럼명 ;

 

(예) ALTER TABLE  emp_03 RENAME COLUMN ename  TO korea;

 

 

Q) dept 테이블을 복사한 dept05 테이블을 만들고 dept05테이블에 

1. tel  varchar2(30) 컬럼을 추가하시오 

2.dname의 컬럼의 크기를 varchar2 크기 35로 바꾸시오

3. loc 컬럼의 이름을 근무지로 바꾸시오. 

>>  create table dept_05 as select* from dept;
>>  alter table dept_05 add(tel varchar(30));
>>  alter table dept_05 modify(dname varchar2(35));
>>  alter table dept_05 rename column loc to 근무지 ;   

 

 

 

 


RENAME - 테이블 명 변경

 

 

형식 
rename 테이블명 to 새 태이블명 ;

만약 이미 존재하는 이름으로 바꾸고자 하면 기존의 객체가 이름을 사용하고 있다고 알려준다. 

기존에 사용중인 테이블명으로는 바꿀 수 없다. 

 

 

'KH > Oracle' 카테고리의 다른 글

# 15 DML- insert, update,delect  (0) 2022.08.31
# 14 SET UNSED  (0) 2022.08.30
# 12 SUB QUERY(서브 쿼리) , ROWNUM  (0) 2022.08.29
# 11 JOIN  (0) 2022.08.26
# 10 그룹 함수  (0) 2022.08.26