◈ TABLE 구조 보기

SQL>DESC TABLE_NAME
 

◈ 테이블 존재 여부 알아보기

SQL>SELECT TABLE_NAME
        FROM USER_TABLES
        WHERE TABLE_NAME = '찾을 테이블 이름'
        -->찾을 테이블 이름은 대문자여야 됩니다.
 

◈ 모든 유저 보기

SQL>SELECT username
FROM ALL_USERS
 

◈ 테이블 제약조건의 확인

SQL>SELECT table_name, constraint_name, constraint_type

        FROM   USER_CONSTRAINTS

        WHERE TABLE_NAME ='STORM_CONTENT';
 

◈ 선택한 Row만큼만 보여주기

SQL>SELECT name
        FROM storm_board
        WHERE rownum <= 10

---> 이렇게 하면 데이터가 1000건이 있더라도, 1~10건만 보여주게 된다.
 
 
◈ 'LIKE' 연산자를 사용하여 case insensitive search를 할 수 있는 방법
 
필드에 'UPPER' 함수를 사용하시면 됩니다
SQL>SELECT name
        FROM storm_board
        WHERE UPPER(name)
like '%K%'
 

◈ 잠시 host상태로 나가고 싶을 때.


SQL>host
다시 sqlplus로 들어오려면 exit명령
어로 들어오시면 됩니다.
 

◈ 테이블에 새로운 컬럼의 추가

SQL>ALTER TABLE table_name ADD ( column_name DATATYPE )
;
 
ex)SQL>ALTER TABLE storm_board ADD(ip_addr VARCAHR2(15) not null)


◈ 테이블 컬럼의 삭제


SQL>ALTER TABLE table_name DROP COLUMN column_name


ex)SQL>ALTER TABLE storm_board DROP COLUMN ip_addr
-->컬럼의 삭제는 오라클 8i버전부터 되는것으로 알고 있습니다.  
 
 
◈ SQLPLUS에서 SQL문의 실행 속도 알아보기

 
SQL>SET TIMING ON

을 한 후 SELECT문을 수행하면 경과 시간이 나옵니다.
 
SQL> SELECT COUNT(name) FROM storm_board;
 
COUNT(NAME)
-----------
        286
 
경   과: 00:00:00.10


◈ SQLPLUS에서 SELECT문 사용시 데이타만 출력되고 HEADER는 안나오게 하는 방법

 
SQL>SET HEADING OFF
한후 SELECT문을 수행하면 아래와 같은 결과가 나옵니다.
 
SQL> SELECT empno, ename, mgr
         FROM emp
         WHERE rownum < 6;

7369  SMITH            7902
7499  ALLEN            7698
7521  WARD             7698
7566  JONES            7839
7654  MARTIN           7698

'컴퓨터 > DB' 카테고리의 다른 글

데이터베이스 스키마  (0) 2009.01.15
데이터 베이스 테이블스페이스  (0) 2009.01.15
오라클 힌트  (0) 2009.01.14
오라클에서 not exists, not in, minus의 성능차이  (0) 2009.01.13
Analytic Function  (0) 2009.01.13
      
Posted by k_ben

오라클 힌트

컴퓨터/DB : 2009. 1. 14. 22:17


*오라클 힌트 사용예
--------------------------------------------------
select   /*+ index( idx_col_1 ) */
           name, age, hobby
from     member
--------------------------------------------------

select /*+ leading(a) */ .... 인자로 선택된 테이블을 먼저 드라이빙하게 한다.
select /*+ ordered */ .... from 절에 나열된 순서대로 드라이빙하게 한다. 

 
*오라클 힌트 사용표

힌트의 설명 및 사용법
 
ALL_ROWS
             /*+ ALL_ROWS */
-         최소한의 자원을 사용하여 결과값의 전체를 추출하게 합니다.
 
AND_EQUAL
             /*+ AND_EQUAL (table index index [index] [index] [index] ) */
-         복수의 단일 컬럼을 스캔하여 머지 방식으로 처리하게 합니다.
 
APPEND_HINT
             /*+ APPEND */
