1. VIEW(뷰)

   (1) 테이블이 다른 사용자가 봐서는 안되는 컬럼이 있을 때, 컬럼 가리고 보여주고 싶을 때

   (2) 복잡하고 자주 Join을 할 때

   (3) 날리는 쿼리의 길이가 짧으니 Network 트래픽에 도움을 준다.


-> 권한이 안주어져 있는 계정이라면 SYS 계정으로 권한을 부여해야 한다.

    (ORACLE에서 지원하는 연습계정은 권한이 부여 되어 있는듯?)

       HR>CONN / AS SYSDBA;

       SYS>GRANT CREATE VIEW TO HR;


   [EX] CREATE OR REPLACE VIEW [V_원하는 명칭]

         AS

             SELECT ... FROM ... WHERE ... ;

         

         -> 삭제는 DROP VIEW [V_원하는 명칭];


   * Inline VIEW(1회용 뷰) : FROM절에 서브쿼리를 써줌

        [EX] SELECT ... 

              FROM SELECT ...

                         FROM ...

                         WHERE ... )

              WHERE ... ;



2. SEQUENCE(시퀀스) : 자동증가(넘버링)

   -> 동시 접속이 생기는 상황에서 유용할듯?


   [EX] CREATE SEQUENCE [SEQ_원하는 명칭]

         INCREMENT BY 1 -- 증가값

         MINVALUE 1       -- 최소값

         START WITH 1     -- 시작번호(기본값 1)

         ;

        -> 조건을 더 다양하게 줄 수 있지만 머리 아프니깐 생략!


        INSERT INTO [생성되어 있는 테이블명]

   VALUES ( [SEQ_원하는 명칭].NEXTVAL, 'ORACLE 기초', '기초학습자', '20161221' );


         -> 삭제는 DROP SEQUENCE [SEQ_원하는 명칭];


1. Cartesian Product(카티션 곱)

   : Join 조건이 없이 그대로 붙이는 것 (참조되는 테이블의 행 수의 곱이 결과값이 된다.) <- 그래서 카티션 곱인듯ㅋ



2. Equip Join 

   : 흔히 쓰는 Join (동일한 값으로 Join 걸어 줄 때)



3. Non-Equip Join 

   : 잘 안쓰일듯한 Join (범위로 Join 걸어 줄 때)  [ex] BETWEEN A AND B



4. Outer Join (덱스가 있어도 Full Scan을 하므로 속도가 너무 느려짐!! 안쓰길 권장!!!)

   (1) LEFT OUTER JOIN (왼쪽에 있는 테이블을 다 보고 싶을 때)  

      [ex] 왼쪽 테이블에 Join으로 엮이는 컬럼이 null 값이 있다던지..

   (2) RIGHT OUTER JOIN (오른쪽에 있는 테이블을 다 보고 싶을 때)

   


5. Self Join

   : 동일한 테이블을 두개를 쓰고 Alias를 달리 해서 지지고 볶는 일.

    [EX] ... FROM EMPLOYEE A JOIN EMPLOYEE B ON A.MANAGER_ID = B.EMPLOYEE_ID ...



6. Sub Query (참고로 Sub Query는 데이터가 적을 때 빠른긴 함) 

   (1) 두 번 조건을 줘야할 때 유용하게 쓸 수 있는데, Join이 빠를지 얘가 빠를지를 고민해서 쓰도록 합시다!

   (2) 밑에 EX에서 괄호 사이의 쿼리가 다중행 리턴 시, 사용하는 것들 - IN , >ANY , <ANY , <ALL , >ALL (잘 안쓰일듯..)

   [EX] ... FROM EMPLOYEE WHERE MANAGER_ID = (SELECT EMPLOYEE_ID ...) ...


ROWNUM을 활용하여 간단하게 순번을 지정 할 수 있기 때문에 간편하게 순번들을 먹일것입니다.

 

(EX) "ABC" TABLE

 

A

B

C

TEST12

TESTTEST12

TESTTESTTEST12 

TEST123

TESTTEST123

TESTTESTTEST123 

 

 

 -> SELECT ROWNUM, A, B, C FROM ABC

 

ROWNUM 

 1

 TEST12

 TESTTEST12

TESTTESTTEST12 

 2

 TEST123

 TESTTEST123

TESTTESTTEST123 

 

 

하지만...

 

ORDER BY를 사용한다면 상황은 달라집니다.

 

왜냐?

 

ROWNUM이 ORDER BY 보다 우선순위가 앞서기 때문이죠. (ROWNUM으로 순번 먹히고 ORDER BY로 재정렬..)

 

 

 

위 상황에서 대처하는 방법

 

=> RANK 함수를 활용하여 순번을 임의로 정의해주면 됩니다.

 

 

※ A컬럼을 기준으로 순번을 먹이는 예입니다.

 

(EX) SELECT (RANK() OVER(ORDER BY A)) ROWNUMS, A, B, C FROM ABC

 

 

 

 

정상적으로 출력되는 모습을 보실 수 있을 것입니다 ^^

 


※ 기본구문

 

 - INSERT INTO [TABLE명_1(컬럼1, 컬럼2, ...)]

   SELECT [컬럼1, 컬럼2, ...] FROM [TABLE명_2] WHERE [조건]

 


 

 

[예제]  A_TABLE의 A, C, E 컬럼을 J_TABLE의 J, K, M 컬럼에 복사

 

(존재하는(생성한) 테이블 : A_TABLE, J_TABLE)

 

  1. A_TABLE의 컬럼 : A, B, C, D, E, F, G, H, I

 

1

999 

999 

999 

999 

999 

999 

999

999

999 

999 

999 

999 

 

  2. J_TABLE의 컬럼 : J, K, L, M, N

 

 J

null

null

null

null

null

 

 

=> INSERT INTO J_TABLE(J, K, M)

     SELECT A, C, E

     FROM  A_TABLE

     WHERE A > 0

 

COMMIT 해주면 복사 완료!

 

 

3. 작업 후, J_TABLE의 컬럼 : J, K, L, M, N

 

 J

null 

null 

4

5

null

6

null

 

+ Recent posts