[Oracle]/SQL (Program source)

[Oracle] 20231018 [프로그램 소스] - 20231018_01_sys, 20231018_02_scott

Jelly-fish 2023. 10. 18. 23:07

20231018_01_sys.sql

--○ 접속된 사용자 계정 조회

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

-------------------------------------------------------------------
-- SCOTT 계정을 활용할 수 있는 환경 설정


--○ 사용자 계정 생성(SCOTT / TIGER)
create user scott
identified by tiger;
--==>> User SCOTT이(가) 생성되었습니다.


--○ 사용자 계정에 권한(롤) 부여
GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO SCOTT;
--==>> Grant을(를) 성공했습니다.


--○ SCOTT 사용자 계정의 기본 테이블스페이스를 USERS 로 지정(설정)
ALTER USER SCOTT DEFAULT TABLESPACE USERS;
--==>> User SCOTT이(가) 변경되었습니다.


--↓ DEFAULT SPACE에 문제가 생겼을 때, 임시로 사용할 테이블을 지정

--○ SCOTT 사용자 계정의 임시 테이블스페이스를 TEMP 로 지정(설정)
ALTER USER SCOTT TEMPORARY TABLESPACE TEMP;
--==>> User SCOTT이(가) 변경되었습니다.


--○ 사용자 계정 확인
SELECT *
FROM DBA_USERS;
--==>>
/*
                  :
SCOTT	49		OPEN		24/04/15	USERS	TEMP	23/10/18	DEFAULT	DEFAULT_CONSUMER_GROUP		10G 11G 	N	PASSWORD
                  :
*/

 

20231018_02_scott.sql

--○ 사용자 계정 확인
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 행 이(가) 삽입되었습니다.
 
--○ 커밋
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				YES	N									         1	         1	    N	ENABLED			NO		N	N	NO	DEFAULT	DEFAULT	DEFAULT	DISABLED	NO	NO		DISABLED	YES		DISABLED	DISABLED		NO	NO	YES	DEFAULT
EMP	        USERS			VALID	10		1	255	65536	1048576	1	2147483645				YES	N									         1	         1	    N	ENABLED			NO		N	N	NO	DEFAULT	DEFAULT	DEFAULT	DISABLED	NO	NO		DISABLED	YES		DISABLED	DISABLED		NO	NO	YES	DEFAULT
BONUS	    USERS			VALID	10		1	255	65536	1048576	1	2147483645				YES	N									         1	         1	    N	ENABLED			NO		N	N	NO	DEFAULT	DEFAULT	DEFAULT	DISABLED	NO	NO		DISABLED	YES		DISABLED	DISABLED		NO	NO	YES	DEFAULT
SALGRADE	USERS			VALID	10		1	255	65536	1048576	1	2147483645				YES	N									         1	         1	    N	ENABLED			NO		N	N	NO	DEFAULT	DEFAULT	DEFAULT	DISABLED	NO	NO		DISABLED	YES		DISABLED	DISABLED		NO	NO	YES	DEFAULT
*/
 
--○ 위에서 조회한 각각의 테이블들이
--    어떤 테이블스페이스에 저장되어 있는지 조회
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;
--==>> Table TBL_EXAMPLE2이(가) 생성되었습니다.
--** 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      컬럼명     -- ⑤ ┐
    FROM        테이블명   -- ① ┘
    WHERE       조건절     -- ② +
    GROUP BY    절         -- ③ +
    HAVING      조건절     -- ④ +
    ORDER BY    절         -- ⑤ +
=====================================*/
--** 테이블 스페이스에서 FROM을 가장 먼저 찾음
--** FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
--** 1,5는 반드시 있어야함
--** +는 단독으로 존재가능
-------------------------------------------------------------------------------
 
--○ SCOTT 소유의 테이블 조회
SELECT *
FROM TAB;
--==>>
/*
BONUS	        TABLE	-- 보너스(BONUS) 데이터 테이블
DEPT	        TABLE	-- 부서(DEPARTMENTS) 데이터 테이블
EMP	            TABLE	-- 사원(EMPLOYEES) 데이터 테이블
SALGRADE	    TABLE	-- 급여(SAL) 데이터 테이블
 
TBL_EXAMPLE1	TABLE	
TBL_EXAMPLE2	TABLE	
*/
 