-         직렬 모드 데이터베이스에서 Direct INSERT를 실행하게 합니다.
-         Enterprise Edition 이 아닌 데이터베이스의 기본 모드는 직렬 모드입니다. 이러한 직렬 모드 데이터 베이스에서의 INSERT 작업은 Conventional를 기본값으로 하고 병렬 처리 시에는 Direct INSERT를 기본값으로 합니다.
 
CACHE_HINT
             /*+ CACHE (table) +/
-         풀 테이블 스캔의 사용 시, 테이블에서 읽어온 블럭을 버퍼의 LRU 리스트 의 MRU 쪽에 위치시킵니다. 작은 테이블의 사용 시 유용합니다.
 
CHOOSE_HINT
             /*+ CHOOSE +/
-         Rule-Based 와 Cost-Based 방식 간의 선택을 유도합니다. 선택 기준은 사용 객체의 분석 정보 존재 여부이며, 사용되는 객체들중 하나라도 분석 정보가 존재한다면 Cost-Based 방식을 사용하게 됩니다.
 
CLUSTER_HINT
             /*+ CLUSTER (table) +/
-         지정 테이블의 클러스터 스캔을 유도합니다. 클러스터된 객체에만 사용할 수 있습니다.
 
CURSOR_SHARING_EXACT
             /*+ CURSOR_SHARING_EXACT +/
-         바인드 변수 값의 교체를 불가능하게 합니다.
-         기본적으로 CURSOR_SHARING 파라미터를 사용하여, 안전하다고 판단될 시 SQL 내의 바인드 변수 값을 교체할 수 있게 되어 있습니다.
 
DRIVING_SITE
             /*+ DRIVING_SITE (table) +/
-         오라클이 선택한 SITE 대신, 지정한 SITE를 사용하여 쿼리를 실행합니다. Rule-Based 와 Cost-Based, 두 모드 다 사용 가능합니다.
 
DYNAMIC_SAMPLING
             /*+ DYNAMIC_SAMPLING ( [table] n ) +/
-         해당 객체의 Selectivity 와 Cardinality 에 대한 보다 자세한 정보를 자동으로 생성시켜 실행합니다.
-         값은 0 부터 10 까지 지정할 수 있으며, 높을 수록 보다 자세한 정보를 생성하게 됩니다. 테이블에 해당 값을 지정하지 않았을 경우, 기본 값은 CURSOR 레벨의 값이 쓰여집니다.
 
EXPAND_GSET_TO_UNION
             /*+ EXPAND_GSET_TO_UNION +/
-         GROUP BY GROUPING SET 혹은 GROUP BY ROLLUP 등과 같은 구문을 포함하는 쿼리에 사용할 수 있습니다.
-         이 힌트는 기존의 쿼리를 개별적인 그룹 생성 후, UNION ALL 방식으로 실행되게 유도합니다.
 
FACT_HINT
             /*+ FACT (table) +/
-         스타 변형 구문에서 사용되며 해당 테이블이 FACT 테이블로 사용되게 유도합니다.
 
FIRST_ROWS
             /*+ FIRST_ROWS (n) +/
-         전체 결과값의 반환 대신 지정한 숫자만큼 로우의 결과값을 반환하는데 집중하게 유도합니다.
 
FULL_HINT
             /*+ FULL (table) */
-         지정한 테이블에 대해 풀 테이블 스캔을 유도합니다.
 
HASH_HINT
             /*+ HASH (table) */
-         지정한 테이블에 대해 hash 스캔을 수행하도록 유도합니다.
-         클러스터 테이블 만을 대상으로 합니다.
 
HASH_AJ
             /*+ HASH_AJ */
-         EXISTS 구문 뒤에 오는 서브 쿼리에 사용되며 HASH_SJ, MERGE_SJ 혹은 NL_SJ 등을 사용할 수 있습니다.
-         HASH_SJ 은 hash semi-join 이고, MERGE_SJ 은 sort merge semi-join 이며 NL_SJ 은 nested loop semi-join 입니다.
 
INDEX
             /*+ INDEX (table index [index] [index] ... ) */
