[SQL] VIEW ORACLE/SQL 2012. 3. 29. 17:40

뷰는 하나의 가상 테이블이다. 실제 데이터가 저장되는 것이 아니라 이를 통하여 데이터를 관리하면서 간단한 쿼리 작성만으로 원하는 결과를 얻을 수가 있다.

다음은 뷰의 제약 조건이다.

1. 테이블 상 NOT NULL로 만든 컬럼들이 뷰에 포함되어야한다.

2. ROWID, ROWNUM, NEXTVAL, CURRVAL등 같은 가상에 대한 참조를 한다면 INSERT 작업이 불가능하다.

3. WITH READ ONLY 옵션을 설정한 뷰에도 데이터 갱신이란 없다.

4. WITH CHECK OPTION을 설정한 뷰의 경우 조건에 해당하는 경우만 INSERT, DELETE, UPDATE가 가능하다.

 

다음은 뷰 생성 예제이다.

CREATE OR REPLACE VIEW v_view AS

SELECT A.ID, B.NAME

FROM t_table A, t_table_sec B

WHERE A.ID = B.ID

 

WITH READ ONLY를 살펴보면 SELECT만 가능한 뷰를 생성한다.

CREATE OR REPLACE VIEW v_view AS

SELECT ID, NAME

FROM t_table

WHERE VALUE = 10

WITH READ ONLY

 

하지만 여기에서 WITH CHECK ONLY를 적용을 한다면 VALUE = 10에 의한 조건에 의해 INSERT, DELETE, UPDATE가 가능하다.

VIEW에 대한 정보는 USER_VIEW를 조회하면 확인이 가능하다.

[SQL] Index ORACLE/SQL 2012. 3. 29. 17:33

인덱스는 테이블이나 클러스트 상 쓰여지는 것으로 원하는 레코드를 빠르게 찾기 위한 데이터 주고이다.

이는 조건절이나 조인절에서 주로 자주  쓰이는 것이 대상이 적합하며 테이블 규모가 작거나 자주 바뀌는 경우에는 적합하지 않다.

인덱스의 종류는 다음과 같다.

 

1. BITMAP INDEX - 적은 개수의 특정한 값이 있는 경우 적합하다. 이는 인덱스 구조가 B-TREE 구조임을 감안 할 때 테이블의 크기가 크거나 변경 사항이 잘 없는 경우와 이를 사용하지 않을 경우 적합하다.

CREATE BITMAP INDEX idx_no ON t_table(NO);

 

2. UNIQUE INDEX - 컬럼의 중복을 포함하지 않고 PK와 UNIQUE 조건시 생성된다.

CREATE UNIQUE INDEX idx_no ON t_table(NO);

 

3. NON-UNIQUE INDEX - 컬럼의 중복을 허락하는 데이터를 가질 수 있다.

CREATE INDEX idx_no ON t_table(NO);

 

4. 결합 인덱스 - 여러개의 컬럼에 생성이 가능하며 총 16개까지 가능하다.

CREATE UNIQUE INDEX idx_no ON t_table(NO,NAME,ID);

 

인덱스의 삭제는 DROP을 통하여 하며 데이터사전 정보를 확인하려면 USER_INDEXES를 조회하면 확인이 가능하다.

 

[SQL] ROLLUP, CUBE ORACLE/SQL 2012. 3. 29. 17:22

둘다 누적에 대한 통계에 이용하면 편리한 내용이다.

ROLLUP의 경우 각 해당하는 분야에 대하여 데이터가 있다면 누적이 되서 그 기준에 대하여 통계를 나타낸다.

다음은 그 예제이다.

SELECT A.NAME, A.TITLE, SUM(B.QTY)

FROM t_table A, t_table_sec B

WHERE A.ID = B.ID

GROUP BY ROLLUP (A.NAME, A.TITLE)

위 쿼리에 대한 결과는 대략 아래와 같다.

A.NAME        A.TITLE      QTY

-------         -------      -----

JIM              A                     3

JIM              B                     2

JIM                                     5

BOBBY        C                     1

BOBBY        A                     2

BOBBY                               3

                                         8

하지만 각기 TITLE별의 총 합을 보려면 TITLE에 대한 것만 또다시 SELECT 하여 ROLLUP 한 것을 UNION 키셔 줘야한다. 즉 두번의 ROLLUP이 들어간다는 것이다.

하지만 큐브를 사용하면 아래와 같은 결과를 가질 수가 있다.

 

SELECT A.NAME, A.TITLE, SUM(B.QTY)

FROM t_table A, t_table_sec B

WHERE A.ID = B.ID

GROUP BY CUBE (A.NAME, A.TITLE)

A.NAME        A.TITLE      QTY

-------         -------      -----

JIM              A                     3

JIM              B                     2

JIM                                     5

BOBBY        C                     1

BOBBY        A                     2

BOBBY                               3

                  A                     5

                  B                     2

                  C                     1