--○ 각 테이블의 데이터 조회
SELECT *
FROM BONUS;
--==>> 조회 결과 없음(조회된 데이터가 존재하지 않음)
 
 
SELECT *
FROM DEPT;
--==>>
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/
 
 
 
SELECT *
FROM EMP;
--==>>
/*
EMPNO      ENAME    JOB     MGR     HIGEDATE    SAL COMMI   DEPTNO
사원번호 이름     직업     관리자  입사일     급여     수당   부서번호
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;
--==>>
/*
2	1201	1400
3	1401	2000
4	2001	3000
1	700	    1200
2	1201	1400
3	1401	2000
4	2001	3000
5	3001	9999
*/
 
SELECT *
FROM TBL_EXAMPLE1;
--==>> 조회 결과 없음(조회된 데이터가 존재하지 않음)
 
SELECT *
FROM TBL_EXAMPLE2;
--==>> 조회 결과 없음(조회된 데이터가 존재하지 않음)
 
SELECT *
FROM SALGRADE;
--==>> 
/*
1	700	    1200
2	1201	1400
3	1401	2000
4	2001	3000
5	3001	9999
*/
 
 
--○ DEPT 테이블에 존재하는 컬럼의 구조 확인
DESCRIBE DEPT;
--==>>
/*
이름     널?       유형       --** 널? : NULL 상태 수용 컬럼인지    
------ -------- ------------ 
DEPTNO NOT NULL NUMBER(2)    
DNAME           VARCHAR2(14) 
LOC             VARCHAR2(13) 
*/
 
-- DEPTNO   DNAME  LOC
-- 부서번호 부서명 부서위치
----------------------------
-- 10       인사부   서울    -> 데이터 입력 가능
-- 20                대전    -> 데이터 입력 가능
--          개발부   경기    -> 데이터 입력 불가~!!!
 
--------------------------------------------------------------------------------
--■■■ 오라클의 주요 자료형(DATA TYPE) ■■■--
/*
cf) MSSQL 서버의 정수 표현 타입
    tinyint     0 ~ 255             1byte
    smallint    -32.768 ~ 32.767    2byte
    int         -21억 ~ 21억        4byte
    bigint      엄청큼              8byte
    
    MSSQL 서버의 실수 표현 타입
    float, real
    
    MSSQL 서버의 숫자 표현 타입
    decimal, 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 를 소모      --** 10바이트를 담을 수 있는 문자열 지정                
          CHAR(10)     <---- '잠든홍길동'   10Byte
          CHAR(10)     <---- '오잠깬홍길동' 10Byte 를 초과하므로 입력 불가
          
                          
          VARCHAR2     -> 가변형 크기
                          (상황에 따라 크기가 변경)
          VARCHAR2(10)  <-ㅡ- '강의장'       6Byte
          VARCHAR2(10)  <---- '잠든홍길동'   10Byte
          VARCHAR2(10)  <---- '오잠깬홍길동' 10Byte 를 초과하므로 입력 불가
          
          //** CHAR가 VARCHAR2보다 효율적임 -> 데이터외에 데이터에 대한 정보가 VARCHAR2가 더 큼
          
          NCHAR        -> 유니코드 기반 고정형 크기(글자수)
          NCHAR(10)     <---- 10글자
          
          NVARCHAR2    -> 유니코드 기반 가변형 크기(글자수)
          NVARCHAR2(10) <---- 10글자
          
3. 날짜형 DATE
 
 
 
          
          
*/
SELECT HIREDATE
FROM EMP;
--==>>
/*
1980-12-17
*/
 
--ALTER SESSION SET NLS_DATE_FORMAT='MM/DD';
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.
 
--** 23/10/18 11:47:20
-- 자바와 툴이 다르니까 오라클에서 환경셋팅 했다고 하더라도 
-- 날짜 포멧이 다르게 나올 수 있음
 
--DESCRIBE EMP; --단축 DESCRIBE = DESC
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) 
*/
 