-         지정한 테이블의 인덱스 스캔을 실행하도록 유도합니다.
-         Domain, B-tree, bitmap, bitmap join 인덱스 등이 사용될 수 있으나, bitmap 인덱스 들의 사용 시, INDEX 힌트보다는 INDEX_COMBINE 힌트 사용이 추천됩니다.
 
INDEX_ASC
             /*+ INDEX-ASC (table [index] [index] ... ) +/
-         해당 테이블의 인덱스를 순차적 방식으로 스캔하게 합니다.
-         해당 쿼리가 인덱스 범위 스캔의 사용 시, 인덱스 값의 순차적 방식으로 읽게 됩니다.
 
INDEX_COMBINE
             /*+ INDEX_COMBINE (table [index] [index] ... ) +/
-         해당 테이블에 Bitmap 인덱스의 존재 시, Bitmap 인덱스를 통한 액세스를 유도합니다.
-         힌트 내에 인덱스의 이름이 쓰여지지 않을 시, 해당 인덱스의 Boolean 값을 사용하여 최적의 Cost를 산출하여 실행하게 됩니다.
 
INDEX_DESC
             /*+ INDEX_DESC (table [index] [index] ... ) +/
-         지정한 인덱스에 대해 인덱스 스캔을 역순으로 실행합니다.
-         해당 쿼리가 인덱스 범위 스캔의 사용 시, 인덱스 컬럼의 값을 사용하여 역순으로 실행합니다.
-         파티션 인덱스에서는 파티션 별 개별적인 실행이 이루어집니다.
 
INDEX_FFS
/*+ INDEX_FFS (table [index] [index] ... ) +/
-         풀 테이블 스캔 대신에 빠른 풀 테이블 스캔의 실행을 유도합니다.
 
LEADING_HINT
             /*+ LEADING (table) +/
-         테이블 간의 조인 시에 지정한 테이블을 먼저 수행하도록 유도합니다.
-         두 개 이상의 LEADING 힌트의 사용 시, 힌트 자체가 사용되어 지지 않습니다.
-         ORDERED 힌트와 더불어 사용시, LEADING 힌트는 사용되지 않습니다.
 
MERGE
             /*+ MERGE (table) +/
-         각 쿼리의 결과값을 머지합니다.
-         해당 쿼리 내에 GROUP BY 절의 사용 이나 SELECT 구문에 DISTINCT 가 사용되었을 시, 머지의 실행이 가능할 경우에만 힌트가 실행됩니다.
-         IN 과 서브 쿼리의 사용 시, 서브 쿼리와 상위 쿼리 간의 상호 관계가 없을 때에만 머지의 실행이 가능합니다.
-         이 힌트는 Cost-based 가 아닙니다. 따라서 액세스하는 실행 쿼리 블럭에 MERGE 힌트가 반드시 명시되어야만 합니다. 그렇지 않을 경우 옵티마이저는 다른 실행 계획을 수립합니다.
 
MERGE_AJ
             HASH_AJ 를 참조하십시요.
 
MERGE_SJ
             HASH_AJ 를 참조하십시요.
 
NL_AJ
             HASH_AJ 를 참조하십시요.
 
NL_SJ
             HASH_AJ 를 참조하십시요.
 
NOAPPEND
             /*+ NOAPPEND +/
-         병럴 모드에서의 INSERT 작업을 Conventional 방식으로 수행합니다.
-         병렬 모드에서는 Direct-path INSERT 가, 직렬 모드에서는 Conventional INSERT가 기본값입니다.
 
NOCACHE
             /*+ NOCACHE (table) +/
-         풀 테이블 스캔의 사용 시, 테이블에서 읽어온 블럭을 버퍼의 LRU 리스트 의 LRU 쪽에 위치시킵니다. 기본 모드입니다.
 
NO_EXPAND
             /*+ NO_EXPAND +/
-         실행 쿼리 내에 OR 나 WHERE 절의 IN 이 사용되었을 시, Cost-Based 옵티마이저가 쿼리 처리를위해 OR 를 사용한 확장을 사용하는 것을 방지합니다.
-         일반적으로 옵티마이저는 위와 같은 경우 OR – 확장의 가격이 확장을 사용하지 않는 것보다 적을 시, 확장 방식으로 수행합니다.
 
NO_FACT
             /*+ NO_FACT (table) +/
-         Star 변형 시, 해당 테이블의 FACT 테이블로서의 사용을 방지합니다.
 
NO_INDEX
             /*+ NO_INDEX (table [index] [index] ... ) +/
-         지정 테이블의 인덱스 사용을 방지합니다.
 
NO_MERGE
             /*+ NO_MERGE (table) +/
-         머지 처리 방식의 사용을 방지합니다.
 
NOPARALLEL
             /*+ NOPARALLEL (table) +/
-         지정한 테이블의 병렬 처리를 방지합니다.
-         테이블의 지정된 PARALLEL 값에 대해서 우선권을 가집니다.
-         중첩 테이블에 대해서는 병렬 처리를 할 수 없습니다.
 
NOPARALLEL_INDEX
             /*+ NOPARALLEL_INDEX (table [index] [index] ... ) +/
-         인덱스 스캔 작업의 병렬 처리를 방지합니다.
-         인덱스에 지정된 PARALLEL 값에 우선권을 가집니다.
 
NO_PUSH_PRED
             /*+ NO_PUSH_PRED (table) +/
-         결과값에 대한 조인 방식 서술의 강제적 수행을 방지합니다.
 
NO_PUSH_SUBQ
             /*+ NO_PUSH_SUBQ +/
-         서브 쿼리의 결과값을 머지하지 않는 실행 계획이 실행 계획 설립 단계에서 제일 마지막으로 참조되는 것을 방지합니다.
-         일반적으로 서브 쿼리의 Cost 가 높거나, 처리 로우의 갯수를 크게 줄여주지 못할 때에는 서브 쿼리를 마지막에 참조하는 것이 성능 향상에 도움이 됩니다.
 
NOREWRITE
             /*+ NOREWRITE +/
-         해당 쿼리 블럭의 쿼리 재생성의 실행을 방지합니다.
-         QUERY_REWRITE_ENALBE 파라미터에 대해 우선권을 가집니다.
-         NOREWRITE 힌트의 사용 시, Function-Based 인덱스의 사용이 금지됩니다.
 
NO_UNNEST
             /*+ NO_UNNEST +/
-         해당 서브 쿼리 블럭의 UNNESTING 설정의 사용을 방지합니다.
 
ORDERED
             /*+ ORDERED +/
-         FROM 절에 나열된 테이블의 순서대로 조인 작업을 실행합니다.
 
ORDERED_PREDICATE
             /*+ ORDERED_PREDICATE +/
-         옵티마이저에 의한 조인 관계의 Cost를 산출하기 위해 미리 정해둔 조인 관계 별 실행 순서의 사용을 방지합니다.
n         인덱스 키를 사용한 조인 관계들은 제외됩니다.
-         이 힌트는 쿼리의 WHERE 절에 사용하십시요.
 
PARALLEL
             /*+ PARALLEL (table [ [, n |, DEFAULT |, ] [, n | DEFAULT ] ] ) +/
-         병렬 처리에 사용될 서버 프로세스의 갯수를 설정합니다.
-         병렬 처리 조건에 위배될 시, 힌트는 사용되지 않습니다.
-         임시 테이블에 대한 PARALLEL_HINT 사용 시, 힌트는 사용되지 않습니다.
 
PARALLEL_INDEX
             /*+ PARALLEL_INDEX (table [ [index] [, index]...]
[ [, n |, DEFAULT |, ] [, n | DEFAULT ] ] ) +/
-         파티션 인덱스의 인덱스 범위 스캔 작업의 병렬 처리에 할당될 서버 프로세스의 갯수를 지정합니다.
 
PQ_DISTRIBUTE
             /*+ PQ_DISTRIBUTE (table [,] outer_distribution, inner_distribution) +/
-         병렬 조인 시, Producer 프로세스와 Consumer 프로세스 간의 데이터 전달 방식을 지정합니다.
 
PUSH_PRED
             /*+ PUSH_PRED (table) +/
-         결과값에 대한 조인 방식 서술의 강제적 수행을 실행합니다.
 
PUSH_SUBQ
             /*+ PUSH_SUBQ +/
-         머지가 불가능한 서브 쿼리들의 우선 실행 계획을 실행 계획 수립시 먼저 참조하도록 합니다.
-         서브 쿼리의 사용 객체가 Remote 테이블이거나, 머지 조인의 사용 시 힌트는 실행되지 않습니다.
 
REWRITE
             /*+ REWRITE [ ( [materialized_view] [materialized_view]...) ] +/
-         실행 계획의 가격에 상관없이 Materialized View 를 사용하여 쿼리 재생성을 하도록 합니다.
-         Materialized View 를 지정할 시, 지정한 Materialized View 의 가격에 상관없이 무조건 쿼리 재생성을 실행합니다.
-         Materialized View 를 지정하지 않을 시, 오라클은 사용 가능한 모든 Materialized View 를 참조하여 그 중 가장 가격이 낮은 Materialized View 를 사용하여 쿼리 재생성을 합니다.
-         Materialized View 를 지정하지 않는 힌트의 사용이 권장됩니다.
 
ROW_ID
             /*+ ROWID (table) +/
-         지정한 테이블의 스캔을 ROWID 방식으로 수행하게 합니다.
 
RULE
             /*+ RULE +/
-         실행 계획을 Rule-Based 방식으로 실행하게 합니다.
-         해당 쿼리 블럭에 다른 힌트 또한 사용되었을 경우, 다른 힌트들은 사용되지 않습니다.
 
STAR
             /*+ STAR +/
-         Star 쿼리 계획이 사용 가능하다면, 실행하게 합니다.
-         Star 쿼리 계획이란 가장 큰 테이블이 마지막 순서로 조인되며, 조인될 시 가장 큰 테이블 내의 Concatenated 인덱스에 대해 Nested Loop 조인 방식으로 실행되는 것을 말합니다.
-         최소한 세개 이상의 테이블이 사용되며, 제일 큰 테이블의 Concatenated 인덱스의 생성에 최소한 세 개 이상의 컬럼이 사용되어야 하며, 액세스나 조인 방식에 충돌이 없어야만 이 힌트는 사용됩니다.
 
STAR_TRANSFORMATION
             /*+ STAR_TRANSFORMATION +/
-         옵티마이저가 Star 변형 작업에 최적화된 실행 계획을 수립, 실행하도록 합니다.
-         힌트를 사용하지 않을 시, 옵티마이저는 일반적인 작업에 최적화된 실행 계획을 수행합니다.
-         힌트를 사용하였어도 변형 작업에 맞추어진 실행 계획을 실행한다는 보장은 없습니다. 다른 일반적인 힌트의 사용과 마찬가지로 비교 분석 후, 오라클의 판단에 따라 다른 실행 계획이 실행될 수 있습니다.
 
UNNEST
             /*+ UNNEST +/
-         서브 쿼리 블럭에 대해 인증성 만을 검사하게 합니다.
-         인증이 되었다면 그 이상의 검증 작업없이 서브쿼리에 대한 UNNESTING 의 설정을 가능하게 합니다.
 
USE_CONCAT
             /*+ USE_CONCAT +/
-         WHERE 절의 OR 조인 을 UNION ALL 로 변경하여 수행하게 합니다.
-         일반적으로 이러한 변경은 결과값의 병합 수행의 가격이 수행하지 않을 시의 가격 보다 낮을 때에만 실행됩니다.
 
USE_HASH
             /*+ USE_HASH (table [table]...) +/
-         Hash 조인 방식으로 각 테이블을 조인하게 합니다.
 
USE_MERGE
             /*+ USE_MERGE (table [table]...) +/
-         Sort-Merge 방식으로 각 테이블을 조인하게 합니다.
 
USE_NL
             /*+ USE_NL (table [table]...) +/
- Nested-Loop 방식으로 각 테이블을 조인하게 합니다

'컴퓨터 > DB' 카테고리의 다른 글

데이터베이스 스키마  (0) 2009.01.15
데이터 베이스 테이블스페이스  (0) 2009.01.15
오라클 초보자를 위한 팁  (0) 2009.01.15
오라클에서 not exists, not in, minus의 성능차이  (0) 2009.01.13
Analytic Function  (0) 2009.01.13
      
Posted by k_ben


이 문제는 오라클만의 문제가 아니고 거의 모든 RDBMS 제품들에 대해 공통적인 문제입니다.
일단 SQL 튜닝에서는 모든 상황에 항상 맞는 것은 없습니다. 

즉, SQL 튜닝엔 왕도가 없다는 말입니다. 수학공식 외우듯이 외워서 튜닝을 하는 것은 아니며 그때 그때 데이터의 분포, 서버의 상태, 인덱스의 유무 및 SQL trace나 tkprof결과 등의 각종 참조가능한 수치들을 분석하여 튜닝방향을 정합니다.
상황에 따라 다른 모든 경우엔 가장 안 좋던 방법이 특정 경우엔 최적의 솔루션이 될 수 있습니다.

질문의 3가지 + @ 방법의 두드러진 특징만 구별할 수 있어도 판단에 많은 도움이 되겠지요.

A 집합에서 B집합의 데이터를 제외한 나머지만 구하는 방법은 질문의 3가지를 포함하여 상황에 따라 보통 크게 5가지정도를 주로 쓰게 됩니다. 하나씩 특징만 간단히 적겠습니다...자세한 내용은 직접 공부하세요...;

 

1. not in ...

SELECT *
  FROM A
 WHERE a.key not in (SELECT b.key FROM B)

형태의 구문이며, B쪽을 먼저 access하여 b.key로 a.key에 공급자역할을 하는 서브쿼리로 쓰고 싶을 때 주로 사용합니다.

 

2. not exists ...

SELECT *
  FROM A
 WHERE not exists (SELECT *
                     FROM B
                    WHERE b.key = a.key)

형태의 구문이며, A쪽을 먼저 access하고 나서 a의 각 row들을 not exists로 조사하여 filtering하는 처리를 할 때 주로 사용합니다. 즉, B를 access하기 전에 A쪽의 전체범위가 먼저 access됩니다.

이 때의 서브쿼리는 공급자가 아닌 확인자역할만 해 줄 수 있습니다.

 

3. minus ...

SELECT key, col1, col2 FROM A
MINUS
SELECT key, col1, col2 FROM B

형태의 구문이며, 테스트 해 보면 아시겠지만 MINUS는 특성 상 sort와 중복제거 수행을 동반합니다.
그러므로 가장 이해하기는 간단하나 대용량에서는 사용 시 주의해야 합니다.

A나 B집합의 access대상이 대량인 경우 대량의 sort와 중복제거가 발생하므로 이들 처리에 많은 시간이 소요될 수 있는 쿼리입니다.

 

4. Outer + Null Check ...

SELECT *
  FROM A, B
 WHERE A.key = B.Key(+)
   AND B.Key IS NULL

형태의 구문이며, 위의 not in이나 not exists가 주로 Nested Loop Join 또는 Nested Loop Anti Join 방법을 수행하는데 비해 대용량의 경우 Hash Join이나 Merge Join을 유도하여 성능을 보장받을 수 있는 방법입니다.

단, 각 DBMS 마다 A LEFT OUTER JOIN B ON ~ , (*)등으로 아우터조인에 대한 표현은 약간 씩 다릅니다.

 

5. UNION ALL + Group count 또는 count() over() 분석함수 이용등 ...

SELECT *
 FROM( SELECT a.*,
              COUNT(DISTINCT gbn) OVER(PARTITION BY key) AS cnt
,
              COUNT(DISTINCT DECODE(gbn, 'A', 1)) OVER(PARTITION BY key) AS a_cnt
    
    FROM( SELECT 'A' AS gbn, key, col1, col2
                 FROM A
               UNION ALL
               SELECT 'B' AS gbn, key, col1, col2
                 FROM B
              ) a
     )
 WHERE cnt < 2 AND a_cnt = 1

형태의 구문이며, UNION ALL은 MINUS와 달리 sort나 중복제거를 하지 않고 별다른 조인도 없기 때문에 양쪽집합에 scan할 마땅한 인덱스가 없거나 하는 상황에서 위력을 발휘할 수 있는 솔루션입니다.

GROUP BY와 COUNT 함수로도 위의 의미를 그대로 만들 수 있습니다...분석함수나 통계함수를 지원하지 않는 DBMS들은 COUNT() OVER() 대신 GROUP BY / COUNT로 변경해야겠지요...;

 이외에도 구현할 수 있는 방법들이야 더 있겠지만, 대부분의 상황들에서 위의 예시들이 주로 많이 쓰인다는 것을 거듭 밝힙니다.

 건승하시길...수고하세요~~ 


'컴퓨터 > DB' 카테고리의 다른 글

데이터베이스 스키마  (0) 2009.01.15
데이터 베이스 테이블스페이스  (0) 2009.01.15
오라클 초보자를 위한 팁  (0) 2009.01.15
오라클 힌트  (0) 2009.01.14
Analytic Function  (0) 2009.01.13
      
Posted by k_ben

Analytic Function

컴퓨터/DB : 2009. 1. 13. 19:06


***() OVER()함수들 모음


NTILE


순서화된 데이터를 expr에 의해 지정된 bucket의 수로 분할하여, 각 행을 적절한 bucket 번호를 할당, 출력 결과를 사용자가 지정한 그룹 수로 나누어 출력하는 함수

 

USAGE

NTILE ( expr ) OVER (analytic_clause)

EXAMPLE

SELECT first_name,salary,NTILE(3) OVER (ORDER BY salary DESC)
FROM employees
WHERE job_id = 'IT_PROG';

RESULT

FIRST NAME           SALARY         NTILE(3) OVER (ORDER BY salary DESC)
-------------------------------------------------------------------
Alexander               9000                1
Bruce                     6000                1
David                     4800                2
Valli                       4800                2
Diana                     4200                3

 


COUNT OVER

조건을 만족하는 행의 수를 반환합니다.

 

USAGE

COUNT ( expr ) OVER (analytic_clause)

EXAMPLE

SELECT employee_id,salary,COUNT(*) OVER (ORDER BY salary) AS count
FROM employees
WHERE department_id = 50;


SUM OVER

조건을 만족하는 행의 합을 반환합니다.

USAGE

SUM ( expr ) OVER (analytic_clause)

EXAMPLE

SELECT employee_id,last_name,salary,
SUM(salary) OVER (ORDER BY employee_id) AS acc_salary
FROM employees

 

DECODE

CASE나 IF-THEN-ELSE문처럼 조건부 결과를 반환

USAGE

DECODE(칼럼이름, 비교값, 입력값,
                [비교값2, 입력값2..]
      ,기본값)

EXAMPLE

SELECT last_name,job_id,salary,
DECODE(job_id, 'IT_PROG',1.10*Salary,
        'ST_CLERK',1.15*Salary,
             'SA_REP', 1.20*Salary,
       salary) as Recieve
FROM employees

 

RANK

값의 그룹에서 해당값의 절대순위를 계산
1위 - 공동2위 - 공동2위- 공동2위 - 공동 5위 - 공동 5위 - 7위 순서

USAGE

RANK (expr) WITH GROUP(ORDER BY expr)
RANK () OVER(query_partition_clause order_by_clause);

EXAMPLE

SELECT RANK(15500, .05)
WITHIN GROUP (ORDER BY salary DESC, commission_pct) "Rank"
FROM employees;

RESULT

Rank
----------
4


DENSE RANK

값의 그룹에서 해당값의 상대순위를 계산
1위 - 공동2위 - 공동2위- 공동2위 - 공동 3위 - 공동 3위 - 4위 순서

USAGE

DENSE_RANK (expr) WITH GROUP(ORDER BY expr)
DENSE_RANK () OVER(query_partition_clause order_by_clause);

EXAMPLE

SELECT DENSE_RANK(15500, .05)
WITHIN GROUP (ORDER BY salary DESC, commission_pct) "Rank"
FROM employees;

RESULT

Rank
----------
3


PERCENT_RANK

그룹 수에 대한 값의 순위 퍼센트를 반환.
최고 순위 0, 최대 순위를 1로 놓고 해당 비율을 반환

EXAMPLE

SELECT PERCENT_RANK(15000, .05) WITHIN GROUP
(ORDER BY salary DESC, commission_pct) AS Percent-Rank
FROM employees;

RESULT

Percent-Rank
-------------
.028037383


FIRST_VALUE

LAST_VALUE

FIRST_VALUE 함수는 받아온 데이터에서 가장 첫번째 데이터를 반환한다.
LAST_VALUE 함수는 반대로 받아온 데이터에서 가장 첫번째 데이터를 반환한다.
오름차순 정렬후 FIRST_VALUE함수로 얻은 데이터는
내림차순 정렬후 LAST_VALUE함수로 얻은 데이터와 같다. (반대의 경우도 마찬가지)

USAGE

FIRST_VALUE(expr) OVER (analyic_clause)
LAST_VALUE(expr) OVER (analyic_clause)

EXAMPLE

SELECT employee_id,salary, FIRST_VALUE(salary)
OVER (PARTITION BY department_id ORDER BY salary DESC) as "Highsal"
FROM employees;

RESULT

employee_id  salary                 Highsal
---------------------------------------------------------
200                     4400                    4400
201                     13000                   13000

 

NVL

변수 1의 값을 체크하여 변수 1이 NULL이면 변수 2의 값을 반환하고
그렇지 않다면 변수1의 값을 반환한다.

USAGE

NVL(expr1, expr2)

EXAMPLE

SELECT last_name, nvl(manager_id, 0) AS Manager_id
FROM employees
WHERE employee_id BETWEEN 100 AND 105;

RESULT

LAST_NAME              manager_id
-----------------------------------
King                     0
Kochhar                  100

 

WIDTH_BUCKET

어떤 값의 최소에서부터 최대값을 설정하고 bucket(구간)을 지정하여 임의의 값이
지정된 범위 내에서 어느 위치에 있는지를 반환한다. <등급 지정>

USAGE

WIDTH_BUCKET(expr, min_value, max_value, num_buckets)

EXAMPLE

SELECT salary, WIDTH_BUCKET(salary, 0, 20000, 5)
FROM employees
ORDER BY salary desc


LAG

SELF JOIN하지 않고 하나의 테이블에서 동시에 한 행 이상을 접근 할 수 있게 함 - 분석용 함수로써, 이전 레코드를 참조(동일한 테이블에 있는 다른 행의 값을 참조하는 함수)

USAGE

LAG ( value_expr [,offset] [,default] )
OVER ([query_partition_clause] order_by_clause )

EXAMPLE 

SELECT last_name, salary, LAG(salary, 1, 0)
OVER (ORDER BY hire_date) AS prev_sal
 FROM employees
 WHERE job_id = 'PU_CLERK';

RESULT

last_name       salary      LAG(salary,1,0)
---------------------------------------------
Grant              3200        2600
Himuro            2600        3200
Colmenares     2500        2600

 

 

LEAD

SELF JOIN하지 않고 하나의 테이블에서 동시에 한 행 이상을 접근 할 수 있게 함
  - LAG와는 반대로 하나 앞의 레코드 값 참조

USAGE

LEAD ( value_expr [,offset] [,default] )
OVER ([query_partition_clause] order_by_clause )

EXAMPLE

SELECT last_name, salary,LEAD(salary, 1, 0)
OVER (ORDER BY hire_date) AS NextHire
FROM employees
WHERE job_id = 'PU_CLERK';

RESULT

last_name       salary      LEAD(salary,1,0)
---------------------------------------------
Grant              3200        2600
Himuro            2600        2500
Colmenares     2500        3300

'컴퓨터 > DB' 카테고리의 다른 글

데이터베이스 스키마  (0) 2009.01.15
데이터 베이스 테이블스페이스  (0) 2009.01.15
오라클 초보자를 위한 팁  (0) 2009.01.15
오라클 힌트  (0) 2009.01.14
오라클에서 not exists, not in, minus의 성능차이  (0) 2009.01.13
      
Posted by k_ben