ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 001. 테이블스페이스~컬럼 생성, 파일 조회 , * PASING 순서, 오라클의 주요 자료형(숫자,문자,날짜) , 연산자, 코멘트
    SsY/Class 2023. 3. 27. 00:02
    728x90

    2023.03.22 (수)

    ADMIN 파트의 일부분...
    - 개발자로서 필요한 부분만!

    자바와는 다르게 오라클은 파일만 옮겨온다고 해서 생성한 TABLESPACE등이 서버에 자동으로 적용되지 않는다.
    즉, 옮겨온 파일을 해당 PC에서 구문들을 실행(Ctrl+Enter)해주어야 생성이 된다.

    - 물론 실무에서는 각자 ORACLE 을 만들어서 하는 것이 아닌, 한 곳에 물리적으로 구축해두고 접속을 하여 사용하는 방식을 사용하게된다.
    - 강의장에서 각자가 본인이 오라클을 설치하여 구축한 것은, 강의의 원할한 진행을 위해서다.
     (이유 : 동일한 TABLESPACE 생성 불가 등..)

    • sys 계정 실습 
    • TABLESPACE (테이블스페이스) 생성 및 계정 생성 /권한 조회,부여
      (* 은 ALL을 뜻 한다)
    더보기
    --○ 생성된 테이블스페이스(TBS_EDUA)조회
    SELECT *
    FROM DBA_TABLESPACES;
    --○ 물리적인 파일 이름 조회
    SELECT *
    FROM DBA_DATA_FILES;
    --○ 오라클 사용자 계정 생성
    CREATE USER 계정명 IDENTIFIED BY 패스워드
                               -------- (아이디 대소문자 구분 X (내부적 데이터의 경우 소문자를 쓰는것이 바람직)
                                          --> (계정명) (이)라는 사용자를 만들겠다. (생성하겠다.)
                                          ---------------------- -->  패스워드는 (패스워드)로 하겠다.
    DEFAULT TABLESPACE TBS_EDUA;

    이 계정을 통해 생성하는 오라클 객체는(세그먼트들은) 기본적으로(DEFAULT) TBS_EDUA 라는 테이블스페이스에 생성하도록 설정하겠다.
    --※ 생성된 오라클 사용자 계정(JSI)를 통해
    --   오라클 접속을 시도해 보았으나... 접속 불가.
    --   →『CREATE SESSION』권란이 없기 때문에 로그온 거부...
    
    --○ 생성된 오라클 사용자 계정(JSI)에
    --   서버에 접속이 가능하도록 『CREATE SESSION』권한 부여 → SYS 가...
    GRANT CREATE SESSION TO JSI; 
    --==>> Grant을(를) 성공했습니다.
    
    --※ 생성된 오라클 사용자 계정(JSI)을 활용하여
    --   테이블을 생성하는 과정에서 해당 권한이 없음을 확인하고
    --   이에 대한 권한을 부여하기 위해 복귀
    
    --○ 생성된 오라클 사용자 계정(JSI)의
    --   DEFAULT TABLESPACE 조회
    SELECT USERNAME, DEFAULT_TABLESPACE
    FROM DBA_USERS;
    --> DEFAULT TABLESPACE 가 제대로 설정된 것을 확인할 수 있다.
    
    --○ 생성된 오라클 사용자 계정(JSI)의
    --   시스템 관련 권한 조회
    SELECT *
    FROM DBA_SYS_PRIVS;
    --==>>
    /*
            :
    JSI	CREATE SESSION	NO
            :
    */
    
    --○ 생성된 오라클 사용자 계정(JSI)에
    --   테이블 생성이 가능하도록 『CRATE TABLE』 권한 부여
    GRANT CREATE TABLE TO JSI;
    --==>> Grant을(를) 성공했습니다.
    
    --○ 생성된 오라클 사용자 계정(JSI)에
    --   테이블스페이스(TBS_EDUA)에서 사용할 수 있는 공간(→ 할당량) 제공(설정)
    ALTER USER JSI
    QUOTA UNLIMITED ON TBS_EDUA;     -- 할당량 키워드 // 할당량 크기 // ON ~ 위치
    --> 무제한으로 지정
    --==>> User JSI이(가) 변경되었습니다.
    
    -- 위의 구문들을 통해서 오라클이 논리적인 프로그램임을 알 수 있다.

    • JSI 계정 실습
    • 접속된 사용자 확인
    더보기
    --○ 접속된 사용자 확인
    SELECT USER
    FROM DUAL;
    --==>> JSI

    • 테이블 생성 - 권한부여 - 할당량 부여 - 할당량 및 어떤 테이블 스페이스에 있는지 조회
      - 위의 sys 실습에서 권한부여 / 할당량 부여 쿼리문 확인 가능
      - 테이블 생성을 위해서는 테이블 생성 권한이 필요
      - 테이블 생성 권한만 있어서는 테이블을 생성할 수 없음 : 집 지을 권리는 있는데 집을 지을 땅이 없다!
      - 즉, 할당량을 부여받아야한다
      - 할당량을 부여받으면 테이블을 생성할 수 있고, 자신에게 할당받은 할당량과
      해당 테이블이 어느 테이블 스페이스에 위치했는지 조회가 가능하다.
    더보기
    --○ 테이블 생성(테이블명 : TBL_ORAUSERTEST)
    CREATE TABLE TBL_ORAUSERTEST
    ( NO    NUMBER(10)      --// 첫 번째 컬럼 이름 -- 어떤 데이터 유형의 컬럼을 담을 것 (데이터 타입)_숫자 형태 -- 10자리 숫자까지 사용가능 (음수~양수)
    , NAME  VARCHAR2(30)    --// 두 번째 컬럼 이름 -- 데이터 타입 문자열 형태 -- VAR가변형 + CHAR문자 + 2 // VARCHAR 을 이미 다른데서 사용하고 있어서 2를 붙인 것 -- 30 (바이트)까지 표현가능
    );
    --==>> 에러 발생
    /*
    ORA-01031: insufficient privileges
    01031. 00000 -  "insufficient privileges"
    *Cause:    An attempt was made to perform a database operation without
               the necessary privileges.
    *Action:   Ask your database administrator or designated security
               administrator to grant you the necessary privileges
    */
    --> 현재 JSI 계정은 CREATE SESSION 권한만 갖고 있으며
    --  테이블을 생성할 수 있는 권한은 관리자로부터 부여받지 못한 상태이다.
    --  그러므로 테이블을 생성하기 위해서는
    --  관리자로부터 테이블 생성 권한을 부여받아야 한다.
    
    
    --○ SYS로 부터... 『CREATE TABLE』 권한을 부여 받은 후
    --   다시 테이블 생성(테이블명 : TBL_ORAUSERTEST)
    CREATE TABLE TBL_ORAUSERTEST
    ( NO    NUMBER(10)      
    , NAME  VARCHAR2(30)   
    );
    --==>> 에러 발생
    /*
    ORA-01950: no privileges on tablespace 'TBS_EDUA'
    01950. 00000 -  "no privileges on tablespace '%s'"
    *Cause:    User does not have privileges to allocate an extent in the
               specified tablespace.
    *Action:   Grant the user the appropriate system privileges or grant the user
               space resource on the tablespace.
    */
    --> 테이블 생성 권한(CREATE TABLE)까지 부여받은 상황이지만                            
    --  JSI 사용자 계정의 기본 테이블스페이스(DEFAULT TABLESPACE → TBS_EDUA)에 대한
    --  할당량을 부여받지 못한 상태                                                       
    --  그러므로 이 테이블스페이스를 사용할 권한이 없다는 에러메세지를
    --  오라클이 출력해주고 있는 상황.
    
    
    --○ SYS로 부터... 테이블스페이스에(→TBS_EDUA) 대한 할당량을 부여 받은 이후
    --   다시 테이블 생성(테이블명 : TBL_ORAUSERTEST)
    CREATE TABLE TBL_ORAUSERTEST
    ( NO    NUMBER(10)      
    , NAME  VARCHAR2(30)   
    );
    --==>> Table TBL_ORAUSERTEST이(가) 생성되었습니다.
    
    
    --※ 자신에게 부여된 할당량 조회
    SELECT *
    FROM USER_TS_QUOTAS;
    --==>> TBS_EDUA	65536	-1	8	-1	NO          --// MAX_ ~에 -1 값은 무제한 이라고 생각하면 됨
    
    
    --○ 생성된 테이블(TLB_ORAUSERTEST)이
    --   어떤 테이블스페이스에 저장되어 있는지 조회
    SELECT TABLE_NAME, TABLESPACE_NAME
    FROM USER_TABLES;
    --==>> TBL_ORAUSERTEST	TBS_EDUA

    • SCOTT 계정 실습
    • sys 계정에서 SCOTT 계정 생성 후 권한 부여
      - XE버전은 간단하게, 가볍게 만들어진 만큼 SCOTT 계정이 만들어져있지 않기 때문
    더보기
    --○ 접속된 사용자 조회
    SELECT USER
    FROM DUAL;
    --==>> SYS
    
    --○ 오라클 사용자 계정 생성(SCOTT)
    CREATE USER SCOTT
    IDENTIFIED BY tiger;
    --==>> User SCOTT이(가) 생성되었습니다.
    
    --○ 생성된 오라클 사용자(SCOTT)에게 권한 부여
    GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO SCOTT;
    --==>> Grant을(를) 성공했습니다.
    
    --○ 생성된 오라클 사용자(SCOTT)에게 기본 테이블스페이스 설정
    ALTER USER SCOTT DEFAULT TABLESPACE USERS;
    --==>> User SCOTT이(가) 변경되었습니다.
    
    --○ 생성된 오라클 사용자(SCOTT)에게 임시 테이블스페이스 설정
    ALTER USER SCOTT TEMPORARY TABLESPACE TEMP;
    --==>> User SCOTT이(가) 변경되었습니다.

    • 테이블 생성 및 데이터 입력
      - DEPT, EMP, SALGRADE 테이블 생성 및 데이터 입력
      - BOUNUS 테이블 생성
    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이(가) 생성되었습니다.
    ------------------------------------------------------------------------------------------
    --○ DEPT 테이블 데이터 입력
    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');
    --==>> 1 행 이(가) 삽입되었습니다. * 4
    
    --○ EMP 테이블 데이터 입력
    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 행 이(가) 삽입되었습니다. * 14
    ------------------------------------------------------------------------------------------
    --○ 테이블 생성(테이블명 : BONOUS)
    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	
    */

    • 테이블이 저장되어있는 테이블 스페이스 조회
      - 테이블 생성시 테이블 스페이스 지정해주지 않으면 DEFAULT 테이블에 생성 됨
        (sys 계정에서 SCOTT 계정 생성 시, DEFAULT 테이블 스페이스를 USERS 로 해두었다.)
      - 테이블 스페이스 지정하는 방법
    --○ 생성된 각 테이블이 어떤 테이블스페이스에 저장되어 있는지 조회
    SELECT TABLE_NAME, TABLESPACE_NAME
    FROM USER_TABLES;
    --==>>
    /*
    DEPT    	USERS   -- 별도로 테이블스페이스 설정 없이 생성하여 DEFAULT 테이블 스페이스에 저장됨
    EMP     	USERS
    BONUS   	USERS
    SALGRADE	USERS
    */
    
    
    --○ 테이블 생성(테이블명 : TBL_EXAMPLE1)
    CREATE TABLE TBL_EXAMPLE1
    ( NO    NUMBER
    , NAME  VARCHAR2(10)
    , ADDR  VARCHAR2(20)
    );
    --==>> Table TBL_EXAMPLE1이(가) 생성되었습니다.
    
    --○ 테이블 생성(테이블명 : TBL_EXAMPLE2)
    CREATE TABLE TBL_EXAMPLE2
    ( NO    NUMBER
    , NAME  VARCHAR2(10)
    , ADDR  VARCHAR2(20)
    ) TABLESPACE TBS_EDUA;  -- 지정된 테이블스페이스에 테이블 생성
    --==>> Table TBL_EXAMPLE2이(가) 생성되었습니다.
    
    
    --○ TBL_EXAMPLE1 과 TBL_EXAMPLE2 테이블이
    --   어떤 테이블스페이스에 저장되어 있는지 확인
    SELECT TABLE_NAME, TABLESPACE_NAME
    FROM USER_TABLES;
    --==>>
    /*
            :
    TBL_EXAMPLE1	USERS
    TBL_EXAMPLE2	TBS_EDUA
    */

    • 관계형 데이터베이스 // PASING 순서
      - 데이터를 테이블 형태로 저장시켜두고, 이들 테이블 간의 관계를 설정 하는 것

    ★SELECT 문의 PASING 순서★

    /*====================================
    ★ SELECT 문의 처리(PARSING) 순서★     --작성된 순서대로만 작성할 수 있다. 자리가 뒤바뀌면 안됨.
    
        SELECT 컬럼명    --⑤               --// 입력한 순서대로 나열
        FROM 테이블명    --①               --// SELECT 와 FROM 은 꼭 붙어다닌다
        WHERE 조건절     --②               --// 조건을 통해 해당하는 항목을 제한
        GROUP BY 절      --③               --// 컬럼명 내에서 동일한 항목들을 그룹핑
        HAVING 절        --④               --// GROUP BY 의 조건절
        ORDER BY 절      --⑥               --// 절에 대한 정렬
        
    ======================================*/    --// 순번은 오라클이 내부적으로 처리하게 되는 순서를 말한다.

    • 해당 계정이 소유한 테이블(TABLE), 뷰(VIEW) 목록 조회 - 각 테이블의 데이터 조회
    더보기
    --○ 현재 접속된 오라클 사용자(SCOTT)소유의
    --   테이블(TABLE), 뷰(VIEW)의 목록을 조회
    SELECT *
    FROM TAB;
    --==>>
    /*
    BONUS       	TABLE	→ 보너스 정보 테이블
    DEPT        	TABLE	→ DEPARTMENTS(부서) 정보 테이블
    EMP         	TABLE	→ EMPLOYEES(사원) 정보 테이블
    SALGRADE    	TABLE	→ SALARY(급여) 등급(GRADE) 정보 테이블
    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;
    --==>>
    /*
    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
    */

    • 테이블에 존재하는 컬럼의 정보(구조) 조회
      - DESC 테이블명;
      - NULL 값 가능 여부 확인
    --○ DEPT 테이블에 존재하는 컬럼의 정보(구조) 조회 
    --// SELECT * FROM DEPT; 로도 확인은 가능은 함
    DESCRIBE DEPT;
    -- DESCRIBE 를 줄여 DESC 로 사용
    --==>>
    /*     //▼ 널 값이 입력이 가능한지 확인 -- NOT NULL : 값이 비어있으면 입력이 불가능하다
    이름     널?       유형           
    ------ -------- ------------ 
    DEPTNO NOT NULL NUMBER(2)    
    DNAME           VARCHAR2(14) 
    LOC             VARCHAR2(13) 
    */
    
    --※ 우리가 흔히 웹 사이트 등에서 회원가입을 수행할 경우
    --   필수 입력 사항과 선택 입력 사항이 있다.
    --   필수 입력 항목은 ID, PW, 성명, 주민번호, 전화번호, ...
    --   등과 같은 컬럼이며, 이 값들은 회원 가입 절차에 따라
    --   반드시 필요한(존재해야 하는, 입력해야 하는) 값이므로 NOT NULL 로 한다.
    
    --   선택 입력 항목은 취미, 결혼여부, 차량소유여부, 특기, ...
    --   등과 같은 컬럼으로 다루어지며, 이 값들은 회원 가입 과정에서
    --   반드시 필요한 값이 아니므로(즉, 입력하지 않아도 무방하므로)
    --   NULL 인 상태여도 상관없는 상황이 된다.
    
    --   DEPTNO     DNAME       LOC
    --   부서번호   부서명     부서위치
    --   NOT NULL  (NULL 허용) (NULL 허용)
    
    --EX)           인사부      서울     → 데이터 입력 불가
    --    80                    인천     → 데이터 입력 가능
    --    90                             → 데이터 입력 가능

    • 오라클의 주요 자료형 
      1. 숫자형 : NUMBER
      2. 문자형 : 고정형( CHAR, NCHAR) 가변형 ( VARCHAR2, NVARCHAR2)
      3. 날짜형 : DATE 
        - 날짜형식에 대한 세션 설정 변경 

    참고) MS-SQL 의 자료형

    더보기
    /*
    cf) MS-SQL 서버의 정수 표현 타입
        tinyint    0~255                1Byte
        smallint   -32,768 ~ 32,767     2Byte
        int        -21억 ~ 21억         4Byte
        bigint     엄청 큽니다          8Byte
    
        MS-SQL 서버의 실수 표현 타입
        float, real
        
        MS-SQL 서버의 숫자 표현 타입
        decimal, numeric
        
        MS-SQL 서버의 문자 표현 타입
        char, varchar, Nvarchar
    */

    --※ ORACLE 은 숫자 표현 타입이 한 가지로 통일되어 있다. (NUMBER)
    /*
    1. 숫자형 NUMBER       → -10^38 ~ 10^38         --// 길이 명시 안하면 엄청 큰 범위까지 포함하게 됨
              NUMBER(3)    → -999 ~ 999
              NUMBER(4)    → -9999 ~ 9999
              NUMBER(4,1)  → -999.9 ~ 999.9         --// 4-(소수점길이)자리, 소수점 이하 ,~ 자리
    */
    
    --※ ORACLE 의 문자 표현 타입
    --   CHAR, NCHAR, VARCHAR2, NVARCHAR2
    /*
    2. 문자형 CHAR         → 고정형 크기		--// 길이 명시 안하면 1바이트 만 표현 가능 (숫자와 반대)
              CHAR(10)     → 무조건 10Byte 소모
              CHAR(10) ← '강의실'               6Byte 이지만 10Byte 를 소모        -- // 자바와 다르게 길이 지정이 가능해 문자열 담김 //6바이트 담았다고 10바이트인 그릇이 6바이트로 줄어들지 않는다!
              CHAR(10) ← '잠깬메타몽'           10Byte
              CHAR(10) ← '다시졸린메타몽'       10Byte 를 초과하므로 입력 불가
              
              VARCHAR2     → 가변형 크기
              VARCHAR2(10) ← '강의실'           6Byte
              VARCHAR2(10) ← '잠깬메타몽'       10Byte
              VARCHAR2(10) ← '정말잠깬메타몽'   10Byte 를 초과하므로 입력 불가     --// 길이가 정해져있는 타입의 데이터라면 고정형을 쓰는게 좋다. - 가변형은 해당 데이터를 처리하기 위한 헤더의 공간을 더 차지하고 있게 된다.
    
             N + CHAR
             NCHAR        → 유니코드 기반 고정형 크기    -// 유니코드 기반 = 글자 수 기반
             NCHAR(10)       10 글자
             
             N + VARCHAR2
             NVARCHAR2    → 유니코드 기반 가변형 크기
             NVARCHAR2(10)   10글자
    */ --// 키워드로 잡혀있다고 전부 문법적으로 사용된다고 할 수 없다. (사용될 것 같은 예약어가 많기 때문에 + 다른 곳에서 사용하는 문법과 호환하기 위해서 EX)VARCHAR )
    
    /*
    3. 날짜형 DATE
    */
    
    SELECT SYSDATE
    FROM DUAL;
    --==>> 23/03/22
    
    
    --※ 날짜 형식에 대한 세션 설정 변경
    ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
    --==>> Session이(가) 변경되었습니다.
    
    
    SELECT SYSDATE
    FROM DUAL;
    --==>> 2023-03-22 15:25:37  --// 데이터 타입이 DATE 타입!

    • WHERE 조건절 조회
      - 같다는 『=』 을 사용
    --○ EMP 테이블에서 부서번호가 20번인 직원들의 데이터 중
    --   사원번호, 사원명, 직종명, 급여, 부서번호 조회
    SELECT *
    FROM EMP;
    
    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;
    --==>> 에러발생
    /*
    ORA-00936: missing expression
    00936. 00000 -  "missing expression"
    *Cause:    
    *Action:
    384행, 15열에서 오류 발생
    */
    
    SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
    FROM EMP
    WHERE DEPTNO = 20;

    • 별칭(ALIAS) 의 사용과 주의점
    --※ 테이블을 조회하는 과정에서 각 컬럼에 별칭(ALIAS)을 부여할 수 있다.  
    SELECT EMPNO AS  "사원번호", ENAME "사원명", JOB 직종, SAL "급  여" , DEPTNO"부서번호"
    FROM EMP;
    
    --※ 테이블 조회 시 사용하는 별칭(ALIAS)의 기본 구문은 
    --   『AS "별칭명"』의 형태로 작성되며
    --   이 때, 『AS』는 생략할 수 있다.
    --   또한, 『""』도 생략 가능하다.
    --   하지만, 『""』를 생략할 경우 별칭의 이름에 공백은 사용할 수 업다.
    --   공백은  SELECT 하는 과정에서 해당 컬럼의 표현이 끝났다는 것을 의미하므로
    --   별칭의 이름 내부에 공백을 사용하게 될 경우
    --   『""』를 사용하여 별칭을 부여할 수 있도록 처리해야 한다.

    •  OR , IN 연산자
      - 또는 이라는 최소 하나의 조건을 만족 하는 조건을 만들 때 사용한다.
    --○ EMP 테이블에서 부서번호가 20번과 30번 직원들의 정보 중
    --   사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.
    --   (단, 별칭(ALIAS)을 사용한다)
    SELECT *
    FROM EMP;
    
    SELECT 사원번호, 사원명, 직종명, 급여, 부서번호
    FROM EMP
    WHERE 부서번호가 20번과 30번;
    
    SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
    FROM EMP
    WHERE DEPTNO가 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 이거나 DEPTNO = 30;
    
    SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
    FROM EMP
    WHERE DEPTNO = 20 || DEPTNO = 30;
    --==>> 에러 발생
    /*
    ORA-00933: SQL command not properly ended
    00933. 00000 -  "SQL command not properly ended"
    *Cause:    
    *Action:
    468행, 110열에서 오류 발생
    */
    
    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
    */
    
    SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
    FROM EMP
    WHERE DEPTNO IN (20,30);
    --> IN 연산자를 활용하여 이와 같이 처리할 수 있으며
    --  위에서 처리한 구문과 같은 결과를 반환하게 된다.
    --==>>
    /*
    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 직종이 CLERK;
    
    SELECT *
    FROM EMP
    WHERE JOB이 CLERK;
    
    SELECT *
    FROM EMP
    WHERE JOB = CLERK;
    --==>> 에러 발생
    /*
    ORA-00904: "CLERK": invalid identifier
    00904. 00000 -  "%s: invalid identifier"
    *Cause:    
    *Action:
    529행, 13열에서 오류 발생
    */
    
    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';
    --==>>                    --// 쿼리문은 대소문자 구분 안 함
    /*
    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';
    --==>> 
    /*
    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
    */
    
    --※ 오라클에서 .. 입력된 데이터(값) 만큼은
    --   반.드.시 대소문자 구분을 한다.

    • AND 연산자
      - 적혀진 모든 조건을 만족해야할 때 사용하는 연산자
    --○ EMP 테이블에서 직종이 CLERK 인 사원들 중
    --   20번 부서에 근무하는 사원들의
    --   사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.
    SELECT 사원번호, 사원명, 직종명, 급여, 부서번호
    FROM EMP;
    WHERE 직종이 CLERK  부서번호가 20;
    
    SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
    FROM EMP;
    WHERE 직종이 CLERK  부서번호가 20;
    
    SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
    FROM EMP;
    WHERE JOB이 CLERK  DEPTNO가 20;
    
    SELECT EMPNO "사원번호", ENAME "사원명", JOB "직종명", SAL "급여", DEPTNO "부서번호"
    FROM EMP;
    WHERE JOB = 'CLERK'  DEPTNO = 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
    */

    • >= , <= 
      크거나 같다, 작거나 같다의 경우에는 자바와 동일하게 사용한다.
    --○ EMP 테이블에서 10번 부서에 근무하는 직원들 중
    --   급여가 2500 이상인 사원들의 
    --   사원명, 직종명, 급여, 부서번호 항목을 조회한다.
    SELECT 사원명, 직종명, 급여, 부서번호 항목
    FROM EMP
    WHERE 부서번호 10 급여가 2500 이상;
    
    SELECT ENAME, JOB, SAL, DEPTNO
    FROM EMP
    WHERE JOB ='CLERK' AND DEPTNO = 20;
    
    SELECT ENAME"사원명", JOB"직종명", SAL"급여", DEPTNO"부서번호 항목"
    FROM EMP
    WHERE DEPTNO = 10 SAL가 2500이상;
    
    SELECT ENAME"사원명", JOB"직종명", SAL"급여", DEPTNO"부서번호 항목"
    FROM EMP
    WHERE DEPTNO = 10 SAL >= 2500;
    
    SELECT ENAME"사원명", JOB"직종명", SAL"급여", DEPTNO"부서번호 항목"
    FROM EMP
    WHERE DEPTNO = 10 AND SAL >= 2500;
    --==>>
    /*
    KING	PRESIDENT	5000	    10
    */

    • 실습용 테이블 복사하기
      - TBL_EMP, TBML_DEPT
    더보기
    --※ EMP 테이블과 같은 테이블을 생성하고자 한다.
    --   (내부적으로 대상 테이블 안에 있는 데이터 내용만 복사)
    
    --① 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)    
    */
    
    --② 파악한 구조를 토대로 테이블 생성
    CREATE TABLE EMPCOPY
    ( EMPNO NUMBER(4)
    , ENAME VARCHAR2(10)
    , JOB   VARCHAR2(9)
       :
    )
    
    --③ 대상 테이블의 데이터를 확인하여
    --   새로 생성한 테이블에 데이터 입력
    SELECT *
    FROM EMP;
    
    INSERT INTO EMPCOPY ...;
    
    SELECT *
    FROM EMP;
    
    --※ 날짜 관련 세션 정보 설정
    ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
    --==>> Session이(가) 변경되었습니다.
    
    SELECT *
    FROM EMP;
    
    
    CREATE TABLE TBL_EMP
    AS
    SELECT *
    FROM EMP;
    --==>> Table TBL_EMP이(가) 생성되었습니다.
    
    
    --○ 복사한 테이블 확인
    SELECT *
    FROM TBL_EMP;
    --==>>
    /*
    7369	SMITH	CLERK	    7902	    1980-12-17	800		        20
    7499	ALLEN	SALESMAN	7698	1981-02-20	1600    	300	    30
    7521	WARD	SALESMAN	7698	1981-02-22	1250	    500	    30
    7566	JONES	MANAGER	    7839	1981-04-02	2975		    20
    7654	MARTIN	SALESMAN	7698	1981-09-28	1250    	1400	    30
    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
    7844	TURNER	SALESMAN	7698	1981-09-08	1500	    0	    30
    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
    */
    더보기
    --○ 테이블 복사(DEPT → TBL_DEPT)
    CREATE TABLE TBL_DEPT
    AS
    SELECT *
    FROM DEPT;
    --==>> Table TBL_DEPT이(가) 생성되었습니다.
    
    
    --○ 복사한 테이블 확인
    SELECT *
    FROM DEPT;
    SELECT *
    FROM TBL_DEPT;

    • 코멘트 정보 확인
      - 테이블 코멘트 정보 확인 / 입력 
      - 컬럼레벨 코멘트 정보 확인 / 입력
    --○ 테이블 코멘트 정보 확인 --// 오라클 내부 장부
    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)	
    TBL_EMP     	TABLE	(null)	
    TBL_DEPT    	TABLE	(null)	
    */
    
    --○ 테이블 코멘트 정보 입력
    COMMENT ON TABLE TBL_EMP IS '사원데이터';
    --==>> Comment이(가) 생성되었습니다.
    
    
    --○ 코멘트 정보 입력 이후 다시 확인(조회)
    SELECT *
    FROM USER_TAB_COMMENTS;
    --==>>
    /*
    TBL_DEPT        	TABLE	(null)	
    TBL_EMP         	TABLE	사원데이터
    TBL_EXAMPLE2    	TABLE	(null)	
    TBL_EXAMPLE1    	TABLE	(null)	
    SALGRADE        	TABLE	(null)	
    BONUS           	TABLE	(null)	
    EMP             	TABLE	(null)	
    DEPT            	TABLE	(null)	
    */
    
    --○ 테이블 레벨의 코멘트 정보 입력(TBL_DEPT → 부서데이터)
    COMMENT ON TABLE TBL_DEPT IS '부서데이터';
    --==>> Comment이(가) 생성되었습니다.
    
    --○ 코멘트 정보 입력 이후 다시 확인(조회)
    SELECT *
    FROM USER_TAB_COMMENTS;
    --==>>
    /*
    TBL_DEPT    	TABLE	부서데이터
    TBL_EMP      	TABLE	사원데이터
    TBL_EXAMPLE2	TABLE	(null)	
    TBL_EXAMPLE1	TABLE	(null)	
    SALGRADE    	TABLE	(null)	
    BONUS       	TABLE	(null)	
    EMP         	TABLE	(null)	
    DEPT        	TABLE	(null)	
    */

    --○ 컬럼 레벨의 코멘트 정보 확인    --// COL = COLUMN 
    SELECT *
    FROM USER_COL_COMMENTS;
    --==>>
    /*
    TBL_EMP	JOB	
    EMP	JOB	
    TBL_EXAMPLE2	NAME	
    DEPT	LOC	
    BONUS	COMM	
    BONUS	SAL	
    EMP	SAL	
    SALGRADE	LOSAL	
    TBL_DEPT	DEPTNO	
    TBL_EMP	EMPNO	
    TBL_DEPT	DNAME	
    TBL_EMP	DEPTNO	
    TBL_EMP	ENAME	
    TBL_EMP	MGR	
    EMP	DEPTNO	
    SALGRADE	HISAL	
    EMP	EMPNO	
    TBL_EXAMPLE1	NAME	
    DEPT	DEPTNO	
    DEPT	DNAME	
    TBL_EMP	HIREDATE	
    EMP	COMM	
    SALGRADE	GRADE	
    TBL_EXAMPLE1	ADDR	
    TBL_EXAMPLE2	ADDR	
    EMP	HIREDATE	
    TBL_EXAMPLE2	NO	
    BONUS	JOB	
    TBL_EXAMPLE1	NO	
    TBL_EMP	COMM	
    TBL_EMP	SAL	
    EMP	ENAME	
    EMP	MGR	
    TBL_DEPT	LOC	
    BONUS	ENAME	
    */
    SELECT *
    FROM USER_COL_COMMENTS
    WHERE TABLE_NAME = 'TBL_DEPT';
    --==>>
    /*
    TBL_DEPT	DEPTNO	(null)		
    TBL_DEPT	DNAME	(null)		
    TBL_DEPT	LOC	    (null)		
    */
    
    --○ 테이블에 소속된(포함된) 컬럼 레벨의 코멘트 정보 등록(설정)      --// '.'
    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	    부서위치
    */
    더보기
    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;
    
    
    --○ 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 '부서번호';
    
    --○ 코멘트 데이터가 입력된 테이블 (TBL_EMP)의 컬럼 레벨의 정보 확인
    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	    부서번호
    */
    728x90
Designed by planet-si