SELECT SYSDATE
FROM DUAL;
--==>> 2023-10-18
--** Oracle 데이터베이스에서 현재 날짜와 시간을 반환하는 함수
 
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH:MI:SS';
--==>> Session이(가) 변경되었습니다.
 
SELECT SYSDATE
FROM DUAL;
--==>> 2023-10-18 12:05:20
 
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
--==>> Session이(가) 변경되었습니다.
--** 24시를 기준으로 시간 설정됨 EX. 오후 1시 ->13
 
SELECT SYSDATE
FROM DUAL;
--==>> 2023-10-18 12:05:20
--==>>2023-10-18 14:05:55
 
--○ 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 사원번호, 사원명, 직종, 급여, 부서번호
FROM EMP
WHERE 부서번호가 20;
 
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO가 20;
 
--SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
--FROM EMP
--WHERE DEPTNO == 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 "사원명" , JOB 직종명, SAL "급   여", DEPTNO "부서 번호" 
FROM EMP;
--※ 테이블을 조회하는 과정에서
--각 컬럼의 이름에는 별칭(ALIAS)을 부여할 수 있다.
--기본 구문의 형식은 『컬럼명 AS "별칭이름"』의 형태로 작성되며
--이 때, 『AS』는 생략이 가능하다.
--또한, 별칭 이름을 감싸는 『""』도 생략이 가능하지만
--『""』 를 생략할 경우 별칭 내에서 공백은 사용할 수 없다.
--공백의 등장은 해당 컬럼의 표현에 대한 종결을 의미하므로
--별칭의 이름 내부에 공백을 사용해야 할 경우
--『""』 를 사용하여 별칭을 부여할 수 있도록 한다.
 
/* EMPNO AS "사원번호" : SQL에서는 문자열은 '(작은따옴표)이지만, AS(별칭)을 지을때는 "(큰따옴표)
                      '일시 에러발생(ORA-00923: FROM keyword not found where expected)
 ENAME "사원명"      : AS 생략 가능
 JOB 직종명          : " 생략 가능
 SAL "급   여"       : 별칭안에 공백이 있을 시 " 생략불가*/
 
 
--○ EMP 테이블에서 부서번호가 20번과 30번 직원들의 데이터들 중
--사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.
--단, 별칭(ALIAS)을 사용한다.
/*
EMP 테이블에서                           -> FROM EMP
부서번호가 20번과 30번                   -> 조건
사원번호, 사원명, 직종명, 급여, 부서번호 -> SELECT 컬럼명
*/
SELECT 사원번호, 사원명, 직종명, 급여, 부서번호
FROM EMP
WHERE 부서번호가 20번과 30번;
 
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
FROM EMP
WHERE DEPTNO가 20 DEPTNO가 30;
 
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
FROM EMP
WHERE DEPTNO=20 || DEPTNO=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 IN ('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 IN ('clerk');
--==>> 조회 결과 없음
 
--※ 오라클에서... 입력된 데이터의 값 만큼은...
--  반.드.시 대소문자 구분을 한다.
 
--○ EMP 테이블에서 직종이 CLERK 인 사원들 중
--    20번 부서에 근무하는 사원들의
--    사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.
--    ALIAS 사용~!!!
SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
FROM EMP
WHERE JOB = 'CLERK' AND DEPTNO = 20;
--==>>
/*
7369	SMITH	CLERK	800	    20
7876	ADAMS	CLERK	1100	20
*/
 
--○ EMP 테이블의 구조와 데이터를 확인해서
--    이와 똑같은 데이터가 들어있는 테이블의 구조를 생성한다.
--    (팀별로... EMP1, EMP2, EMP3, EMP4)
--**추가 코멘트) 한 테이블에 대해 여러 처리를 하게 되면 lock 걸림
 
