📚 Study/Oracle

Oracle :: 오라클 기초 실습

bono-hye 2023. 10. 22. 12:53

( 파일명 : 20231018_02_scott)

■ 테이블 생성 및 조회

SELECT USER
FROM DUAL;
--==>> SCOTT


--○ 테이블 생성(DEPT)
CREATE TABLE DEPT
( DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY
, DNAME VARCHAR2(14)
, LOC VARCHAR2(13) 
) ;
--==>> Table DEPT이(가) 생성되었습니다.


--○ 테이블 생성(EMP)
CREATE TABLE EMP
( EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY
, ENAME VARCHAR2(10)
, JOB VARCHAR2(9)
, MGR NUMBER(4)
, HIREDATE DATE
, SAL NUMBER(7,2)
, COMM NUMBER(7,2)
, DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT
);
--==>> Table EMP이(가) 생성되었습니다.


INSERT INTO DEPT VALUES	(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES	(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES	(40,'OPERATIONS','BOSTON');


INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
--==>> 1 행 이(가) 삽입되었습니다. * 18


--○ 테이블 생성(BONUS)
CREATE TABLE BONUS
( ENAME VARCHAR2(10)
, JOB VARCHAR2(9)
, SAL NUMBER
, COMM NUMBER
) ;
--==>> Table BONUS이(가) 생성되었습니다.


--○ 테이블 생성(SALGRADE)
CREATE TABLE SALGRADE
( GRADE NUMBER
, LOSAL NUMBER
, HISAL NUMBER 
);
--==>> Table SALGRADE이(가) 생성되었습니다.


INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
--==>> 1 행 이(가) 삽입되었습니다. * 5


--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ SCOTT 계정이 가지고 있는(소유하고 있는) 테이블 조회
SELECT *
FROM TAB;
--==>>
/*
BONUS	    TABLE	
DEPT	    TABLE	
EMP	        TABLE	
SALGRADE	TABLE	
*/

SELECT *
FROM USER_TABLES;
--==>>
/*
DEPT	    USERS			VALID	10		1	255	65536	1048576	1	2147483645
EMP     	USERS			VALID	10		1	255	65536	1048576	1	2147483645
BONUS	    USERS			VALID	10		1	255	65536	1048576	1	2147483645
SALGRADE	USERS			VALID	10		1	255	65536	1048576	1	2147483645
*/


--○ 위에서 조회한 각각의 테이블들이 어떤 테이블 스페이스에 저장되어 있는지 조회
SELECT TABLE_NAME, TABLESPACE_NAME
FROM USER_TABLES;
--==>>
/*
DEPT	    USERS
EMP	        USERS
BONUS	    USERS
SALGRADE	USERS
*/

--○ 테이블 생성(TBL_EXAMPLE1)
CREATE TABLE TBL_EXAMPLE1
( NO    NUMBER(4)
, NAME  VARCHAR2(20)
, ADDR  VARCHAR2(20)
);
--==>> Table TBL_EXAMPLE1이(가) 생성되었습니다.

--○ 테이블 생성(TBL_EXAMPLE2)
CREATE TABLE TBL_EXAMPLE2
( NO    NUMBER(4)
, NAME  VARCHAR2(20)
, ADDR  VARCHAR2(20)
) TABLESPACE TBS_EDUA;
--==>> TABLESPACE TBS_EDUA;

--○ TBL_EXAMPLE1과 TBL_EXAMPLE2 테이블이
--   각각 어떤 테이블스페이스에 저장되어 있는지 조회
SELECT TABLE_NAME, TABLESPACE_NAME
FROM USER_TABLES;
--==>>
/*
DEPT	        USERS
EMP	            USERS
BONUS	        USERS
SALGRADE	    USERS
TBL_EXAMPLE1	USERS
TBL_EXAMPLE2	TBS_EDUA
*/

■ 관계형 데이터베이스 (RDBMS)

관계형 데이터베이스 : 각각의 데이터를 테이블의 형태로 연결시켜 저장해놓은 구조

                                    그리고 이들 각각의 테이블들 간의 관계를 설정하여 연결시켜 놓은 구조

 

■ SELECT 문의 처리(PARSING) 순서

※ SELECT 문의 처리(PARSING) 순서 → 꼭 외워서 이대로!!! 하기!!!!!

SELECT 컬럼명     ⑤ ┐

FROM 테이블명     ① ┘

WHERE 조건절     ② +

GROUP BY 절       ③ +

HAVING 조건 절    ④ +

ORDEREDBY 절   ⑤ +

→ ①랑 ⑤는 필수 요소! 꼭 들어가야 하는 항목이며 나머지는 옵션임! 없어도 실행 가능. 하지만 순서는 지켜야 함!!

--○ SCOTT 소유의 테이블 조회
SELECT *
FROM TAB;
--==>>
/*
BONUS	        TABLE       -- 보너스(BONUS) 테이블
DEPT	        TABLE       -- 부서(DEPARTMENTS) 데이터 테이블
EMP         	TABLE       -- 사원(EMPLOYEES) 데이터 테이블
SALGRADE	    TABLE       -- 급여(SAL) 데이터 테이블
*/

--○ 각 테이블의 데이터 조회
SELECT *
FROM BONUS;
--==>> 조회 결과 없음 (조회된 데이터가 존재하지 않음)

SELECT *
FROM DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/

SELECT *
FROM EMP;
--==>>
/*
7369	SMITH	CLERK	    7902	80/12/17	800		        20
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	    30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	    30
7566	JONES	MANAGER 	7839	81/04/02	2975		    20
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	    7839	81/05/01	2850		    30
7782	CLARK	MANAGER	    7839	81/06/09	2450		    10
7788	SCOTT	ANALYST	    7566	87/07/13	3000		    20
7839	KING	PRESIDENT		    81/11/17	5000		    10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	    30
7876	ADAMS	CLERK	    7788	87/07/13	1100		    20
7900	JAMES	CLERK	    7698	81/12/03	950		30
7902	FORD	ANALYST	    7566	81/12/03	3000		    20
7934	MILLER	CLERK	    7782	82/01/23	1300		    10
*/

SELECT *
FROM SALGRADE;
--==>>
/*
1	700	    1200
2	1201	1400
3	1401	2000
4	2001	3000
5	3001	9999
*/


--○ DEPT 테이블에 존재하는 컬럼의 구조 확인
DESCRIBE DEPT;
--==>>
/*
이름     널?       유형           
------ -------- ------------ 
DEPTNO NOT NULL NUMBER(2)    
DNAME           VARCHAR2(14) 
LOC             VARCHAR2(13) 

*/

-- DEPTNO   DNAME   LOC
------------------------
--    10    인사부  서울     → 데이터 입력 가능
--    20            대전     → 데이터 입력 가능
--          개발부  경기     → 데이터 입력 불가~! DEPTNO는 NOT NULL이기 때문에 데이터를 넣어줘야 한다!

 

■ 오라클의 주요 자료형 (DATA TYPE)

/*
cf) MSSQL 서버의 정수 표현 타입    
    tinyint     0 ~ 255             1Byte
    smallint    -32768 ~ 32767      2Byte  
    int         -21억 ~ 21억        4Byte
    bigint      엄청 큼             8Byte
    
    MSSQL 서버의 실수 표현 타입
    float, real
    
    MSSQL 서버의 숫자 표현 타입
    decinal, numeric
    
    MSSQL 서버의 문자 표현 타입
    char, varchar, Nvarchar
    
    
※ ORACLE 은 숫자 표현 타입이 한 가지로 통일되어 있다.

1. 숫자형 NUMBER       → -10의 38승 -1 ~ 10의 38승
          NUMBER(3)    → -999 ~ 999
          NUMBER(4)    → -9999 ~ 9999
          NUMBER(4, 1) → -999.9 ~ 999.9
          
※ ORACLE 의 문자 표현 타입

2. 문자형 CHAR         → 고정형 크기
                          (무조건 지정된 크기 소모)
                          
          CHAR(10)     ←← '강의장'         6Byte 이지만 10Byte 를 소모
          CHAR(10)     ←← '잠든김동민'    10Byte
          CHAR(10)     ←← '오잠깬김동민'  10Byte 를 초과하므로 입력 불가
                                         
          VARCHAR2     → 가변형 크기
                          (상황에 따라 크기가 변경)
                          
          CHAR(10)     ←← '강의장'         6Byte
          CHAR(10)     ←← '잠든김동민'    10Byte
          CHAR(10)     ←← '오잠깬김동민'  10Byte 를 초과하므로 입력 불가
          
          NCHAR        → 유니코드 기반 고정형 크기(글자 수)
          NCHAR(10)    ←← 10글자
          
          NVARCHAR2    → 유니코드 기반 가변형 크기(글자 수)
          NVARCHAR2(10)←← 10글자
                 
3. 날짜형 DATE
*/

--※ 날짜 형식에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.

SELECT SYSDATE
FROM DUAL;
--==>> 2023-10-21

--※ 날짜 형식에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH:MI:SS';
--==>> Session이(가) 변경되었습니다.


--※ 날짜 형식에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>> Session이(가) 변경되었습니다.


SELECT SYSDATE
FROM DUAL;
--==>> 2023-10-21 09:02:04

■ 오라클 실습 내용 → 테이블 생성(CREATE), 제거(DROP), COMMENT 작성, 테이블 복사해서 새 테이블 생성

--○ EMP 테이블에서 사원번호, 사원명, 급여, 커미션 데이터만 조회한다.

SELECT EMPNO, ENAME, SAL, COMM
FROM EMP;
--==>>
/*
7369	SMITH	800	
7499	ALLEN	1600	300
7521	WARD	1250	500
7566	JONES	2975	
7654	MARTIN	1250	1400
7698	BLAKE	2850	
7782	CLARK	2450	
7788	SCOTT	3000	
7839	KING	5000	
7844	TURNER	1500	0
7876	ADAMS	1100	
7900	JAMES	950	
7902	FORD	3000	
7934	MILLER	1300	
*/


--○ EMP 테이블에서 부서번호가 20번인 직원들의 데이터들 중
--   사원번호, 사원명, 직종, 급여, 부서번호 조회

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20;                  -- 자바에서 처럼 == 쓰면 에러 발생!!
--==>>
/*
7369	SMITH	CLERK	 800	20
7566	JONES	MANAGER	2975	20
7788	SCOTT	ANALYST	3000	20
7876	ADAMS	CLERK	1100	20
7902	FORD	ANALYST	3000	20
*/


SELECT EMPNO AS "사원번호", ENAME AS "사원명", JOB 직종명, SAL "급   여", DEPTNO "부서 번호"
-- AS 키워드, "" 생략 가능 (단, 별칭 내에 공백을 넣을 경우에는 큰 따옴표 생략할 경우 에러난다!!!!)
FROM EMP;
-==>>
/*
7369	SMITH	CLERK	     800	20
7499	ALLEN	SALESMAN	1600	30
7521	WARD	SALESMAN	1250	30
7566	JONES	MANAGER	    2975	20
7654	MARTIN	SALESMAN	1250	30
7698	BLAKE	MANAGER	    2850	30
7782	CLARK	MANAGER	    2450	10
7788	SCOTT	ANALYST	    3000	20
7839	KING	PRESIDENT	5000	10
7844	TURNER	SALESMAN	1500	30
7876	ADAMS	CLERK	    1100	20
7900	JAMES	CLERK	     950	30
7902	FORD	ANALYST	    3000	20
7934	MILLER	CLERK	    1300	10
*/

--※ 각 테이블을 조회하는 과정에서
--   각 칼럼의 이름에는 별칭(ALIAS)을 부여할 수 있다.
--   기본 구문의 형식은 『컬럼명 AS "별칭이름"』의 형태로 작성되며
--   이 때, 『AS』는 생략이 가능하다.
--   또한, 별칭 이름을 감싸는 『""』도 생략이 가능하지만
--   『""』 를 생략할 경우 별칭 내에서 공백은 사용할 수 없다.
--   공백의 등장은 해당 컬럼의 표현에 대한 종결을 의미하므로
--   별칭(ALIAS)의 이름 내부에 공백을 사용해야 할 경우
--   『""』를 사용하여 별칭을 부여할 수 있도록 한다.



--○ EMP 테이블에서 부서번호가 20번과 30번 직원들의 데이터들 중
--   사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.
--   단, 별칭을 사용한다.

SELECT EMPNO 사원번호, ENAME 사원명, JOB 직종명, SAL 급여, DEPTNO 부서번호
FROM EMP
WHERE DEPTNO = 20 OR DEPTNO = 30;
--==>>
/*
7369	SMITH	CLERK	     800	20
7499	ALLEN	SALESMAN	1600	30
7521	WARD	SALESMAN	1250	30
7566	JONES	MANAGER	    2975	20
7654	MARTIN	SALESMAN	1250	30
7698	BLAKE	MANAGER 	2850	30
7788	SCOTT	ANALYST	    3000	20
7844	TURNER	SALESMAN	1500	30
7876	ADAMS	CLERK	    1100	20
7900	JAMES	CLERK	     950	30
7902	FORD	ANALYST	    3000	20
*/


--※ 위의 구문은 IN 연산자를 활용하여
--   다음과 같이 처리할 수 있으며
--   위 구문의 처리 결과와 같은 결과를 반환한다.
SELECT EMPNO 사원번호, ENAME 사원명, JOB 직종명, SAL 급여, DEPTNO 부서번호
FROM EMP
WHERE DEPTNO IN (20, 30);
--==>>
/*
7369	SMITH	CLERK	     800	20
7499	ALLEN	SALESMAN	1600	30
7521	WARD	SALESMAN	1250	30
7566	JONES	MANAGER	    2975	20
7654	MARTIN	SALESMAN	1250	30
7698	BLAKE	MANAGER 	2850	30
7788	SCOTT	ANALYST	    3000	20
7844	TURNER	SALESMAN	1500	30
7876	ADAMS	CLERK	    1100	20
7900	JAMES	CLERK	     950	30
7902	FORD	ANALYST	    3000	20
*/


--○ EMP 테이블에서 직종이 CLERK인 사원들의 데이터를 모두 조회한다.
SELECT *
FROM EMP
WHERE JOB = 'CLERK';
--==>>
/*
7369	SMITH	CLERK	7902	1980-12-17 00:00:00	 800		20
7876	ADAMS	CLERK	7788	1987-07-13 00:00:00	1100		20
7900	JAMES	CLERK	7698	1981-12-03 00:00:00	 950		30
7934	MILLER	CLERK	7782	1982-01-23 00:00:00	1300		10
*/

SELECT *
FROM EMP
WHERE JOB = 'clerk';
--==>> 조회 결과 없음

SELECT *
FROM EMP
WHERE JOB = 'Clerk';
--==>> 조회 결과 없음

--※ 오라클에서 입력된 데이터의 값은 대소문자를 엄격하게 구분함!!


--○ EMP 테이블에서 직종이 CLERK인 사원들 중
--   20번 부서에 근무하는 사원들의
--   사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.
SELECT EMPNO 사원번호, ENAME 사원명, JOB 직종명, SAL 급여, DEPTNO 부서번호
FROM EMP
WHERE JOB = 'CLERK' AND DEPTNO = 20;
--==>>
/*
7369	SMITH	CLERK	 800	20
7876	ADAMS	CLERK	1100	20
*/

--○  IP 주소로 접속하여 다른 사람에게 정보 입력해주는거!

--○ EMP 테이블의 구조와 데이터를 확인해서
--   이와 똑같은 데이터가 들어있는 테이블의 구조를 생성한다.
--   (팀별로... EMP1, EMP2, EMP3, EMP4)

-- 같이 테이블 구조 생성한 것
--1. 복사할 대상 테이블의 구조 구현
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)
*/


--2. 대상 테이블의 구조에 따라 새로운 테이블 생성
CREATE TABLE EMP5
( EMPNO     NUMBER(4)
, ENAME     VARCHAR2(10)
, JOB       VARCHAR2(9)
, MGR       NUMBER(4)
, HIREDATE  DATE
, SAL       NUMBER(7,2)
, COMM      NUMBER(7,2)
, DEPTNO    NUMBER(2)
);
--==>> Table EMP5이(가) 생성되었습니다.

--3. 대상 테이블의 데이터 조회
SELECT *
FROM EMP;
--==>>
/*
7369	SMITH	CLERK	    7902	80/12/17	 800		    20
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	    30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	    30
7566	JONES	MANAGER 	7839	81/04/02	2975		    20
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	    7839	81/05/01	2850		    30
7782	CLARK	MANAGER	    7839	81/06/09	2450		    10
7788	SCOTT	ANALYST	    7566	87/07/13	3000		    20
7839	KING	PRESIDENT		    81/11/17	5000		    10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	    30
7876	ADAMS	CLERK	    7788	87/07/13	1100		    20
7900	JAMES	CLERK	    7698	81/12/03	 950		    30
7902	FORD	ANALYST	    7566	81/12/03	3000		    20
7934	MILLER	CLERK	    7782	82/01/23	1300		    10
*/


--4. 대상 테이블의 데이터를 복사할 테이블에 입력
INSERT INTO EMP5 VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP5 VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP5 VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP5 VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP5 VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP5 VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP5 VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP5 VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP5 VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP5 VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP5 VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP5 VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP5 VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP5 VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
--==>> 1 행 이(가) 삽입되었습니다. * 14

--5. 확인
SELECT *
FROM EMP5;


--6. 커밋
COMMIT;
--==>> 커밋 완료.

SELECT *
FROM EMP5;

--※ 날짜 관련 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.


--○ 대상 테이블의 내용에 따라 테이블 생성(TBL_EMP)
CREATE TABLE TBL_EMP
AS
SELECT *
FROM EMP;
--==>> Table TBL_EMP이(가) 생성되었습니다.


--○ DEPT 테이블을 복사하여 위와 같이 TBL_DEPT 테이블을 생성한다.
CREATE TABLE TBL_DEPT
AS
SELECT *
FROM DEPT;
--==>> Table TBL_DEPT이(가) 생성되었습니다.

--○ 복사한 테이블 확인
SELECT *
FROM TBL_DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/


--○ 테이블의 커멘트 정보 확인
SELECT *
FROM USER_TAB_COMMENTS;
--==>>
/*
DEPT	        TABLE	(null)
EMP	            TABLE	(null)
BONUS	        TABLE	(null)
SALGRADE	    TABLE	(null)
TBL_EXAMPLE1	TABLE	(null)
TBL_EXAMPLE2	TABLE	(null)
EMP5	        TABLE	(null)
EMP3	        TABLE	(null)
TBL_EMP	        TABLE	(null)
*/


--○ 테이블 레벨의 커멘트 정보 입력
COMMENT ON TABLE TBL_EMP IS '사원 정보';
--==>> Comment이(가) 생성되었습니다.


--○ 커멘트 데이터 입력 후 확인
SELECT *
FROM USER_TAB_COMMENTS;
--==>>
/*
TBL_EMP	        TABLE	사원 정보
EMP3	        TABLE	
EMP5	        TABLE	
TBL_EXAMPLE2	TABLE	
TBL_EXAMPLE1	TABLE	
SALGRADE	    TABLE	
BONUS	        TABLE	
EMP	            TABLE	
DEPT	        TABLE	
*/


--○ 컬럼(COLUMN) 레벨의 커멘트 데이터 확인
SELECT *
FROM USER_COL_COMMENTS;
--==>>
/*
EMP5	                        HIREDATE	
TBL_EXAMPLE2	                ADDR	
EMP5	                        ENAME	
BONUS	                        JOB	
EMP	                            COMM	
EMP                         	JOB	
DEPT	                        LOC	
EMP3	                        ENAME	
DEPT	                        DNAME	
EMP3	                        JOB	
BONUS	                        SAL	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	HIREDATE	
TBL_EMP	                        LOC	
EMP5	                        DEPTNO	
EMP5	                        EMPNO	
EMP5	                        JOB	
EMP                         	HIREDATE	
TBL_EXAMPLE1	                NO	
EMP5	                        MGR	
SALGRADE	                    GRADE	
EMP	                            EMPNO	
EMP3	                        DEPTNO	
EMP3	                        MGR	
EMP	                            ENAME	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	DEPTNO	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	SAL	
BONUS	                        COMM	
EMP3	                        COMM	
TBL_EXAMPLE1	                NAME	
EMP5	                        SAL	
EMP	                            SAL	
TBL_EXAMPLE2	                NO	
EMP3	                        SAL	
EMP3	                        EMPNO	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	EMPNO	
TBL_EXAMPLE2	                NAME	
EMP	                            MGR	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	MGR	
SALGRADE	                    LOSAL	
EMP5	                        COMM	
TBL_EMP	                        DNAME	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	JOB	
BONUS	                        ENAME	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	ENAME	
SALGRADE	                    HISAL	
TBL_EXAMPLE1	                ADDR	
DEPT	                        DEPTNO	
EMP                         	DEPTNO	
BIN$F7mvG3kIQemSxC0ZD/KiYw==$0	COMM	
TBL_EMP	                        DEPTNO	
EMP3	                        HIREDATE	
*/

SELECT *
FROM TAB;

DROP TABLE TBL_EXAMPLE1;                       
--==>> Table TBL_EXAMPLE1이(가) 삭제되었습니다.


-- 휴지통 비우기
PURGE RECYCLEBIN;
--==>> RECYCLEBIN이(가) 비워졌습니다.

SELECT *
FROM TAB;

--○ 컬럼(COLUUMN) 레벨의 커멘트 데이터 확인 (TBL_DEPT 테이블에 소속된 컬럼들만 조회)
SELECT *
FROM USER_COL_COMMENTS
WHERE TABLE_NAME = 'TBL_DEPT';
--==>>
/*
TBL_DEPT	DEPTNO	
TBL_DEPT	DNAME	
TBL_DEPT	LOC	
*/

-- COMMENT ON TABLE 테이블명 IS 커멘트;

--○ 테이블에 소속된 컬럼에 대한 커멘트 데이터 입력
COMMENT ON COLUMN TBL_DEPT.DEPTNO IS '부서번호';
--==>> Comment이(가) 생성되었습니다.
COMMENT ON COLUMN TBL_DEPT.DNAME IS '부서 이름';
--==>> Comment이(가) 생성되었습니다.
COMMENT ON COLUMN TBL_DEPT.LOC IS '부서 위치';
--==>> Comment이(가) 생성되었습니다.


--○ 확인
SELECT *
FROM USER_COL_COMMENTS
WHERE TABLE_NAME = 'TBL_DEPT';
--==>>
/*
TBL_DEPT	DEPTNO	부서번호
TBL_DEPT	DNAME	부서 이름
TBL_DEPT	LOC 	부서 위치
*/


--○ TBL_EMP 테이블을 대상으로
--   테이블에 소속된(포함된) 컬럼에 대한 커멘트 데이터 입력(설정)
DESC TBL_EMP;
-- 사원 번호, 사원 이름, 직종 이름, 관리자 사원번호, 입사일, 급여, 수당, 부서 번호
COMMENT ON COLUMN TBL_EMP.EMPNO IS '사원 번호';
COMMENT ON COLUMN TBL_EMP.ENAME IS '사원 이름';
COMMENT ON COLUMN TBL_EMP.JOB IS '직종 이름';
COMMENT ON COLUMN TBL_EMP.MGR IS '관리자 사원번호';
COMMENT ON COLUMN TBL_EMP.HIREDATE IS '입사일';
COMMENT ON COLUMN TBL_EMP.SAL IS '급여';
COMMENT ON COLUMN TBL_EMP.COMM IS '수당';
COMMENT ON COLUMN TBL_EMP.DEPTNO IS '부서 번호';

SELECT*
FROM USER_COL_COMMENTS
WHERE TABLE_NAME = 'TBL_EMP';
--==>>
/*
TBL_EMP	EMPNO	    사원 번호
TBL_EMP	ENAME	    사원 이름
TBL_EMP	JOB	        직종 이름
TBL_EMP	MGR	        관리자 사원번호
TBL_EMP	HIREDATE	입사일
TBL_EMP	SAL	        급여
TBL_EMP	COMM	    수당
TBL_EMP	DEPTNO	    부서 번호
*/

 

■ 컬럼 구조의 추가 및 제거

--■■■ 컬럼 구조의 추가 및 제거 ■■■--

SELECT *
FROM TBL_EMP;

--○ TBL_EMP 테이블에 주민등록번호 데이터를 담을 수 있는 컬럼 추가
--  (TBL_EMP) 구조가 바뀌는 것, TABLE의 구조를 바꾸는 과정에서 컬럼이 추가되는 것이므로 ALTER 사용!)

