ROUND와 TRUNC 함수
  ROUND(45.923,2)
  ROUND(45.923,0)
  ROUND(45.923,-1)
  TRUNC(45.923,2)
  TRUNC(45.923,0)
  TRUNC(45.923,-1)
→  45.92
→  46
→  50
→  45.92
→  45
→  40

ROUND 함수
  TRUNC와 ROUND함수는 argument가 있어야 한다.
  두 번째 argument값이 없거나 0이면 결과값은 소숫점이 없는 형태로 나타나게 된다.
  두 번째 argument의 값이 음수이면 해당 수만큼 좌측으로 절삭 또는 반올림한다.

※ Note : ROUND와 TRUNC 함수는 날짜 함수와 같이 쓰여질 수 있는데, 차후에 이러한 예제를 보도록 하자.

♠ 질의 예제 : 45.923을 소숫점 2자리, 0, -1자리까지 반올림한 값을 출력하라.

SQL> SELECT  ROUND(45.923,2),  ROUND(45.923,0),  ROUND(45.923,-1)
 2 FROM SYS.DUAL;


TRUNC 함수


♠ 질의 예제 : 45.923을 소숫점 2자리, 0, -1자리까지 절삭한 값을 출력하라.

 

SQL> SELECT  TRUNC(45.923,2),  TRUNC(45.923,0),  TRUNC(45.923,-1)
 2 FROM SYS.DUAL;

※ SYS.DUAL은 dummy table이다. 차후에 자세히 살펴보도록 한다.


MOD 함수
  어떠한 값을 나누고 남은 나머지를 구하고자 한다면 MOD 함수를 이용한다.
  MOD(1600,300) → 100

MOD 함수


♠ 질의 예제 : 월급여가 1400보다 큰 모든 사원에 대해 월급여를 상여금으로 나누고 난 나머지를 계산하라.

 

SQL> SELECT   last_name,MOD(salary,commission_pct)
 2 FROM s_emp
 3 WHERE  salary > 1400;


'개발 > ORCLE' 카테고리의 다른 글

오라클 서브쿼리  (0) 2008.11.12
오라클 SUBSTR 2번쨰  (0) 2008.11.10
오라클 트리거 정의  (1) 2008.10.24
오라클 문자열 처리 함수  (0) 2008.10.24
오라클 SubStr  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

트리거란?

INSERT, UPDATE, DELETE문이 TABLE에 대해 행해질 때
묵시적으로 수행되는 PROCEDURE 입니다.

Trigger는 TABLE과는 별도로 DATABASE에 저장됩니다.
Trigger는 VIEW에 대해서가 아니라 TABLE에 관해서만 정의될 수 있습니다.





- BEFORE : INSERT, UPDATE, DELETE문이 실행되기 전에 트리거가 실행됩니다.
- AFTER : INSERT, UPDATE, DELETE문이 실행된 후 트리거가 실행됩니다.
- trigger_event : INSERT, UPDATE, DELETE 중에서 한 개 이상 올 수 있습니다.
- FOR EACH ROW : 이 옵션이 있으면 행 트리거가 됩니다.

-- 행 트리거 : 컬럼의 각각의 행의 데이터 행 변화가 생길때마다 실행되며,
그 데이터 행의 실제값을 제어할수 있습니다.
-- 문장 트리거 : 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어할수 없습니다.

간단한 행 트리거 예제

SQL>CREATE OR REPLACE TRIGGER triger_test
BEFORE
UPDATE ON dept
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('변경 전 컬럼 값 : ' || : old.dname);
DBMS_OUTPUT.PUT_LINE('변경 후 컬럼 값 : ' || : new.dname);
END;
/


SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

-- UPDATE문을 실행시키면..
SQL>UPDATE dept
SET dname = '총무부'
WHERE deptno = 30

-- 트리거가 자동 실행되어 결과가 출력됩니당.
변경 전 컬럼 값 : 인사과
변경 후 컬럼 값 : 총무부

1 행이 갱신되었습니다.

간단한 행 트리거 예제2 (PLSQL BLOCK이 있는 트리거)