CREATE TABLE EMP4
( 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 EMP4이(가) 생성되었습니다.
 
INSERT INTO EMP4 VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP4 VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP4 VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
--==>> 1 행 이(가) 삽입되었습니다.
 
SELECT *
FROM EMP4;
 
DROP TABLE EMP4;
 
INSERT INTO EMP4 VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP4 VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP4 VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP4 VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP4 VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP4 VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP4 VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP4 VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP4 VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP4 VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP4 VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP4 VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP4 VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP4 VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
 
COMMIT;
 
--1. 복사할 대상 테이블 구조 확인
DESCRIBE EMP;
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)
, HIGEDATE  DATE
, SAL       NUMBER(7,2)
, COMM      NUMBER(7,2)
, DEPTNO    NUMBER(2)
);

SELECT *
FROM EMP5;

-- 3. 대상 테이블의 데이터 조회
SELECT *
FROM EMP;


-- 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

--ROLLBACK

-- 5. 확인
SELECT *
FROM EMP5;


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


SELECT *
FROM EMP5;

--※ 날짜 관련 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';


SELECT *
FROM EMP5;

--○ 대상 테이블의 내용에 따라 테이블 생성(TBL_EMP)

CREATE TABLE TBL_EMP
AS
SELECT *
FROM EMP;


SELECT *
FROM TBL_EMP;

CREATE TABLE TBL_DEPT
AS
SELECT *
FROM DEPT;
--==>> Table TBL_DEPT이(가) 생성되었습니다.


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

--○ 테이블의 커멘트 정보 확인

SELECT *
FROM USER_TAB_COMMENTS;
--==>> 
/*

[현재는 COMMENTS 창이 비어있는 상태이다. (NULL), 테이블 정보를 COMMENT에 넣는 거구나...]
SALGRADE	    TABLE	
EMP1	        TABLE	
DEPT	        TABLE	
TBL_EXAMPLE1	TABLE	
EMP	            TABLE	
BONUS	        TABLE	
TBL_EMP	        TABLE	
TBL_EXAMPLE2	TABLE	
EMP5	        TABLE	
TBL_DEPT	    TABLE	
*/

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


--○ 커멘트 정보 입력 후 테이블의 커멘트 정보 확인

SELECT *
FROM USER_TAB_COMMENTS;
--==>>
/*
TBL_DEPT	    TABLE	
TBL_EMP	        TABLE	사원 정보      <- 테이블의 커멘트 정보
EMP1	        TABLE	
EMP5	        TABLE	
TBL_EXAMPLE2	TABLE	
TBL_EXAMPLE1	TABLE	
SALGRADE	    TABLE	
BONUS	        TABLE	
EMP	            TABLE	
DEPT	        TABLE	
*/


--○ TBL_DEPT 테이블을 대상으로 테이블 레벨의 커멘트 데이터 입력
--     -> 부서 정보
COMMENT ON TABLE TBL_DEPT IS '부서 정보';
--==>> Comment이(가) 생성되었습니다.

--○ 커멘트 데이터 입력 후 확인

SELECT *
FROM USER_TAB_COMMENTS;
--==>>
/*
TBL_DEPT	    TABLE	부서 정보
TBL_EMP	        TABLE	사원 정보
EMP1	        TABLE	
EMP5	        TABLE	
TBL_EXAMPLE2	TABLE	
TBL_EXAMPLE1	TABLE	
SALGRADE	    TABLE	
BONUS	        TABLE	
EMP	            TABLE	
DEPT	        TABLE	
*/

-- 만약 테이블 전체를 지운 적이 있다면 밑의 식을 실행 후 진행할 것
PURGE RECYCLEBIN;
--==>> RECYCLEBIN이(가) 비워졌습니다.
-- 만들어둔 테이블을 DROP 하게 되면 삭제되는 것이 아니고 휴지통에 들어가는데
-- 휴지통을 비우는 구문이다.