ALTER TABLE TBL_EMP
ADD SSN CHAR(13);
--==>> Table TBL_EMP이(가) 변경되었습니다.

SELECT '01012345678'
FROM DUAL;
--==>> 01012345678

SELECT 01012345678
FROM DUAL;
--==>> 1012345678    ''문자 타입으로 적지 않았으므로 맨 앞의 0은 생략 됨, 따라서 전화번호 등 맨 앞의 0이 유의미한 경우 문자로 입력


--○ TBL_EMP 테이블의 구조 확인
DESC TBL_EMP;
--==>>
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)    
ENAME       VARCHAR2(10) 
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  
DEPTNO      NUMBER(2)    
SSN         CHAR(13)
*/
--==>> SSN(주민등록번호) 컬럼이 정상적으로 포함(추가)된 사항을 확인

--※ 테이블 내에서 컬럼의 순서는 구조적으로 의미 없음.

SELECT EMPNO, ENAME, SSN
FROM TBL_EMP;

--○ TBL_EMP 테이블에 추가한 SSN(주민등록번호) 컬럼 제거
ALTER TABLE TBL_EMP 
DROP COLUMN SSN;                            --(DELETE 내용만 제거, DROP 구조 제거)
--==>> Table TBL_EMP이(가) 변경되었습니다.


DESC TBL_EMP;
--==>>
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)    
ENAME       VARCHAR2(10) 
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  
DEPTNO      NUMBER(2)  
*/
--==>> SSN(주민등록번호) 컬럼이 정상적으로 삭제(제거)된 사항을 확인

DELETE TBL_EMP;

SELECT *
FROM TBL_EMP;
--> 테이블의 구조(뼈대, 틀)는 그대로 남아있는 상태에서
--  데이터만 모두 소실(삭제)된 상황임을 확인.
--  구조는 남아있는 상태이므로 오류가 나지 않고 조회 결과가 없음.

DROP TABLE TBL_EMP;
--==>> Table TBL_EMP이(가) 삭제되었습니다.

SELECT *
FROM TBL_EMP;
--==>> 에러 발생
--     (ORA-00942: table or view does not exist)

--> 테이블 자체가 구조적으로 제거된 상황.
--  없는 테이블을 조회하려고 하니 에러 발생.


--○ 테이블 다시 복사(생성)
CREATE TABLE TBL_EMP
AS
SELECT *
FROM EMP;
--==>> Table TBL_EMP이(가) 생성되었습니다.