SQL>CREATE OR REPLACE trigger sum_trigger
BEFORE
INSERT OR UPDATE ON emp
FOR EACH ROW

DECLARE

-- 변수를 선언할 때는 DECLARE문을 사용해야 합니다
avg_sal NUMBER;

BEGIN

SELECT ROUND(AVG(sal),3)
INTO avg_sal
FROM emp;

DBMS_OUTPUT.PUT_LINE('급여 평균 : ' || avg_sal);

END;
/

트리거가 생성되었습니다.

SQL> SET SERVEROUTPUT ON ; -- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)

-- INSERT문을 실행합니다..

SQL> INSERT INTO EMP(EMPNO, ENAME, JOB, HIREDATE, SAL)
VALUES(1000, 'LION', 'SALES', SYSDATE, 5000);

-- INSERT문을 실행되기 전까지의 급여 평균이 출력됩니다.
급여 평균 : 2073.214

1 개의 행이 만들어졌습니다. 

출처 응석이랑 청미랑 커플이야기 | 다슬아빠
원문 http://blog.naver.com/seok0528/140003690939


'개발 > ORCLE' 카테고리의 다른 글

오라클 SUBSTR 2번쨰  (0) 2008.11.10
오라클 ROUND TRUNC MOD  (0) 2008.10.27
오라클 문자열 처리 함수  (0) 2008.10.24
오라클 SubStr  (0) 2008.10.24
오라클 OUTER JOIN  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

CONCAT(char1, char2)

CONCAT 함수는 Concatenation의 약자로 두 문자를 결합하는 역할을 합니다.
"
||" 연산자와 같은 역할을 합니다.

SQL>SELECT CONCATNAME FROM dual ;

                NAME
   -------------
   Oracle Korea
(’Oracle’, ’ Korea’)



INITCAP(char)

주어진 문자열의 첫 번째 문자를 대문자로 변환시켜 줍니다.

SQL>SELECT INITCAPNAME FROM dual ;

             NAME
 -------------
  Kim jung sick
(’kim jung sick’)



LOWER(char)

문자열을 소문자로 변환 시켜 줍니다.


UPPER(char)

문자열을 대문자로 변환 시켜 줍니다.

SQL>SELECT LOWERNAME FROM dual ;

            NAME
-------------
  kim jung sick
(’KIM JUNG SICK’)

SQL>SELECT UPPERNAME FROM dual ;

            NAME
--------------
KIM JUNG SICK
(’kim jung sick’)



LPAD(char1, n [,char2])
왼쪽에 문자열을 끼어 놓는 역할을 합니다. n은 반환되는 문자열의 전체 길이를
나타내며, char1의 문자열이 n보다 클 경우 char1을 n개 문자열 만큼 반환합니다.

SQL>SELECT LPADNAME FROM dual ;

          NAME
------------
 *JUNG-SICK
(’JUNG-SICK’, 10, ’*’)



RPAD(char1, n [,char2])

LPAD와 반대로 오른쪽에 문자열을 끼어 놓는 역할을 합니다.

SQL>SELECT RPADNAME FROM dual ;

          NAME
------------
  JUNG-SICK*
(’JUNG-SICK’, 10, ’*’)



SUBSTR(char, m ,[n])
  SUBSTR함수를 이용하여 m 번째 자리부터 길이가 n개인 문자열을 반환한 합니다.
 m이 음수일 경우에는 뒤에서 M번째 문자부터 반대 방향으로 n개의 문자를 반환합니다.

SQL>SELECT SUBSTRNAME FROM dual ;

          NAME
-----------
            NG-
(’JUNG-SICK’, 3, 3)

-- 뒤에서부터 자를
SQL>SELECT
SUBSTRNAME FROM dual ;

        NAME  
-----------
          ICK
(’JUNG-SICK’, -3, 3)



LENGTH(char1)

문자열의 길이를 리턴 합니다.

SQL>SELECT LENGTH FROM dual ;

      TEST
   ----------
           9
(’JUNG-SICK’) TEST



