/*- 06_테이블_DDL.sql -*/

/*
 * # DDL ( Data Definition Language ) : 테이블 생성, 수정, 삭제
 * - CREATE TABLE
 *   : 데이터를 저장하는 새로운 테이블을 생성.
 *   Ex) CREATE TABLE table_name ( 
 *       column_name , data_type expr, 
 *       column_name , data_type expr, 
 *       .....
 *       );
 */
 
 

DESC EMP;
-- EMPNO    NOT NULL NUMBER(4)    
-- ENAME             VARCHAR2(10) 
-- JOB               VARCHAR2(9)  
-- MGR               NUMBER(4)    
-- HIREDATE          DATE         
-- SAL               NUMBER(7,2)  
-- COMM              NUMBER(7,2)  
-- DEPTNO            NUMBER(2) 

-- 사원번호, 사원이름, 급여 3개의 컬럼으로 구성된 EMP01 테이블 생성.
CREATE TABLE EMP01(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
SAL NUMBER(7,2)
);

SELECT * FROM TAB;
DESC EMP01;

-- CREATE TABLE 문에서 서브쿼리를 사용하여,
-- 기존 테이블과 동일한 구조의 내용을 갖는 새로운 테이블을 생성할 수 있음.
CREATE TABLE EMP02
AS
SELECT * FROM EMP;

DESC EMP02;

-- 기존 테이블에서 원하는 컬럼만 선택적으로 복사해서 생성할 수 있음.
CREATE TABLE EMP03
AS
SELECT EMPNO,ENAME FROM EMP;

DESC EMP03;
SELECT * FROM EMP03;

-- 기존 테이블의 구조만 복사.
-- : WHERE 조건에 항상 거짓이되는 조건을 지정.
CREATE TABLE EMP04
AS
SELECT * FROM EMP WHERE 1=0;

DESC EMP04;
SELECT * FROM EMP04;

/*
 * # ALTER TABLE
 * - 기존 테이블의 구조를 변경하기 위해서 사용되는 DDL 명령문.
 * - ADD COLUMN    : 새로운 컬럼 추가
 *   MODIFY COLUMN : 기존 컬럼 수정
 *   DROP COLUMN   : 기존 컬럼 삭제
 */
 
/*
 * # ALTER TABLE ADD
 * - 기존 테이블에 새로운 컬럼을 추가.
 * - 새로운 컬럼은 테이블의 마지막에 추가되므로, 자신이 원하는 위치에 만들어 넣을 수 없음.
 *   ALTER TABLE table_name
 *   ADD ( column_name, data_type, .....);
 */
 
DESC EMP01;
 
ALTER TABLE EMP01
ADD ( JOB VARCHAR2(9));

DESC EMP01;

-- 컬럼 이름 수정
-- ALTER TABLE table_name
-- RENAME COLUMN '현재 컬럼명' TO '수정 컬럼명';
ALTER TABLE EMP02
RENAME COLUMN mgr to mgrno;
 
DESC EMP02;
SELECT * FROM EMP02;
 

/*
 * # ALTER TABLE MODIFY
 * - 기존 컬럼의 속성을 변경.
 * - 속성을 변경한다는 것은 컬럼에 대한 데이터 타입이나 크기를 변경하는 것.
 *   ALTER TABLE table_name
 *   MODIFY ( column_name, data_type, ....);
 */ 

DESC EMP01;
 
-- job 컬럼을 최대 30글자까지 저장할 수 있게 수정
ALTER TABLE EMP01
MODIFY ( JOB VARCHAR2(30));
 
DESC EMP01;

/*
 * # ALTER TABLE DROP
 * - 테이블에서 사용중인 컬럼을 삭제.
 *   ALTER TABLE table_name
 *   DROP COLUMN column_name;
 */

-- EMP01 테이블의 job 컬럼 삭제
ALTER TABLE EMP01
DROP COLUMN JOB;

DESC EMP01;

/*
 * # 테이블 삭제
 * - DROP TABLE table_name;
 */
 
-- EMP01 테이블 삭제
DROP TABLE EMP01;
SELECT * FROM TAB;

-- 휴지통 조회
SELECT * FROM RECYCLEBIN;

-- 휴지통에 있는 테이블 복구
-- FLASHBACK TABLE '복구 테이블명' TO BEFORE DROP;
FLASHBACK TABLE EMP01 TO BEFORE DROP;
SELECT * FROM TAB;
 
-- 휴지통 거치지 않고 삭제
-- DROP TABLE '삭제 테이블명' PURGE;
DROP TABLE EMP01 PURGE;

SELECT * FROM recyclebin;

/*
 * # 테이블의 모든 행(ROW) 삭제
 * - TRUNCATE TABLE table_name;
 */
SELECT * FROM EMP02;

-- EMP02 테이블의 모든 행 삭제
TRUNCATE TABLE EMP02;

SELECT * FROM EMP02;
DESC EMP02;

/* 테이블 이름 변경 
 * - RENAME '기본 테이블명' TO '새로운 테이블명'
  */
  
-- EMP02 테이블 이름 변경
REMANE EMP02 or NUWMP32

SELECT * FROM TAB;

/* quiz */
-- 아래와 같은 구조를 가진 dept01 테이블을 생성하세요
-- deptno   NUMBER(2)
-- dname    VARCHAR2(14)
-- loc      VARCHAR2(13)
CREATE TABLE DEPT01 (
    deptno NUMBER(2),
    DNAME  VARCHAR2(14),
    LOC VARCHAR2(13)
);
-- emp 테이블의 사원번호, 사원이름, 급여 컬럼을 복사해서 empcopy 테이블을 생성하세요
CREATE TABLE EMPCOPY 
AS
SELECT EMPNO, ENAME, SAL FROM EMP;
-- dept 테이블과 동일한 구조의 빈 테이블 dept02 를 생성하세요
CREATE TABLE DEPT02
AS
SELECT * FROM DEPT WHERE 1=0;
SELECT * FROM DEPT02;
-- dept02 테이블을 삭제하세요
FLASHBACK TABLE DEPT02 TO BEFORE DROP;
DROP TABLE DEPT02 PURGE;
-- dept 테이블과 동일한 구조의 빈 테이블 dept03 을 생성하세요
CREATE TABLE DEPT03
AS
SELECT * FROM DEPT WHERE 1=0;

-- dept03 테이블에 문자 타입의 부서장(dmgr) 컬럼을 추가하세요 ( 크기 자유 )
ALTER TABLE DEPT03
ADD ( DMGR CHAR(10));
-- dept03 테이블의 부서장 컬럼을 삭제하세요
ALTER TABLE DEPT03
DROP COLUMN DMGR;

DESC DEPT03;

SELECT * FROM TAB;