--○ 컬럼(COLUMN) 레벨의 커멘트 데이터 확인 <- 소유하고 있는 모든 COLUMN의 정보가 나오는데
--   현재는 COMMENTS들이 모두 NULL 값이라고 나온다.
SELECT *
FROM USER_COL_COMMENTS;
--==>>
/*
[열의 COMMENTS들이 모두 NULL 값임을 확인]
TBL_DEPT	    LOC	
TBL_EMP	        HIREDATE	
EMP	            EMPNO	
TBL_EMP	        JOB	
EMP5	        JOB	
EMP1	        MGR	
TBL_EXAMPLE2	ADDR	
TBL_DEPT	    DNAME	
EMP1	        DEPTNO	
DEPT	        DNAME	
EMP5	        COMM	
SALGRADE	    LOSAL	
EMP	            ENAME	
TBL_EXAMPLE1	ADDR	
EMP1	        EMPNO	
TBL_EXAMPLE2	NO	
TBL_EMP	        ENAME	
TBL_DEPT	    DEPTNO	
EMP	            JOB	
BONUS	        SAL	
SALGRADE	    GRADE	
TBL_EXAMPLE1	NAME	
EMP5	        DEPTNO	
EMP5	        ENAME	
EMP         	HIREDATE	
EMP5	        MGR	
EMP5	        SAL	
TBL_EMP	        SAL	
SALGRADE	    HISAL	
EMP	            SAL	
DEPT	        LOC	
TBL_EMP	        EMPNO	
BONUS	        ENAME	
DEPT	        DEPTNO	
EMP1	        COMM	
EMP	            MGR	
EMP1	        SAL	
EMP5	        EMPNO	
EMP	            COMM	
TBL_EXAMPLE2	NAME	
BONUS	        JOB	
TBL_EMP     	COMM	
BONUS	        COMM	
EMP1	        ENAME	
TBL_EMP	        MGR	
EMP	            DEPTNO	
EMP1	        HIREDATE	
EMP5	        HIREDATE	
TBL_EMP	        DEPTNO	
TBL_EXAMPLE1	NO	
EMP1	        JOB	
*/


SELECT *
FROM TAB;

-- ROLLBACK; <- 뒤로가기

-- PURGE RECYCLEBIN; 간단한 설명
DROP TABLE TBL_EXAMPLE1;
--==>> Table TBL_EXAMPLE1이(가) 삭제되었습니다.

SELECT *
FROM TAB;
-- 원래 TBL_EXAMPLE1의 테이블이 있던 곳에 아래와 같은 문자가 들어갔다. (GARBAGE)
--==>> BIN$FY/Xj7IwQ3S0c1HHVtuNLA==$0


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


SELECT *
FROM TAB;
--==>> BIN$FY/Xj7IwQ3S0c1HHVtuNLA==$0 문자들이 모두 사라진 것을 확인


--○ 컬럼(COLUMN) 레벨의 커멘트 데이터 확인(TBL_DEPT 테이블에 소속된 컬럼들만 조회)

SELECT *
FROM USER_COL_COMMENTS
WHERE TABLE_NAME = 'TBL_DEPT';  -- 조건 추가
--==>>
/*
[DEPT를 구성하는 컬럼만 출력]

TBL_DEPT	DEPTNO	
TBL_DEPT	DNAME	
TBL_DEPT	LOC	
*/

-- 테이블 커멘트 남기는 방법
-- COMMENT ON TABLE 테이블명 IS '커멘트';

-- 컬럼에 대한 코멘트 남기는 방법
-- COMMENT ON COLUMN 테이블명.컬럼명 IS '커멘트';

--○ 테이블에 소속된 컬럼에 대한 커멘트 데이터 입력
COMMENT ON COLUMN TBL_DEPT.DEPTNO IS '부서 번호';
-- TBL_DEPT가 가지고 있는 DEPTNO를 지정해서 커멘트 남겨줌
-- (여러 테이블에 DEPTNO라는 컬럼이 있을 수 있기 때문에)
--==>> 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 테이블에 주민등록번호 데이터를 담을 수 있는 컬럼 추가
-- CREATE INSERT ALTER 중에서 뭘 써야 할까?
-- 거시적으로 보면 특정 컬럼이 추가되는 형태로 구조가 바뀌는 것 -> ALTER 써야 함

-- CREATE TABLE : 테이블을 처음부터 창조해낼 때 사용.
-- ALTER  TABLE : 테이블의 구조를 변경할 때 (컬럼 추가) 사용.
-- INSERT       : 테이블에 데이터를 삽입할 때 사용.
-- 『INSERT INTO 테이블명 VALUES(1, 2, 3, ...)』