REPLACE(char1, str1, str2)
REPLACE는 문자열의 특정 문자를 다른 문자로 변환 합니다.


SQL> SELECT REPLACE "Changes" FROM DUAL;
 
Changes
--------------
BLACK and BLUE
 
 
 
SQL> SELECT
REPLACE"Changes" FROM DUAL
 
Changes
------------
BLCK and JUE
 
 
-- 대소문자를 구분한다는 것을 알수 있습니다.
SQL>SELECT
REPLACE "Changes" FROM DUAL
 
Changes
------------
JACK and JUE
(’JACK and JUE’,’j’,’BL’)
(’JACK and JUE’,’JA’,’BL’)
(’JACK and JUE’,’J’,’BL’)



INSTR

 - 문자열이 포함되어 있는지를 조사하여 문자열의 위치를 반환합니다.
 - 지정한 문자열이 발견되지 않으면 0이 반환 됩니다.
 


-- 지정한 문자 OK가 발견되지 않아서 0이 반환 됩니다.
SQL>SELECT INSTR(’CORPORATE FLOOR’,’OK’)  "Instring" FROM DUAL
 
  Instring
----------
         0


-- OR이 있는 위치 2를 반환 합니다. 왼쪽부터 비교를 한다는 것을 알 수 있습니다.
SQL>SELECT INSTR(’CORPORATE FLOOR’,’OR’)  "Instring" FROM DUAL
 
  Instring
----------
         2
 

-- 왼쪽에서 3번째부터 시작을 해서 비교를 합니다. 2번째 OR의 위치가 반환 됩니다.
SQL>SELECT INSTR(’CORPORATE FLOOR’,’OR’, 3)  "Instring" FROM DUAL 
 
  Instring
----------
         5


-- 왼쪽에서 3번째부터 시작을 해서 비교를 하는데  OR이 두 번째 검색되는 지점의 위치를 반환 합니다.
SQL> SELECT INSTR(’CORPORATE FLOOR’,’OR’, 3, 2)  "Instring" FROM DUAL;
 
  Instring
----------
       14
 



TRIM

 - 특정한 문자를 제거 합니다.  
 - 제거할 문자를 입력하지 않으면 기본적으로 공백이 제거 됩니다.
 - 리턴값의 데이터타입은 VARCHAR2 입니다.
 


-- 0을 제거 합니다.
SQL>SELECT TRIM(0 FROM 0009872348900)  "TRIM Example" FROM DUAL;
 
TRIM Example
------------
98723489
 
 
-- 어떤 문자도 입력하지 않으면 기본적으로 공백이 제거 됩니다.  
-- TRIM을 사용한 위에 예제와 사용하지 않은 아래 예제의 결과 값이 다르게 나오는 것을 알 수 있습니다.

SQL>SELECT NVL(TRIM (’  ’),’공백’)  "TRIM Example"  FROM DUAL
 
TRIM Example
------------
공백
 
 
SQL>SELECT NVL(’  ’,’공백’)  "TRIM Example" FROM DUAL
 
TRIM Example
------------
 

 

 



LTRIM

SQL>SELECT LTRIM(’xyxXxyLAST WORD’,’xy’) "LTRIM example"  FROM DUAL;
 
LTRIM example
------------
XxyLAST WORD
 
 
RTRIM

SQL>SELECT RTRIM(’BROWNINGyxXxy’,’xy’) "RTRIM example"     FROM DUAL;

RTRIM examp
-----------
BROWNINGyxX

'개발 > ORCLE' 카테고리의 다른 글

오라클 ROUND TRUNC MOD  (0) 2008.10.27
오라클 트리거 정의  (1) 2008.10.24
오라클 SubStr  (0) 2008.10.24
오라클 OUTER JOIN  (0) 2008.10.24
오라클 Length, LengthB  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

오라클 SubStr

개발/ORCLE 2008. 10. 24. 15:23

substr은 문자를 자르는 함수입니다

TEST 테이블에  TEST_DATE 라는 컬럼에 'YYYYMMDD'로 들어가있다고 치자 

EX) SUBSTR(TEST_DATE, 1, 4) FROM TEST

이러면 결과값은 'YYYY' 나올것입니다.

뒤에 1은 시작점 4는 길이라 할수있습니다.

만약 5, 2으로 바꿨다면 'MM' 이 나올겁니다.

'개발 > ORCLE' 카테고리의 다른 글

오라클 트리거 정의  (1) 2008.10.24
오라클 문자열 처리 함수  (0) 2008.10.24
오라클 OUTER JOIN  (0) 2008.10.24
오라클 Length, LengthB  (0) 2008.10.24
오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

오라클 OUTER JOIN

개발/ORCLE 2008. 10. 24. 10:59
Out(외부) Join

 - equijoin 문장들의 한가지 제약점은 그것들이 조인을 생성하려 하는 두 개의 테이블의 두 개
    컬럼에서 공통된 값이 없다면 테이블로부터 테이터를 Return하지 않는 다는 것입니다.

 - 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해 outer join을 사용합니다.
    Outer join 연산자 "( + )"입니다.

 -조인시킬 값이 없는 조인측에 "( + )"를 위치 시킵니다.


 - Outer join 연산자는 표현식의 한 편에만 올 수 있습니다.


예제1) 일반 조인의 경우

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno = b.deptno

DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30

INNER JOIN 또는 =조인이라고 부르는 조인이죠

예제2)out join을 했을 경우


SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

 DEPTNO     DEPTNO
 -------     ----------
     10         10
     20         20
     30         30
                 40

※ 다음의 쿼리를 한번 잘 보시기 바랍니다.

SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

               ANDa.ename LIKE '%';

    DEPTNO     DEPTNO
----------     ----------
        10              10
        20              20
        30              30

쿼리 결과를 잘 보면 out조인이 되지 않은 것을 알 수 있습니다.
위 쿼리를 out조인이 되기 위해서는 아래와 같이 고쳐야 합니다
.

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno(+) = b.deptno
              AND a.ename(+) LIKE '%'

    DEPTNO     DEPTNO
----------      ----------
        10               10
        20               20
        30               30
                          40

OUT조인 조건이 걸려있는 테이블에는 다른 조건절이 들어와도
똑같이 OUT조인 연산자인 (+)를 해주어야 합니다.  


'개발 > ORCLE' 카테고리의 다른 글

오라클 문자열 처리 함수  (0) 2008.10.24
오라클 SubStr  (0) 2008.10.24
오라클 Length, LengthB  (0) 2008.10.24
오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,
Length

EX) SELECT NAME LENGTH(NAME) LENGTH FROM TEST

NAME           LENGTH
=====================
테스트                3
TEST                  4

한글을 2byte로 계산하여 리턴받을려면 Length

LengthB

EX) SELECT NAME LENGTHB(NAME) LENGTHB FROM TEST

NAME             LENGTHB
========================
테스트                   6
TEST                     4

한글을 1byte로 계산하여 리턴받을려면 LengthB



'개발 > ORCLE' 카테고리의 다른 글

오라클 SubStr  (0) 2008.10.24
오라클 OUTER JOIN  (0) 2008.10.24
오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
오라클 CASE  (0) 2008.10.24
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

★ UNION

    UNION 구문은 첫번째 쿼리의 모든 행을 두번째 쿼리의 모든 행과 더하고,

    중복된 행을 제거한 후, 결과를 리턴한다.

   

    다음 예를 보면 첫번째 쿼리에서 EMPLOYEES_ID와 LAST_NAME에서 LAST_NAME 열이 A나 B로

    시작하는 직원 레코드를 얻고, 두번째 쿼리에서는 EMPLOYEES_ID와 LAST_NAME 열에서

    LAST_NAME 이 B나 C로 시작하는 직원 레코드를 얻었다.

 

    쉽게 알 수 있겠지만 B로 시작되는 LAST_NAME 열을 가지는 직원 레코드는 첫번재와 두번째

    쿼리 모두에서 선택되며, 중복되는 행들은 결과셋에서 제외된다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  union

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /

 

★ UNION ALL

    UNION ALL 구문은 UNION 구문과 매우 비슷하지만 중복되는 행을 제외시키지 않는다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  union all

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /

 

   