ALTER TABLE TBL_EMP
ADD SSN CHAR(13);       -- SSN(주민번호) 컬럼을 CHAR 형태 13자리로 만들겠다.
                        -- 주민번호는 자료의 길이가 일정하므로 고정형 사용
--==>> Table TBL_EMP이(가) 변경되었습니다.

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


SELECT 01012345678
FROM DUAL;
-- 맨 앞의 0이 사라진 채로 나오므로, 문자형태로 작성하도록 한다.
--==>> 1012345678


--○ 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         CHAR(13) -> SSN 컬럼이 정상적으로 포함(추가)된 사항을 확인

--※ 테이블 내에서 컬럼의 순서는 구조적으로 의미 없음.
--   SELECT 안에서 출력 순서를 지정할 수 있기 때문.

SELECT *
FROM TBL_EMP;


SELECT EMPNO, ENAME, SSN
FROM TBL_EMP;

--○ TBL_EMP 테이블에 추가한 SSN(주민등록번호) 컬럼 제거
--   컬럼을 제거하는 것도 넓게 보면 테이블의 구조가 바뀌는 것이기 때문에 ALTER 사용

ALTER TABLE TBL_EMP
DROP COLUMN SSN;    -- CHAR(13)은 붙일 필요 없다, 한 줄로 작성해도 무관
--==>> 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)    

*/


SELECT *
FROM TBL_EMP;
-- SSN(주민번호) 컬럼이 정상적으로 삭제(제거)되었음을 확인.

-- 데이터의 제거 = DELETE
-- 구조적으로 제거 = DROP

DELETE TBL_EMP;
--==>> 14개 행 이(가) 삭제되었습니다.

SELECT *
FROM TBL_EMP;
--> 데이터의 구조(뼈대, 틀)는 그대로 남아있는 상태에서
--  데이터만 모두 소실(삭제)된 상황임을 확인.

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

SELECT *
FROM TBL_EMP;
--==>> 테이블이 없다는 에러
--      "table or view does not exist"

--> 테이블 자체가 구조적으로 제거된 상황


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

--○ NULL 의 처리

SELECT 10, 10 + 2, 10 - 2, 10 * 2, 10 / 2
FROM DUAL;
--==>> 10	12	8	20	5

SELECT NULL, NULL + 2, NULL - 2, NULL * 2, NULL / 2
FROM DUAL;
--==>> (NULL) (NULL) (NULL) (NULL) (NULL)
-- 복사로 NULL 값 복사는 불가능하고 이해를 위해 직접 작성함...

-- ※ 관찰의 결과
--      NULL 은 상태의 값(비어있는)을 의미하며 실제 존재하는 데이터가 아니라
--      아무것도 없는 상태를 담고 해당 의미를 전달
--      NULL 이 연산에 포함될 경우
--      그 결과는 무조건 NULL 이다

--○ TBL_EMP 테이블에서 커미션(COMM, 수당)이 NULL 인 직원의 사원명, 직종명, 급여
--  커미션 항목을 조회한다.(풀이)


SELECT *
FROM TBL_EMP
WHERE COMM IS NULL;
--==>>
/*
7369	SMITH	CLERK	7902	1980-12-17	800		    20
7566	JONES	MANAGER	7839	1981-04-02	2975		20
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30
7782	CLARK	MANAGER	7839	1981-06-09	2450		10
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20
7839	KING	PRESIDENT		1981-11-17	5000		10
7876	ADAMS	CLERK	7788	1987-07-13	1100		20
7900	JAMES	CLERK	7698	1981-12-03	950		    30
7902	FORD	ANALYST	7566	1981-12-03	3000		20
7934	MILLER	CLERK	7782	1982-01-23	1300		10
*/

SELECT ENAME, JOB, SAL, COMM
FROM TBL_EMP
WHERE 커미션이 NULL;

SELECT ENAME, JOB, SAL, COMM
FROM TBL_EMP
WHERE COMM = NULL;
--==>> 에러는 나지 않지만 조회 결과가 없다.