★ INTERSECT

   intersect 구문은 두 개의 쿼리를 받고 결과를 모은 다음, 두 결과셋에 모두 존재하는

   레코드만을 리턴한다. 첫번째  쿼리나 두번째 쿼리에서만 리턴된 행은 결과셋에 포함되지 않는다.

  

   앞에서와 같은 쿼리에 INTERSECT 구문을 이용하면 LAST_NAME이 B로 시작하는 직원

   레코드만이 리턴될 것임을 예상할 수 있다. 이것은 첫번째 쿼리나 두번째 쿼리에만 포함되는

   행들이 모두 결과셋에서 제거되기 때문이다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  intersect

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /

 

★ MINUS

   MINUS 집합 연산자는 첫번째 쿼리에서만 리턴되며, 두번째 쿼리에서는 리턴되지 않는

   레코드만을 리턴한다. 즉, 첫번째 쿼리에서 LAST_NAME이 A나 B로 시작하는 직원 레코드가

   리턴되고, 두번째 쿼리에서 LAST_NAME이 B나 C로 시작하는 직원 레코드가 리턴된다면,

   이 두 쿼리에 MINUS 연산자를 적용한 뒤에는 LAST_NAME이 A로 시작하는 직원 레코드를

   얻게 된다.

 

EX>

    select employee_id, last_name

  2   from employees

  3 where last_name like 'A%'

  4     or  last_name like 'B%' 

  5  minus

  6 select employee_id, last_name

  7   from employees

  8 where last_name like 'B%'

  9     or  last_name like 'C%'

 10 /


'개발 > ORCLE' 카테고리의 다른 글

오라클 OUTER JOIN  (0) 2008.10.24
오라클 Length, LengthB  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
오라클 CASE  (0) 2008.10.24
오라클 반환형 함수  (0) 2008.10.23
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

오라클 INDEX

개발/ORCLE 2008. 10. 24. 10:07

네이버 joypheonix님 블로그에서 퍼옴

---------------------인덱스  확인----------------------------------
SELECT index_name, table_owner, table_name, column_name
FROM   dba_ind_columns
WHERE index_owner = 'EDU_USER' and table_name='TCM_WAREHOUSING'
ORDER BY index_name, column_position;

--TCM_WAREHOUSING_PK EDU_USER TCM_WAREHOUSING WHYEARMON
--TCM_WAREHOUSING_PK EDU_USER TCM_WAREHOUSING SEQ   

SELECT    ic.index_name, ic.column_name,
                   ic.column_position, ix.uniqueness
 FROM       user_indexes ix, user_ind_columns ic
 WHERE     ic.index_name = ix.index_name
 AND          ix.table_name = 'TCM_WAREHOUSING'


--TCM_WAREHOUSING_PK WHYEARMON 1 UNIQUE
--TCM_WAREHOUSING_PK SEQ 2 UNIQUE

 

 

 

 

 

1. 기본적으로 primary key나 unique생성시에는 자동적으로

    index가 생성된다.

 

2. index 생성하기

    create table it(
    no number,
    bigo varchar2(30) constraint it_bigo_uk unique

    using index(create index i_it_bigo on it(bigo)

                  tablespace indx));

 

3. CREATE INDEX idx_emp ON tb_emp (empno);

    -->tb_emp 테이블에 empno 컬럼을 이용하여 idx_emp를 생성한다.

 

3_1. CREATE INDEX idx_emp ON tb_emp (empno desc);

    -->tb_emp 테이블에 empno 컬럼을 이용하여 역순으로 정렬하는 idx_emp를 생성한다.

 

 

4. 삭제: DROP INDEX 인덱스명

 

 

5.

* 인덱스가 무시되는 경우
인덱스의 유무를 탐지할 수 있는 단순 열에 대해 적용되어야만 인덱스의 장점이 활용된다. 즉 substr이나 || 와 같은 함수에 의해 변형되어 있다면 오라클은 인덱스를 사용하지 않는다. 그러나 min과 max도 열 자체와 함께 사용된다면 인덱스의 장점을 활용할 수 있다. 또한 클러스터 인덱스를 제외하고는 null인 열은 인덱스 상에 나타나지 않는다. 하나 이상의 열에 대해 지정된 인덱스는 전체 열 중에 어느 하나라도 null이 아니면 엔트리를 가진다. 모든 열이 null이면 인덱스에 이와 관련된 엔트리는 생기지 않는다.
--> where ~~ is null 등과 같은 sql문에는 적합하지 않다.
--> 컬럼에 null값이 들어가있는 컬럼은 인덱스로 사용하기 불가능 하다???
 
 
 

 

 --index의 사용유무 확인하기

 

1. @C:\oracle\ora92\rdbms\admin\utlxplan.sql

2. @C:\oracle\ora92\sqlplus\admin\plustrce.sql

3. create public synonym plan_table for sys.plan_table;

 

4. ora602에게 권한을 부여

    grant plustrace to ora602;

 

5. grant select, insert, update, delete on plan_table to ora602;

 

6. ora602에 접속

 

7. set autotrace on

 

8. select 컬럼 실행

 

9. 사용이 끝난 후엔 set autotrace off

 

 

 
--------------------------------------------------------------------------------
--                                              16장 인덱스                     
--------------------------------------------------------------------------------
-- SQL 명령문의 처리 속도를 향상시키기 위해서 컬럼에 대해 생성하는 오라클객체   
--------------------------------------------------------------------------------
-- 인덱스를 사용해야 하는 경우                                                                          --
--      1.테이블에 행의 수가 많을때                                                                      --
--      2.조건절인 WHERE 문에 해당 컬럼이 많이 사용될 때                                     --
--      3.검색 결과가 데이터의 2% ~ 4% 정도 일 때                                                --
--      4.JOIN에 자주 사용되는 컬럼                                                                     --
--      5.NULL을 포함하는 컬럼이 많은 경우                                                          --
--                                                                                                                  --
-- 인덱스를 사용하지 말아야 하는 경우                                                                --
--      1.테이블에 행의 수가 적을 때                                                                     --
--      2.WHERE 문에 해당 컬럼이 자주 사용되지 않을 때                                        --
--      3.검색 결과가 전체 데이터의 10% ~ 15% 이상 높을 때                                   --
--      4.테이블에 DML 작업이 많은 경우                                                              --
--        즉, 입력 수정 삭제 등이 자주 일어 날 때                                                    --
--------------------------------------------------------------------------------

-- 인덱스 생성/제거와 인첵스 정보 조회
CREATE TABLE E2
AS
SELECT *
  FROM EMP;

INSERT INTO E2 SELECT * FROM E2;

    -- 시간 체크
    SQL> SET TIMING ON
    SQL> SELECT DISTINCT EMPNO, ENAME FROM E2 WHERE ENAME = 'SCOTT';

         EMPNO ENAME
    ---------- ----------
          7788 SCOTT

    Elapsed: 00:00:00.80

CREATE INDEX IDX_E2_ENAME
ON E2(ENAME);
    -- 인덱스 생성후 시간 체크
    SQL> SET TIMING ON
    SQL> SELECT DISTINCT EMPNO, ENAME FROM E2 WHERE ENAME = 'SCOTT';

         EMPNO ENAME
    ---------- ----------
          7788 SCOTT

    Elapsed: 00:00:00.37 -->> 인덱스 속도가 줄었음.
   
-- 인덱스 생성 유무 확인 데이터 딕셔너리(USER_INDEXES, USER_IND_COLUMNS(컬럼명확인))
SELECT INDEX_NAME, TABLE_NAME
  FROM USER_INDEXES
 WHERE TABLE_NAME IN('EMP','DEPT','E2');
 
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
  FROM USER_IND_COLUMNS
 WHERE TABLE_NAME IN('EMP','DEPT','E2');
 
-- 인덱스 제거
DROP INDEX IDX_E2_ENAME;

-- 인덱스 재생성
SQL> SET TIMING ON
SQL> ALTER INDEX IDX_E2_DEPTNO REBUILD;