SELECT ENAME, JOB, SAL, COMM
FROM TBL_EMP
WHERE COMM = 'NULL';
--==>> 에러 발생
--      "invalid number"

SELECT ENAME, JOB, SAL, COMM
FROM TBL_EMP
WHERE COMM = (null);
-- 오라클에서 괄호는 연산의 우선순위를 결정하는 용됴로 쓰이고 NULL 은 대소문자를 구별하지 않는다.
-- 조회 결과 없음



-- ※ NULL 은 실제 존재하는 값이 아니기 때문에
--      일반적인 연산자를 활용하여 비교할 수 없다.
--      NULL 을 대상으로 사용할 수 없는 연산자들...
--      >=, <=, =, >, <, !=,
--      <>, !=, ^= 모두 같지 않다는 뜻 완전히 똑같으니 != 만 사용해도 무관


SELECT ENAME, JOB, SAL, COMM
FROM TBL_EMP
WHERE COMM IS NULL;
--==>>
/*
SMITH	CLERK	    800	
JONES	MANAGER	    2975	
BLAKE	MANAGER	    2850	
CLARK	MANAGER	    2450	
SCOTT	ANALYST	    3000	
KING	PRESIDENT	5000	
ADAMS	CLERK	    1100	
JAMES	CLERK	    950	
FORD	ANALYST	    3000	
MILLER	CLERK	    1300	
*/



--○ TBL_EMP 테이블에서 20번 부서에 근무하지 않는 직원들의
--      사원명, 직종명, 부서번호 항목을 조회한다.


SELECT *
FROM TBL_EMP;


SELECT 사원명, 직종명, 부서번호
FROM TBL_EMP
WHERE 부서 != 20;


SELECT ENAME, JOB, DEPTNO
FROM TBL_EMP
WHERE DEPTNO != 20;
--==>>
/*
ALLEN	SALESMAN	30
WARD	SALESMAN	30
MARTIN	SALESMAN	30
BLAKE	MANAGER	    30
CLARK	MANAGER 	10
KING	PRESIDENT	10
TURNER	SALESMAN	30
JAMES	CLERK	    30
MILLER	CLERK	    10
*/

 

 

ip를 공유하여 하나의 테이블에 서로의 값 공유하기 (너무 많이 실수했음... 꼭 다시 보자.)

1. Oracle 접속의 ➕ (새로 만들기/데이터베이스 접속 선택) 클릭.

2. 새로 만드려는 서버명 입력 (Name) ex : local_gkd

3. 사용자 정보 ▷ 사용자 이름(U) : scott

4. 사용자 정보 ▷ 비밀번호(P)     : tiger

5. 세부정보 ▷ 호스트 이름(A) : 접속하길 원하는 PC의 IP번호 입력

6, 최하단 테스트(T) → 성공했을 경우 접속(O)

 

접속 후에 해야할 사항

이미 그 서버 내에는 테이블이 존재해 있을 것임.(예 : EMP1)

이 테이블에 원하는 VALUE를 넣는다.

1. INSERT INTO EMP1 VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);

위와 같은 형식으로 대입 (단, 다른 PC와 동시에 값을 테이블에 넣을 경우 동작이 모두 멈추므로 주의!)

2. 모든 데이터들을 대입한 후에, 반드시 [COMMIT] 을 실행 (값을 넣어준 쪽에서 COMMIT)

3. SELECT *

    FROM EMP1; 을 통해, 테이블 내의 모든 요소를 출력해본다.

 

 

과정 중에 알게 된 사실

- 특정 COLUMN 값을 기준으로 오름차순 정렬 : 

SELECT *

FROM EMP1 ORDER BY EMPNO;

(*사원 번호를 기준으로 테이블 오름차순 정렬)

 

- 특정 값을 포함하고 있는 VALUE(RECORD)를 삭제.

 

DELETE FROM EMP1

WHERE ENAME = 'SCOTT' OR ENAME = 'CLARK' OR ENAME = 'KING';

(* 사원 이름이 SCOTT 이거나, CLARK 이거나, KING 인 RECORD를 모두 삭제.)