-- 인덱스의 종류
    -- 1.고유 인덱스(Unique Index)           : 유일한 값을 갖는 컬럼에 대해서 생성하는 인덱스
    -- 2.비고유 인덱스(NonUnique Index)   : 중복된 데이터를 갖는 컬럼에 대해서 생성하는 인덱스
    -- 3.단일 인덱스(Single Index)            : 한 개의 컬럼으로 구성한 인덱스
    -- 4.결합 인덱스(Composite Index)      : 두 개 이상의 컬럼으로 구성한 인덱스
    -- 5.함수 기반 인덱스(Function Based Index)

CREATE TABLE D2
AS
SELECT *
  FROM DEPT;
-- 고유 인덱스
CREATE UNIQUE INDEX IDX_D2_DEPTNO
ON D2(DEPTNO);
-- 비고유 인덱스
CREATE INDEX IDX_D2_LOC
ON D2(LOC);
-- 결합 인덱스
CREATE INDEX IDX_D2_COM
ON D2(DEPTNO, DNAME);
   
    SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
      FROM USER_IND_COLUMNS
     WHERE TABLE_NAME ='D2';

-- 함수 기반 인덱스
CREATE TABLE E3
AS
SELECT *
  FROM EMP;

CREATE INDEX IDX_E3_ANNSAL
ON E3(SAL*12);

    SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
      FROM USER_IND_COLUMNS
     WHERE TABLE_NAME ='E3';

 

------사용법-----------

select /*+ INDEX (A UI_TEMP ) */ --> 테이블명 한칸띄고 인덱스명 (INDEX_desc-->인덱스를 꺼꾸로 탐)
    name, se_code, dt
from temp A
where chk = 0 and rownum = 1

'개발 > ORCLE' 카테고리의 다른 글

오라클 Length, LengthB  (0) 2008.10.24
오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 CASE  (0) 2008.10.24
오라클 반환형 함수  (0) 2008.10.23
오라클 NVL  (0) 2008.10.23
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

오라클 CASE

개발/ORCLE 2008. 10. 24. 08:22
SELECT
(CASE COLUMVALUE
WHEN 'A'
THEN '1'
WHEN 'B'
THEN '2'
END)
FROM TEST

DECODE랑 거의 같은역할을 하고 있다고 보면됩니다.
이 CASE문을 DECODE로 바꾼다면..

DECODE(COLUMVALUE, 'A','1', 'B', '2')

'개발 > ORCLE' 카테고리의 다른 글

오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
오라클 반환형 함수  (0) 2008.10.23
오라클 NVL  (0) 2008.10.23
오라클 DECODE  (0) 2008.10.23
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,
TO_CHAR : 숫자나 날짜를 문자열로 변환

EX) TO_CHAR (SYSDATE, 'yyyymmdd')

만약 날짜가 2008년 10월 23일이면 뒤에 'yyyymmdd' 형식대로 20081023 이렇게 변환을 시켜줍니다.

TO_NUMBER : 문자를 숫자로 변환

TO_DATE : 문자를 날자로 변환

EX)TO_DATE('10 September 2008','dd Month YYYY') 

문자스트링을 TO_NUMBER와 TO_DATE를 써서 숫자형식으로 변환할수 있다.

YYYY : 4자리 연도표시
YY : 2자리 연도표시
Month : 월을 알파벳으로 스펠링
MON : 월의 알파벳 약어
MM : 월을 2자리로 숫자로 표시
DAY : 일에 해당하는 요일
DY : 일에 해당하는 요일 약어
DDD,DD,D : 연도, 월, 일 중의 날짜를 숫자로 표시
HH, HH24 : (1-12) , (0-23)중의 시간을 표시
MI : 분을 표시
SS : 초를 표시
AM(A.P), PM(P.M) : 오전인지 오후인지를 표시 
 

'개발 > ORCLE' 카테고리의 다른 글

오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
오라클 CASE  (0) 2008.10.24
오라클 NVL  (0) 2008.10.23
오라클 DECODE  (0) 2008.10.23
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,