[펌] PL-SQL 정리

프로그래밍/DB 2007. 11. 27. 14:32 Posted by galad
출처 블로그 > 사랑 추억 행복 미움 아픔 미소 눈물 웃음 향기 넌??
원본 http://blog.naver.com/realkorz/40001933479

SQL

SELECT

DML(데이터 조작어)

INSERT, UPDATE, DELETE

DDL(데이터 정의어) IMPLICIT COMMIT

CREATE, ALTER, DROP, RENAME, TRUNCATE

TCL(트랜잭션 제어)

COMMIT, ROLLBACK, SAVEPOINT

DCL(데이터 제어어)IMPLICIT COMMIT

GRANT, REVOKE

 

[1] Writing Basic SQL Statements

1. SELECT 기본 문장(선택, 프로잭션, 조인)

SELECT [DISTINCT] { *, column [alias], ... }

  FROM table ;

 

2. SELECT 예제

SELECT * FROM dept ;

SELECT deptno, loc FROM dept ;

SELECT ename, sal, 12 * (sal + 100) FROM emp ;

* Null 값과 연산을 하면 Null이 나온다.

 

3. Column Alias 예제

SELECT ename AS nme, sal salary

FROM emp ;

SELECT ename "Name", sal*12 "Annual Salary"

FROM emp ;

* 대소문자를 구분하고 공백있는 컬럼 Alias를 만들고 싶을땐 " "로 막는다.

* AS는 안 써도 된다.

* WHERE, GROUP BY절에는 안된다. ORDER BY 절에는 사용 가능.

 

4. Concatenation 연산자 (|| : pipeline 2)

SELECT ename||job "Employees" FROM emp ;

--> ename 데이터와 job 데이터가 붙어서 출력된다.

 

5. 문자열을 데이터로 출력할때

SELECT ename||' '||'is a'||' '||job "Employee Details"

FROM emp ;

* 문자열은 ' '로 막고, 컬럼 Alias " "로 막는다.

 

6. DISTINCT keyword :

중복된 Row를 하나로 만들어 준다. 자동 SORTING[ASC]

SELECT DISTINCT deptno

FROM emp ;

* DISTINCT 대신 UNIQUE를 써도 된다.

 

7. SQL*Plus Log On 방법

* UserName, PassWord, HostString에 일일이 입력해도 되지만,

UserName username/password@HostString이라고 입력하면 된다.

* UNIX상에서 command로 들어 갈 때는 sqlplus username/password 만 입력하면된다.

 

8. 테이블 구조보는 SQL Command (DESC)

SQL> DESC dept : Column Name, Null?, Data Type display

 

9. SQL*Plus Editing Commands( 다음 행까지 계속하려면 -(하이픈)으로 연결한다.)

A[PPEND] text    : 현재 line의 마지막 문장 뒤에 text를 붙인다.

C[HANGE]/old/new : 현재 line old text new text로 바꾼다.

C[HANGE]/text/   : 현재 line text를 삭제한다.

CL[EAR] BUFF[ER] : buffer의 내용을 모두 지운다.

DEL              : 현재 line을 지운다.

DEL n            : n번째 line을 지운다.

DEL m n          : m ~ n번째 line을 지운다.

I[NPUT]          : 현재 line 다음에 line이 제한없이 추가된다.

I[NPUT] text     : 현재 line 다음에 line이 추가되면서 text가 들어간다.

L[IST]           : buffer전체를 보여준다.

L[IST] n         : n번째 line을 보여준다.

R[UN] or /       : SQL, PL/SQL문장을 실행하라!

n                : n번째 line display하면서 Editing 상태로 해준다.

n text           : n번째 line text로 바뀐다.

0 text           : 1번째 line이 추가되면서 text 1번째 line으로 들어간다.

* Bald로 표시된 명령어는 line번호를 먼저 수행한 후 실행해야 한다.

 

10. SQL*Plus File Commands

SAV[E] filename [REP[LACE]|APP[END]] : buffer의 내용을 filename.sql로 저장한다.

GET filename     : filename.sql buffer로 불러온다.

START filename   : filename.sql을 실행하라.

@filename        : START filename과 같다.

ED[IT]           : buffer의 내용을 edit program으로 실행한다.

ED[IT] filename  : filename.sql edit program으로 실행한다.

SPO[OL] filename : retrieve data filename.lst로 저장한다.

SPOOL OFF        : SPOOL을 끝내라.

SPOOL OUT        : retrieve data system printer로 출력하라.

EXIT             : SQL*Plus를 종료한다.

* SPOOL 사용법

SQL> spool filename

SQL> select ...

SQL> spool off

 

11. Special Tip

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

SQL> ! ( $)

-- host 상에서 다시 SQL로 들어가려면 exit(lo)

-- unix 상에서 env를 치면 오라클 환경을 볼 수 있다.

 

* SQL> define -editor

--> Editor vi인지..다른 edit프로그램인지를 보여준다.

 

* line size 바꾸기

SQL> SET PAGESIZE 20 -- page 20line으로 보여준다.

-- log off하면 사라진다.

 

* NLS값 보기

SQL> select * from V$NLS_PARAMETERS

 

* NLS값 바꾸기

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'

-- SESSION : session동안만 YYYY-MM-DD 포맷으로 사용한다는 뜻.

sqlplus가 종료되면 원상태로 복구된다.

 

[2]Restricting and Sorting Data

1. 비교연산자

=  : Equal to

>  : Grater than

>= : Greater than or equal to

<  : Less than

<= : Less than or equal to

<> : Not equal to

) SELECT ename, sal, comm

FROM emp

WHERE sal <= comm ;

 

2. 비교연산자 2

BETWEEN A AND B , IN(list), LIKE, IS NULL

 

3. BETWEEN 연산자( NOT BETWEEN )

SELECT ename, sal

FROM emp

WHERE sal BETWEEN 1000 AND 1500 ; --> sal >= 1000 and sal <= 1500

 

4. IN 연산자( NOT IN )

SELECT emp, ename, sal, mgr

FROM emp

WHERE mgr IN (7902, 7566, 7788) ; --> mgr = 7902 or mgr = 7566 or mgr = 7788

 

5. LIKE 연산자( NOT LIKE )

1) SELECT ename

FROM emp

WHERE ename LIKE 'S%' ; --> ename S로 시작하는 모든 데이터를 찾는다.

2) SELECT ename

FROM emp

WHERE ename LIKE '_A%' ; --> 두 번째 글자가 A인 모든 데이터를 찾는다.

3) SELECT ename

FROM emp

WHERE ename LIKE '%A/_%B' ESCAPE '/' ;

--> '/' Escape문자로 정의되었기 때문에 '_'도 문자로 인식한다.

, ename A_로 포함하는 모든 데이터를 찾는다.

* ESCAPE는 모든 문자가 가능하다.

 

6. IS NULL 연산자

SELECT ename, mgr

FROM emp

WHERE mgr IS NULL ; --> mgr null인 데이터를 찾는다.

 

7. Logical 연산자

AND : 두 개의 조건이 모두 만족해야 OK

OR  : 한 개의 조건만 만족하면 OK

NOT

 

8. AND 연산자

SELECT empno, ename, job, sal

  FROM emp

 WHERE sal >= 1100

AND job = 'CLERK' ;

 

9. OR 연산자

SELECT empno, ename, job, sal

  FROM emp

 WHERE (sal >= 1100 OR job = 'CLERK') ;

 

10. NOT 연산자

SELECT ename, job

FROM emp

WHERE job NOT IN ('CLERK', 'MANAGER') ;

--> NOT (job = 'CLERK OR job = 'MANAGER')

 

11. 연산자 우선순위( 산술 > 문자 > 비교 > 논리 )

1 : 모든 비교 연산자

2 : NOT

3 : AND --> False > Null > True

4 : OR --> True > Null > False

) A AND B에서...

- A False이고 B Null이면... False 이다.

- A True이고 B Null이면.... Null이다.

 

12. SORT (ORDER BY)

* ASC default값이다.(작은 값부터..)

* 값이 Null일 때 가장 큰 값이 된다. (ASC일 때...맨 뒤에 붙는다.)

* column alias sorting이 된다.

1) SELECT ename, job, deptno, hiredate "Date"

       FROM emp

   ORDER BY hiredate["Date" or 4 ] ;

 

2) SELECT ename, job, deptno, hiredate

       FROM emp

      ORDER BY hiredate DESC ;

 

3) SELECT empno, ename, sal*12 annsal

       FROM emp

   ORDER BY empno, annsal ; * select 절에 없는 열을 기준으로 정렬 가능.

 

4) SELECT ename, deptno, sal

       FROM emp

   ORDER BY deptno, sal DESC

 

[3] Single-Row Functions

1. Character Functions

LOWER( column|expression )

LOWER('String') --> string : 소문자로 변환

UPPER( column|expression )

UPPER('String') --> STRING : 대문자로 변환

INITCAP( column|expression )

INITCAP('string') --> String : 첫글자만 대문자이고 나머지글자는 소문자로 변환

CONCAT( column1|expression1 ,column2|expression2 )

CONCAT('Good','String') --> GoodString : ||와 같은 역할을 한다.

SUBSTR(column|expression, m [,n]) : m값이 음수면 문자값의 끝부터..)

SUBSTR('String',1,3) --> Str : 1번째부터 3개의 문자를 리턴한다.

LENGTH( column|expression )

LENGTH('String') --> 6 : 문자열의 길이를 리턴한다.

INSTR( column|expression, )

INSTR('String','r') --> 3 : 문자열에 'r'이 몇번째 위치하고 있나를 리턴한다.

LPAD( column|expression,n,'string' ) : n 은 전체 길이

LPAD('String',10,'*') --> ****String

: 10자리수중에 모자란 자리수를 '*'로 왼쪽에 채운다.(문자,숫자 가능!!!)

RPAD('String',10,'*') --> String****

: 10자리수중에 모자란 자리수를 '*'로 오른쪽에 채운다.(문자,숫자 가능!!!)

LTRIM(' String') --> 'String' : 문자열의 왼쪽 공백을 버린다.

RTRIM('String ') --> 'String' : 문자령의 오른쪽 공백을 버린다.

* TRIM(leading/tailing/both, trim_character FROM trim_source )

TRIM( 'S' FROM 'SSMITH') --> MITH

 

2. Number Functions

ROUND(45.926, 2) --> 45.93 : 소수점 두자리수까지 보여주면서 반올림한다.

TRUNC(45.926, 2) --> 45.92 : 소수점 두자리까지만 보여주고 나머지는 버린다.

MOD(1600,300) --> 100 : 1600 300으로 나누고 나머지를 리턴한다.

* ROUND예제(WHOLE NUMBER:정수)

SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL

==> 45.92 46 50

* TRUNC예제

SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-1) FROM DUAL

==> 45.92 45(n이 생략된면 일의 자리까지 남기고 버린다.) 40

* SYSTEM 날짜를 갖고 오는 방법.

SELECT sysdate FROM dual

 

3. Date 계산( 날짜를 숫자로 저장)

date + number : date number만큼 후의 날자를 보여준다.

date - number : date number만큼 전의 날자를 보여준다.

date1 - date2 : date1에서 date2 까지의 총 일수를 보여준다.( date1+date2 X )

date1 + 숫자/24 : date1에서 시간을 더해 날짜를 보여준다.

4. Date Functions

MONTHS_BETWEEN('01-SEP-95','11-JAN-94') --> 19.6774194

; 두날짜 사이의 달수를 보여준다.

ADD_MONTHS('11-JAN-94', 6) --> 11-JUL-94

; 날짜에 6개월을 더한 날자를 보여준다.

NEXT_DAY('01-SEP-95','FRIDAY') --> '08-SEP-95'

; 해당일 다음에 오는 FRIDAY의 일자를 보여준다.

('SUNDAY' 1, 'MONDAY' 2...이런식으로 숫자를 써줘도 된다.)

LAST_DAY('01-SEP-95') --> '30-SEP-95'

; 해당월의 마지막날자를 보여준다.

ROUND('25-JUL-95','MONTH')--> 01-AUG-95 ROUND('25-JUL-95','YEAR')--> 01-JAN-96

TRUNC('25-JUL-95','MONTH') --> 01-JUL-95 TRUNC('25-JUL-95','YEAR') --> 01-JAN-95

 

5. Conversion Functions

nlsparams : 십진수, 그룹구분자, 지역 통화 기호, 국제 통화 기호

TO_CHAR(date,['format'],[nlsparams]) : date format에 맞게 문자열로 변환한다.

- Date Format Elements

YYYY --> 1999 (년출력) , YEAR --> nineteen ninety-nine (년출력)

MM --> 12 (월출력) , MONTH --> DECEMBER (월출력), MON --> DEC

D --> 요일을 숫자로 리턴한다.(일요일은 1, 월요일은 2...)

DD --> 07 (달의 일출력)

DDD --> 200 (연의 일출력)그 해의 총 몇 일째인가를 리턴한다.

DAY --> MONDAY (요일출력) DY-->MON

CC --> 20 (몇 세기인지를 보여준다.)

WW --> 그 해의 몇 번째 주인가를 리턴한다.

W --> 그 달의 몇 번째 주인가를 리턴한다.

 

* Element들을 소문자로 쓰면 소문자로 나오고 대문자로 쓰면 대문자로 출력된다.

HH or HH12 or HH24 / MI(0-59) / SS(0-59)

 

* 문자열은 " " 묶어 추가한다 DD " of " MONTH --> 12 of DECEMBER

*숫자 접미어는 숫자를 문자로 표기. TH(4->4TH)/ SP(4->FOUR)/ SPTH or THSP(4->FOURTH)

ddspth : 14-> fothteenth

* / . , : 구두점은 결과에 그대로 출력한다. * 공백, 선행제로를 제거하는 fm요소가 있다.

TO_CHAR(number,'format',[nlsparams]) : number format에 맞게 문자열로 변환한다.

- Number Format Elements

9 : 999,999 --> 1,234 $: 부동 달러 기호 $99999 -> $1234

0 : 099999 --> 001234 99.999EEEE -> 1.234E+03 B: 0값을 공백으로

L : L99,999 --> FF1,234 (NLS_CURRENCY에 설정되어있는 값이 L로 보여진다.)

 

TO_NUMBER(char,['format'],[nlsparams]) : 숫자형태의 문자열을 숫자로 변한한다.

TO_DATE(char,['format'],[nlsparams]):날자형태의 문자열을 format에 맞게 날자형식으로 변환 한다.

 

6. NVL Funcion : 값이 null일 때 설정값을 보여준다.

NVL(number_column, 0) : null일 때 0을 보여준다.

NVL(date_column, '01-JAN-95') : null일 때 '01-JAN-95'를 보여준다.

NVL(character_column, 'Empty') : null일 때 'Empty'를 보여준다.

* column Type과 표현식의 type이 반드시 일치해야 한다.

 

7. DECODE Function : CASE or IF-THEN-ELSE 형식과 비슷하다.

*DECODE(col/expression, search1, result1 [,search2,result2,…] [,default])

F1 (F2 (F3 (col,arg1),arg2),arg3)

 

[4] Displaying Data from Multiple Tables (JOIN)

1. EquiJoin : column1 column2 Primary Key Foreign Key관계인 경우

SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc

FROM emp, dept

WHERE emp.deptno = dept.deptno

 

2. Non-EquiJoin : Join하는 Table 사이에 서로 대응하는 Key가 없는 경우

where절의 Join조건에 '='을 제외한 비교연산자를 사용한다.

SELECT e.ename, e.sal, s.grade

FROM emp e, salgrade s

WHERE e.sal BETWEEN s.losal AND s.hisal

 

3. Outer Join : 서로 = 되지 않는 row 까지도 모두 보여준다.

정보가 없는쪽 컬럼 뒤에 (+)를 붙인다.( =, and 만 사용가능)

SELECT e.ename, d.deptno, d.dname

FROM emp e, dept d

WHERE e.deptno (+) = d.deptno

ORDER BY e.deptno

 

4. Self Join : 같은 Table을 그것이 마치 2개의 Table인 것처럼 Join해서 사용한다.

SELECT worker.ename, manager.ename

FROM emp worker, emp manager

WHERE worker.mgr = manager.empno

 

5. SET OPERATORS

UNION : 중복된 row는 제외하고 보여준다. UNION ALL : 중복된 row까지 모두 보여준다. INTERSECT : A,B의 중복된 row만 보여준다.MINUS : A,B의 중복된 row를 제외한 A row를 보여준다.

 

[5] Aggregating Data Using Group Functions(그룹함수를 사용한 데이터집계)

1. Group Function : 행집합에 적용하여 그룹당 하나의 결과를 생성한다.

AVG([DISTINCT|ALL] n) : 평균값

COUNT({*|[DISTINCT|ALL] expr}) : row

MAX([DISTINCT|ALL] expr) : 최대값

MIN([DISTINCT|ALL] expr) : 최소값

SUM([DISTINCT|ALL] n) :

STDDEV([DISTINCT|ALL] x) : 표준편차

VARIANCE([DISTINCT|ALL] x) : 분산

* count(*)를 제외한 모든 Group Function Null을 배제하고 수행한다.

Null을 포함하고 싶다면 NVL함수를 사용한다.

* DISTINCT ALL을 쓰지 않으면 Default ALL이다.

* AVG,SUM, STDDEV, VARIANCE는 반드시 숫자형이다.

 

2. 어떤 컬럼에 해당하는 데이터별 그룹함수를 사용할 때

SELECT [deptno,] COUNT(ename)

FROM emp --> 이문장은 성립되지 않는다. GROUP BY가 없다.

<추가>

GROUP BY deptno

*일반칼럼과 그룹함수를 같이 쓰면 group by절에 일반칼럼 명시(열 별칭 사용못함)

*GROUP BY 열을 SELECT 절에 포함시키지 않아도 된다

 

3. 그룹함수는 WHERE절에 올수가 없다.

SELECT deptno, AVG(sal)

FROM emp

WHERE AVG(sal) > 2000

GROUP BY deptno

--> 이문장은 성립되지 않는다. WHERE절에 그룹함수가 올 수 없다.

 

SELECT deptno, AVG(sal)

FROM emp

GROUP BY deptno

HAVING AVG(sal) > 2000

 

4. HAVING : 그룹함수를 조건절에 적용시키기 위해서 사용한다.

SELECT job, SUM(sal)

FROM emp

WHERE job NOT LIKE 'SALES%'

GROUP BY job

HAVING SUM(sal) > 5000

ORDER BY SUM(sal)

*절 평가 순서 : WHERE -> GROUP BY -> HAVING

*그룹함수는 두번까지 중첩될수 있습니다. MAX( AVG(SAL))

 

[6] Subqueries( WHERE , HAVING , FROM )

1. Subquery 규칙

- 반드시 ()로 묶어야 한다.

- 반드시 비교연산자 오른쪽에 위치해야 한다.

- ORDER BY 절에는 사용할 수 없다.

- 서브쿼리 결과가 한개일때는 Single-Row 비교연산자를 사용해야 한다.

( =, >, >=, <, <=, <> )

- 서브쿼리 결과가 여러개일때는 Multi-Row 연산자를 사용해햐 한다.

 

2. Subquery 사용예1

* 반드시 비교연산자 오른쪽에 써야한다.

SELECT ename FROM emp

WHERE sal > (SELECT sal FROM emp

WHERE empno = 7566)

 

3. Subquery 사용예2

SELECT ename, job

FROM emp

WHERE job = (SELECT job

FROM emp

WHERE empno = 7369)

AND

sal > (SELECT sal

FROM emp

WHERE empno = 7876)

 

4. Subquery 사용예3

SELECT job, AVG(sal)

FROM emp

GROUP BY job

HAVING AVG(sal) > (SELECT MIN(AVG(sal))

FROM emp

GROUP BY job)

 

5. Subquery 사용예4 (Subquery 결과가 여러개가 나올때 비교연산자 사용법)

SELECT empno, ename

FROM emp

WHERE sal IN (SELECT MIN(sal) ( =ANY 와 같음 )

FROM emp

GROUP BY deptno)

 

6. ANY(동의어:SOME)연산자를 사용한 Subquery : 조건중에 한개만 만족하면 OK

SELECT empno, ename, job

FROM emp

WHERE sal < ANY (SELECT sal --> OR

FROM emp

WHERE job = 'CLERK')

AND job <> 'CLERK'

 

7. ALL연산자를 사용한 Subquery : 모든 조건을 만족해야 OK

SELECT empno, ename, job

FROM emp

WHERE sal > ALL (SELECT avg(sal) --> AND

FROM emp

GROUP BY deptno

 

[7] Multiple-Column Subqueries

1. Multiple-Column Subquery (Pairwise Subquery)

: 서브쿼리의 결과가 두개 이상의 컬럼형식으로 나올 때 비교하는 컬럼도 서브쿼리 컬럼

갯수와 형식이 같아야한다.

SELECT ename, deptno, sal, comm

FROM emp

WHERE (sal, NVL(comm,-1)) IN

(SELECT sal, NVL(comm,-1)

FROM emp

WHERE deptno = 30)

 

2. NonPairwise Subquery

SELECT ename, deptno, sal, comm

FROM emp

WHERE sal IN (SELECT sal FROM emp

WHERE deptno = 30)

AND

NVL(comm,-1) IN (SELECT NVL(comm,-1) FROM emp

WHERE deptno = 30)

 

3. Subquery 안에 Null값이 있을 때...

* 매니저가 아닌 사원을 보여주기?

SELECT e.ename

FROM emp e

WHERE e.empno NOT IN

(SELECT m.mgr FROM emp m)

IN Null value가 나와도 한개의 조건만 만족하면 OK이지만,

NOT IN !=ALL과 같아서 모든조건이 TRUE여만 TRUE인 것이다.

* NOT IN !=ANY 로 바꿔주는게 정답에 가깝다.

 

4. FROM절에 사용되는 Subquery

SELECT a.ename, a.sal, a.deptno, b.salavg

FROM emp a,

(SELECT deptno, avg(sal) salavg

FROM emp

GROUP BY deptno) b

WHERE a.deptno = b.deptno

AND a.sal > b.salavg

 

5. EXISTS : EXISTS 뒤에 나오는 서브쿼리의 결과가 한건이 row라도 있다면 O.K

SELECT dname, deptno

FROM dept

WHERE EXISTS (SELECT * FROM emp

WHERE dept.deptno = emp.deptno)

: 행의 존재유무만 확인

 

[8] Producing Readable Output with SQL*Plus

1. Substitution Variable (치환변수)

& : 변수가 한 번 사용되고 메모리에서 사라진다.

&& : 한 번 입력한 변수는 CLEAR하기 전까지 계속 메모리에 남아있다.

DEFINE variable=value : CHAR 데이터 유형의 사용자 변수를 생성하여 값을 변수에 할당한다.

DEFINE : 현재 DEFINE 된 모든 것들을 보여준다.

DEFINE 변수명 : 지정한 변수명의 DEFINE 사항을 보여준다.

UNDEFINE 변수명 : 지정한 변수명의 DEFINE 상태를 CLEAR한다.

ACCEPT : 변수를 입력하라고 물어보는 Prompt Text를 변경할수 있다. USER

입력하는 값을 HIDE시킬수가 있다. DataType Format을 변경할수가 있다.

* SET VERIFY SQL*PLUS 가 치환변수를 값으로 바꾸기 전후의 명령 텍스트 표시를 토글한다.

2. & 치환변수 사용예

SELECT empno, ename, sal, deptno

FROM emp

WHERE empno = &employee_num

 

3. && 치환변수 사용 예 --> 한번만 물어보게 된다.

SELECT empno, ename, job, &&column_name

FROM emp

ORDER BY &column_name

 

4. 변수 값이 character or date value일때 꼭 single quotation mark로 묶어 줘야 한다.

SELECT ename, deptno, sal*12

FROM emp

WHERE job = '&job_title'

 

5. 종합적인 예제(실행중에 열이름, 표현식, 텍스트를 지정)

--> 어떤 절에나 사용해도 된다.

SELECT empno, ename, job, &column_name

FROM emp

WHERE &condition

ORDER BY &order_column

 

6. ACCEPT 사용예 (file로 만들어서 START시켜야 한다.)

*ACCEPT variable [datatype] [FORMAT format] [PROMPT text] [HIDE]

ACCEPT dept PROMPT 'Provide the department name: '

SELECT *

FROM dept

WHERE dname = UPPER('&dept')

/

Provide the department name: Sales

처리된 결과값...

 

7. 파일로 만들어서 치환변수를 여러개 처리할때 예제

test.sql

SELECT &1 FROM &2

SQL> @test empno emp

==> &1 empno, &2 emp가 들어간다.(define)

 

SELECT &2 FROM &4

SQL> @test e empno b emp

==> &1 e, &2 empno,&3 b, &4 emp가 들어간다.(define)

 

8. SET command 변수

ARRAY[SIZE] {20 | n} : 데이터 fatch size

COLSEP {_ | text} : column seperator

FEED[BACK] {6 | n | OFF | ON} : n 개이상의 레코드 반환시 레코드 수를 표시

HEA[DING] {OFF | ON} : column heading 출력

LIN[ESIZE] {80 | n} : 가로 80 으로 출력

PAGES[IZE] {50 | n} : 세로 50 으로 출력

LONG {80 | n} : long date type의 데이터를 출력할때 80byte까지만 보여주겠다.

PAU[SE] {OFF | ON | text} : text에 문자열을 넣으면 pause될 때마다 메시지를 보여준다.

TERM[OUT] {OFF | ON} : 결과를 화면에 보여주겠는가?

VERIFY {OFF | ON} : 치환변수의 old값과 new값을 보여주면서 결과가 처리된다.

* SHOW {SET command } : SET command명의 현재 상태를 보여준다. SQL> SHOW ECHO)

* SHOW ALL : 모든 SET command의 현재 상태를 보여준다.

* SET 상태를 바꿔 주려면... SQL> SET PAUSE ON <-- 이런식으로 하면 된다.

* DEFINE command SET command는 자신의 환경파일(login.sql)에 일괄적으로 처리 할수 있다.

* login.sql oracle superuser용 환경파일이다.

* SQL Plus command가 다음 줄로 이어질 때는 (-)으로 연결한다.

 

9. REPORT 출력 예

SET PAGESIZE 37 --> 세로 37로 출력

SET LINESIZE 60 --> 가로 60으로 출력

SET FEEDBACK OFF

TTITLE 'Employee|Report' --> Top Title Employee 다음 줄에 Report를 쓰겠다.

BTITLE 'Confidential' --> Bottom Title Confidential로 쓰겠다.

COLUMN job HEADING 'Job|Category' FORMAT A15 : | text를 두줄로 찍는다.

--> job column Heading Job 다음줄에 Category로쓰고 15byte의 자리수로

만들겠다.

형식 : COL[UMN] [{column | alias } [option]]

COL[UMN] [column], COL[UMN] column CLE[AR], CLE[AR] COL[UMN]

 

옵션 : CLE[AR], FOR[MAT] format, HEA[DING] text, JUS[TIFY] {align}, NUL[L] text,

NOPRI[NT]:열을 숨김니다 <> PRI[NT],

TRU[NCATED] : 첫 행 끝에 표시되는 문자열을 잘라버린다.

WRA[PPED] : 문자열의 끝을 다음 행으로 줄바꿈합니다.

REM ** Insert SELECT statement --> 주석문

*BREAKE 명령?

 

[9] Multipulating Data (DML)

*트랜젝션 : 논리 작업 단위를 형성하는 DML 문 모음으로 구성된다., DDL(한개),DCL(한개)

1. INSERT 예제1

: 모든 컬럼에 INSERT할 때는 컬럼명을 쓰지 않아도 되지만 테이블 CREATE

만들어진 순서대로 입력해야한다.

INSERT INTO dept

VALUES (50,'AAA','BBB')

* NULL 값을 갖는 행 삽입시 열목록에서 열을 생략(암시적)하는 방법과

NULL 키워드를 지정(명시적)하는 방법이 있다.

 

2. INSERT 예제2

INSERT INTO emp ( empno, ename, job, mgr, hiredate, sal, comm, deptno )

VALUES ( 7196, 'GREEN', 'SALESMAN', 7782, SYSDATE, 2000, NULL, 10 )

 

3. sql 파일로 만들어서 Argument를 받으면서 INSERT 실행하기.

* test.sql 파일

ACCEPT department_id PROMPT 'Please enter the department number: '

ACCEPT department_name PROMPT 'Please enter the department name: '

ACCEPT location PROMPT 'Please enter the location: '

INSERT INTO dept ( deptno, dname, loc )

VALUES (&department_id, '&department_name', '&location' )

 

SQL> @test = START test

Please enter the department number: 90

Please enter the department name: PAYROLL

Please enter the location: HOUSTON

 

1 row created

4. 다른 테이블의 row Copy하기(VALUES 절을 사용하지 않는다.)

INSERT INTO managers (id, name, salary, hiredate)

SELECT empno, ename, sal, hiredate

FROM emp

WHERE job = 'MANAGER'

 

5. UPDATE 예제1

UPDATE emp

SET deptno = 20,

sal = 2500,

comm = null

WHERE empno = 7782

 

6. UPDATE 예제2 (Multiple-Column Subquery를 사용한 예)

UPDATE emp

SET (job, deptno) = (SELECT job, deptno

FROM emp

WHERE empno = 7499)

WHERE empno = 7689

 

7. UPDATE 예제3 (다른 테이블에 있는 데이터를 SELECT해서 UPDATE하기)

UPDATE employee

SET deptno = (SELECT deptno FROM emp WHERE empno = 7788)

WHERE job = (SELECT job FROM emp WHERE empno = 7788)

 

8. DELETE 예제1 (조건에 맞는 데이터 지우기)

DELETE FROM dapartment

WHERE dname = 'DEVELOPMENT'

 

9. DELETE 예제2 (한 테이블의 전체 데이터 삭제)

DELETE FROM department

 

10. DELETE 규칙

* FROM은 옵션이므로 사용하지 않아도 된다.(: DELETE department)

* Primary Key, Forien Key 관계가 설정되어 있는 데이터를 DELETE할때는 문제가 발생 할 수 있다.

 

11. COMMIT

* 변경된 데이터를 Fix시킨다.

* 이전상태의 데이터는 모두 잃게 된다.

* 모든 User가 결과를 볼수 있다.

* LOCK이 풀린다.

* 모든 SavePoint들이 clear된다.

* 자동 커밋 : DDL, DCL, 정상 종료시

12. ROLLBACK

* 변경된 데이터를 undo 시킨다.

* Transaction 전단계의 데이터로 돌아간다.

* Lock이 풀린다.

* 자동 롤백 : 비정상 종료, 시스템 장애

13. SAVEPOINT 예제

* SAVEPOINT : Transaction이 일어난 곳에 Marking을 할 수가 있다.

* 오라클은 자동적으로 눈에 안보이는 savepoint를 찍어 놓는다.

SQL> UPDATE.....

SQL> SAVEPOINT update_done ;

Savepoint created.

SQL> INSERT.....

SQL> ROLLBACK TO update_done ;

Rollback complete.

 

14. TABLE LOCK 예제 (DBA가 임으로 TABLE LOCK을 걸 수가 있다.)

 

 

[10] Creating and Managing Tables (DDL)

1. Database Objects

TABLE, VIEW, SEQUENCE, INDEX, SYNONYM

 

2. Object Naming Rule

- 반드시 첫글자는 문자이어야 한다.

- 길이는 1 ~ 30 글자 이다.

- A-Z, a-z, 0-9, _, $, # 만을 사용할수 있다.

- 동일한 Object명이 존재해서는 안된다.(다른 user가 소유한 table과는 중복가능)

- 오라클 서버의 예약어는 사용할 수 없다.

 

3. CREATING TABLES( create 권한, 저장영역이 필요 )

CREATE [GLOBAL TEMPORARY] TABLE [schema.]table

( column datatype [DEFAULT expr] [,...] );

*GLOBAL TEMPORARY : 임시 table로 지정, 정의는 모든 세션에서 볼 수 있지만,

데이터는 데이터를 삽입하는 세션에서만 볼 수 있다.

* DEFAULT : 다른 열의 이름이나, 의사열은 잘못된 값이다.

* CREATE TABLE dept

( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13),

dymd DATE DEFAULT SYSDATE )

 

4. Data Dictionary

USER_ : 사용자가 소유하는 객체에 대한 정보

ALL_ : 사용자가 ACCESS 할 수 있는 모든 TABLE 에 대한 정보

DBA_ : DBA 롤을 할당 받은 사용자만 ACCESS 할 수 있다.

V$_ : 동적 성능(Performance) , DB SERVER 성능 및 잠금에 관한 정보.

 

* DICT 테이블 안에 모든 data dictionary 정보가 있다.

>> 유저가 소유한 개별 객체 유형을 봄.

SELECT * FROM USER_TABLES

>> 유저가 소유한 TABLE, VIEW, 동의어, 시퀀스를 봄.

SELECT DISTINCT object_type

FROM USER_OBJECTS ( USER ACCESS 할 수 있는 ALL_OBJECTS )

>> User가 소유한 TABLE을 설명.

SELECT * FROM USER_CATALOG

--> SELECT * FROM cat 이라고 써도 된다.

>> 모든 테이블 이름보기 SELECT * FROM TAB

>> 컬럼 정보 보기 USER_TAB_COLUMNS

 

5. Data Types

VARCHAR2(size) : Variable-length character data (1 ~ 4000 bytes)

CHAR(size) : Fixed-length character data (1 ~ 2000 bytes)

NUMBER(p,s) : p - precision, s - scale

DATE : B.C.4712-01-01 ~ A.D.9999.12.31

LONG : Variable-length character data (2GB)

- table 당 하나 - constraints 사용 못함

- order by, group by에서 사용못함 - 서브쿼리에서 사용할 때 not copy

LONG RAW : Raw binary data of variable length up to 2 gigabytes

RAW(size) : 2000 byte

CLOB : Single-byte character data up to 4 gigabytes

BLOB : Binary data up to 4 gigabytes

BFILE : binary data stored in an external file; up to 4 gigabytes

 

6. Subquery를 사용해서 테이블 복사하기(새로운 table datatype 정의는 필요없다)

CREATE TABLE dept30

AS

SELECT empno, ename, sal*12 ANNSAL, hiredate

FROM emp

WHERE deptno = 30

 

* computed field일때 반드시 컬럼 alias를 줘야 한다. (ANNSAL)

* computed 컬럼으로 만들어진 컬럼 타입 NUMBER일 때 기존의 자릿수는 사라지고

최대자리수로 잡힌다.

* column, type, data 모든것이 복사된다.(NOT NULL constraints 만 상속된다.)

* key constraint는 정의되지 않는다.

* WHERE조건을 false가 되게 만들면 데이터는 복사되지 않는다.

 

7. 테이블에 컬럼 추가 하기

ALTER TABLE dept30

ADD ( job VARCHAR2(9) )

-> 열을 추가할 때 모든 행은 초기에 null 값을 가진다.( not null 제약조건 X )

 

8. 테이블에 있는 기존 컬럼 수정하기

ALTER TABLE dept30

MODIFY ( ename VARCHAR2(15) )

 

* 제약사항.

- 숫자타입에서 자릿수를 늘리는건 가능하다.

- 숫자타입에서 자릿수를 줄일때는 모든 data null이거나 데이터가 한건도 없을 때만 가능하다.

- char <--> varchar2 로 바꿀때는 모든 data null이거나 데이터가 한건도 없을 때만 가능하다.

- default값도 바꿀 수 있다.(기존 default값은 유지된다.)

- column name modify 가 안된다.

=> 열을 추가(ADD), 수정(MODIFY)할 수 있지만 table에서 삭제할 수 없다.

 

<oracle 8i 가능>

1.> ALTER TABLE table SET UNUSED (column);

OR

ALTER TABLE table SET UNUSED COLUMN column;

2.>ALTER TABLE table DROP UNUSED COLUMNS;

 

9. DROP TABLE

DROP TABLE dept30

 

10. OBJECT 이름 바꾸기

RENAME dept TO department

 

11. TRUNCATE TABLE

TRUNCATE TABLE department

* ROLLBACK을 절대로 할 수 없다.

* 로그없이 테이블의 전체 데이터가 삭제되고 COMMIT이 된다.

* 저장공간을 해제( DELETE 문은 해제할 수 없다.)

 

12. 테이블에 주석문 추가하기

COMMENT ON TABLE emp

IS 'Employee Information'

 

13. 컬럼에 주석문 추가하기

COMMENT ON TABLE emp COLUMN emp.ename

IS 'Employee Name'

 

14. 주석문 삭제하기

COMMENT ON TABLE emp IS ' '

 

15. 주석문을 볼수있는 data dictionary

* Column

ALL_COL_COMMENTS

USER_COL_COMMENTS

* Table

ALL_TAB_COMMENTS

USER_TAB_COMMENTS

 

 

[11] Including Constraints

1. 오라클의 Constraint Type

NOT NULL : null value를 허용하지 않음.

UNIQUE : 유일한 값을 가지면서 null도 허용한다.

PRIMARY KEY : NOT NULL, UNIQUE, TABLE 1개 설정, 참조 당함

FOREIGN KEY : Primary에 연결되어 있어서 Primary에 있는 값들만 갖고 있다.(PK,UK 참조)

CHECK : 정해진 값 이외의 것이 들어오면 Error

 

2. Constraint 규칙

- Constraint을 생성할 때 이름을 주지 않으면 오라클서버는 SYS_Cn 이라고 이름을 자동 생성한다.

- Column level Table level Constraint를 정의한다.

- constraint를 볼 수 있는 Data Dictionary

USER_CONSTRAINTS,USER_CONS_COLUMNS 이다.

 

3. Constraint 정의

* Column Level

column [CONSTRAINT constraint_name] constraint_type,

* Table Level

column,...

[CONSTRAINT constraint_name] constraint_type (column, ...),

(column, ...),

* not null은 반드시 column level로 정의를 내려야 한다.

 

4. NOT NULL Constraint : column level

 

5. UNIQUE Constraint : index 자동 생성

CREATE TABLE dept (

deptno NUMBER(2),

dname VARCHAR2(14),

loc VARCHAR2(13),

CONSTRAINT dept_dname_uk UNIQUE (dname) )

 

6. PRIMARY KEY Constraint

CREATE TABLE dept (

deptno NUMBER(2),

dname VARCHAR2(14),

loc VARCHAR2(13),

CONSTRAINT dept_dname_uk UNIQUE (dname) ,

CONSTRAINT dept_deptno_pk PRIMARY KEY (deptno) )

 

7. FOREIGN KEY Constraint

CREATE TABLE emp (

empno NUMBER(4),

ename VARCHAR2(10) [CONSTRAINT epm_ename_nn] NOT NULL,

job VARCHAR2(9),

mgr NUMBER(4),

hiredate DATE,

sal NUMBER(7,2),

comm NUMBER(7,2),

deptno NUMBER(7,2) NOT NULL,

CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno)

REFERENCES dept (deptno) )

--> dept.deptno emp.deptno Foreign key로 사용하겠다는 뜻.

* column level로 정의할 때는...(FOREIGN KEY 키워드는 생략)

deptno NUMBER(7,2) NOT NULL

CONSTRAINT emp_deptno_fk REFERENCES dept (deptno),

* ON DELETE CASCADE

Foreign key로 연결된 parent data가 삭제될 때 child data도 모두 삭제 되게 만든다.

 

8. CHECK Constraint

..., deptno NUMBER(2),

CONSTRAINT emp_deptno_ck

CHECK (deptno BETWEEN 10 AND 99), ...

--> deptno의 값은 10에서 99 사이에 있는 값들만 입력이 가능하다는 뜻.

* CURRVAL, NEXTVAL, LEVEL, ROWNUM Pseudocolumn엔 허용되지 않는다.

* SYSDATE, UID, USER, USERENV 함수들을 호출할수 없다.

 

* 제약조건을 추가(ADD), 삭제(DROP)할 수 있지만 수정할 수는 없다.

* 제약조건을 설정(ENABLE) 또는 해제(DISABLE)합니다.

* MODIFT 절을 사용하여 NOT NULL 제약조건을 추가합니다.

 

9. ADD Constraint

*ALTER TABLE table_name

ADD [CONSTRAINT constraint] type (column),

ALTER TABLE emp

ADD CONSTRAINT emp_mgr_fk

FOREIGN KEY(mgr) REFERENCES emp(empno)

* Constraint 수정은 할 수 없다.

* not null constraint일 경우 ADD로 하지 않고 MODIFY로 한다.

(기존 행에 null data 값이 없어야 한다.)

 

10. DROP Constraint

*ALTER TABLE table_name

DROP (PRIMARY KEY| UNIQUE (column) |

CONSTRAINT constraint) [CASCADE];

ALTER TABLE emp

DROP CONSTRAINT emp_mgr_fk

* Primary를 삭제할 때 Foreign Key관계(종속된 제약조건) Constraint까지 DROP 하고 싶으면...

ALTER TABLE dept

DROP PRIMARY KEY CASCADE

* CASCADE CONSTRAINTS 절은 DROP COLUMN 절과 함께 사용됩니다.

ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;

 

11. DISABLE CONSTRAINT(CREATE TABLE, ALTER TABLE 문에서 사용)

: ENABLE CONSTRAINT 하기 전까지 실행을 멈춘다.

ALTER TABLE emp

DISABLE CONSTRAINT emp_empno_pk CASCADE

 

12. ENABLE CONSTRAINT(CREATE TABLE, ALTER TABLE 문에서 사용)

ALTER TABLE emp

ENABLE CONSTRAINT emp_empno_pk

* ENABLE 할 때는... 모든 data를 체크하기 때문에 시간이 오래 걸린다.

 

*

13. USER_CONSTRAINTS Data Dictionary

SELECT constraint_name, constraint_type, search_condition

FROM user_constraints

WHERE table_name = 'EMP'

 

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

CONSTRAINT_NAME C SEARCH_CONDITION

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

SYS_C00674 C EMPNO IS NOT NULL

SYS_C00675 C DEPTNO IS NOT NULL

EMP_EMPNO_PK P

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

 

14. USER_CONS_COLUMNS Data Dictionary

SELECT constraint_name, column_name

FROM user_cons_columns

WHERE table_name = 'EMP'

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

CONSTRAINT_NAME COLUMN_NAME

EMP_DEPTNO_FK DEPTNO

EMP_EMPNO_PK EMPNO

EMP_MGR_FK MGR

SYS_C00674 EMPNO

SYS_C00675 DEPTNO

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

 

 

[12] Creating Views

* Oracle8부터는 View에도 Data를 갖고 있을 수 있다.

* View를 사용하는 이유?

- 데이터베이스 access를 제한한다.

- 복잡한 쿼리를 쉽게 만든다.

- 데이터의 독립을 허용하기 위해

- 동일한 데이터로부터 다양한 결과를 얻기 위해

* view를 만들 때 ORDER BY절을 사용할 수 없다.

* Simple View에는 DML 문장을 수행 할 수 있지만, 함수 또는 데이터 그룹을 포함하지 못한다.

(복합뷰<Complex VIEW> 함수 또는 데이터 그룹을 포함할 수 있다.)

* GROUP함수, GROUP BY, DISTINCT keyword등을 사용한 view에는 행을 delete 할 수 없다.

* 뷰를 사용한 데이터 엑세스

- USER_VIEWS에서 뷰 정의를 검색한다.(select 문의 텍스트는 LONG 열에 저장된다.)

- 뷰의 기본 테이블에 대한 액세스 권한을 확인한다.

- 데이터를 기본 테이블에서 검색 또는 갱신한다.

1. CREATE VIEW 문장

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view

[ (alias[, alias]...) ]

AS subquery

[WITH CHECK OPTION [CONSTRAINT constraint]]

[WITH READ ONLY]

 

OR REPLACE : 만들려고 하는 view가 이미 존재할 때 recreate한다.

FORCE : base table이 존재하지 않아도 view를 강제로 만든다.

NOFORCE : base table이 반드시 존재해야만 view를 만들 수 있다.

WITH CHECK OPTION : view를 만들 때 where조건에 있는 value

View를 통해서 DML 문장으로 수정하는 것을 막는다.

WITH READ ONLY : view를 통해서 DML문장을 수행하는 것을 막는다.

 

2. Creating View 예제1

CREATE VIEW empvu10

AS SELECT empno, ename, job

FROM emp

WHERE deptno = 10 ;

--> 이렇게 만들어진 view column이름은 empno, ename, job이 된다.

 

3. Creating View 예제2

CREATE VIEW salvu30

AS SELECT empno employee_number, ename name, sal salary

FROM emp

WHERE deptno = 30 ;

--> column alias를 준 employee_number, name, salary view column이름이 된다.

 

4. VIEW 수정하기 (OR REPLACE)

CREATE OR REPLACE VIEW empvu10

(employee_number, employee_name, job_title)

AS SELECT empno, ename, job

FROM emp

WHERE deptno = 10 ;

 

5. Complex VIEW

CREATE VIEW detp_sum_vu

(naem, minsal, maxsa, avgsal)

AS SELECT d.dname, MIN(e.sal), MAX(e.sal), AVG(e.sal)

FROM emp e, dept d

WHERE e.deptno = d.deptno

GROUP BY d.dname ;

 

6. WITH CHECK OPTION 사용예

CREATE OR REPLACE VIEW empvu20

AS SELECT *

FROM emp

WHERE deptno = 20

WITH CHECK OPTION CONSTRAINT empvu20_ck ;(deptno 20만 작업 가능)

( constraint name을 주지 않으면 SYS_Cn으로 만들어 진다. )

* 예를들어 다음과 같은 update문장을 수행하면 error가 난다.

UPDATE empvu20

SET deptno = 10

WHERE empno = 7788 ;

--> ORA-01402: view WITH CHECK OPTION where-clause violation

 

7. WITH READ ONLY 사용예

CREATE OR REPLACE VIEW empvu10

(employee_number, employee_name, job_title)

AS SELECT empno, ename, job

FROM emp

WHERE deptno = 10

WITH READ ONLY ;

* 예를들어 다음과 같은 DELETE문장을 수행하면 error가 난다.

DELETE FROM empvu10

WHERE employee_number = 7782 ;

--> ORA-01752: Cannot delete from view without exactly one key-preserved table

 

8. View 없애기

DROP VIEW empvu10 ;

 

9. 만들어진 View를 볼때

SELECT * FROM salvu30 ;

* 인라인 view : FROM 절에 사용, 객체가 아님.

 

10. View를 통한 DML 작업 수행에 관한 규칙

*뷰가 다음을 포함한 경우 행을 제거할 수 없슴.

- 그룹함수 - GROUP BY - DISTINCT 키워드 - 의사열 ROWNUM 키워드

*뷰가 다음을 포함한 경우 데이터를 수정할 수 없슴.

- 위에서 언급된 모든 조건(제거할 수 없슴)

- ROWNUM 의사 열 : 하위 질의에서 반환되는 가 행에 1에서 시작하는 순차값을 할당.

*뷰가 다음과 같은 경우 데이터를 추가할 수 없슴.

- 뷰가 위에서 언급한 포함하는 경우.(제거, 수정)

- 기본 테이블에서 뷰에 의해 선택되지 않은 열에 NOT NULL 제약 조건이 있는 경우.

 

11. "TOP-N" 분석 수행

SELECT [column_list], ROWNUM

FROM (SELECT [column_list] FROM table

ORDER BY TOP-N_column)

WHERE ROWNUM <= N ( where 절은 < 또는 <= )

 

[13] Other Database Objects (Sequence, Index, Synonym)

1. Sequence?

- unique한 숫자를 자동으로 부여한다.

- 공유 가능하다.

- primary key 성격을 갖는다.

- cache 설정을 할 수 있기 때문에 빠른 속도를 낼 수 있다.

 

2. CREATE SEQUENCE 문장

CREATE SEQUENCE sequence

[INCREMENT BY n] : default 1

[START WITH n] : default 1

[{MAXVALUE n | NOMAXVALUE}]

[{MINVALUE n | NOMINVALEU}]

[{CYCLE | NOCYCLE}]

[{CACHE n | NOCACHE{] ; : default 20개의 cache

 

INCREMENT BY n : n만큼 증가 한다.

START WITH n : 처음 시작하는 숫자는 n이다.

MAXVALUE n : MAX값은 n이다.

NOMAXVALUE : MAX값은 무한대다. (10^27 OR -1) --> default

MINVALUE n : MIN값은 n이다.

NOMINVALUE : MIN값은 무한대다. (-(10^26) OR 1 ) --> default

CYCLE | NOCYCLE : MAX MIN값으로 갔을때 다시 처음부터 새로

시작할 건지를 설정한다. default NOCYCLE

CACHE n | NOCACHE : n만큼의 CACHE를 줄 것인지를 설정한다.

--> default cache 20으로 잡는다.

 

3. CREATE SEQUENCE 예제

CREATE SEQUENCE dept_deptno

INCREMENT BY 1

START WITH 91

MAXVALUE 100

NOCACHE

NOCYCLE ;

 

4. USER_SEQUENCES data dictionary

SELECT sequence_name, min_value, max_value, increment_by, last_number

FROM USER_SEQUENCES ;

* last_number는 다음에 sequence 가능 한 숫자를 보여준다.

 

5. NEXTVAL CURRVAL

NEXTVAL : Sequence 1개 증가된다.

CURRVAL : 현재 sequence 값을 보여준다.

 

* 사용가능

- SELECT문장에서 SELECT list

- INSERT문장에서 SELECT list, values list

- UPDATE문장에서 SET

 

* 사용불가

- View SELECT list

- SELECT문장에서 DISTINCT keyword

- SELECT문장에서 GROUP BY, HAVING, ORDER BY

- SELECT, DELETE, UPDATE문장 안에 있는 subquery

- CREATE TABLE, ALTER TABLE문장에서 DEFAULT expression

 

* CACHE 20으로 정의 했을 때...

INSERT INTO dept

VALUES (dept_deptno.NEXTVAL, ...) --> 1

SELECT last_number FROM user_squences --> 21

SELECT dept_deptno.CURRVAL FROM dual --> 1

SELECT dept_deptno.NEXTVAL FROM dual --> 2

6. SEQUENCE 사용예

INSERT INTO dept( deptno, dname, loc )

VALUES (dept_deptno.NEXTVAL, 'MARKETING', 'SAN DIEGO')

--> 증가된 sequence값이 deptno에 저장된다.

 

* 현재의 sequence값을 보려면...

SELECT dept_deptno.CURRVAL FROM dual ;

* SELECT에서 sequence값 증가시키기

SELECT dept_deptno.NEXTVAL FROM dual ;

 

7. SEQUENCE 수정하기

ALTER SEQUENCE dept_deptno

INCREMENT BY 1

MAXVALUE 999999

NOCACHE

NOCYCLE ;

* sequence에 대한 ALTER privilege를 갖고 있어야 한다.

* maxvalue current value보다 적을 땐 반드시 drop하고 re-create해야 한다.

* START WITH 문을 변경할 수 없습니다.( 삭제 후 다시 생성 )

8. SEQUENCE 제거하기

DROP SEQUENCE dept_deptno ;

 

9. INDEX ?

- Retrieve를 빨리 하기 위해서

- DISK I/O를 줄일수 있다.

- 테이블과는 독립적이다.

* PRIMARY KEY or UNIQUE constraint 생성시 오라클 서버에서 자동으로 생성되는것과, CREATE INDEX를 사용해서 만들어지는 index가 있다.

* INDEX는 많이 만든다고 좋은게 아니다.

* INDEX는 이렇때 만드는게 좋다.

- WHERE절이나 JOIN조건에 자주나오는 column

- column의 범위가 클때

- null value를 많이 갖고 있는 column

- 전체 row에서 2~4% 정도의 row를 찾을때

 

10. CREATE INDEX

CREATE INDEX index

ON table (column[, column]...) ;

CREATE INDEX emp_ename_idx

ON emp (ename) ;

 

11. USER_INDEXES and USER_IND_COLUMNS data dictionary

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 ic.table_name = 'EMP' ;

 

12. INDEX 제거하기

DROP INDEX emp_ename_idx ;

 

13. SYNONYM ?

user synonym을 사용하면 스키마를 별도로 명시할 필요가 없어진다.

 

14. CREATE SYNONYM

CREATE [PUBLIC] SYNONYM synonym

FOR object ;

* PUBLIC은 모든 user에게 synonym권한을 주는 것이고, DBA권한이 있는 사람만

사용이 가능하다.

* PUBLIC을 안쓰면 만든 사람만 사용한다.

 

CREATE SYNONYM d_sum

FOR dept_sum_vu ;

--> dept_sum_vu라는 view테이블을 d_sum으로 사용 하겠다.

 

15. PUBLIC SYNONYM

CREATE PUBLIC SYNONYM dept

FOR alice.dept

--> alice가 만든 dept테이블을 dept로 모든 유저에게 명시 하겠다.

 

16. SYNONYM 제거

DROP SYNONYM d_sum ;

* public으로 정의된 SYNONYM DBA만 제거가 가능하다.

 

 

[14] Controlling User Access (GRANT, REVOKE)

* 시스템 권한(System Privilege): 데이터 베이스를 액세스할 수 있다.

* 객체 권한(Object Privilege) : 데이터 베이스 객체 내용을 조작할 수 있다.

1. System Privilege? --> DBA권한

- Create new users ( CREATE USER )

- Remove users ( DROP USER )

- Remove tables ( DROP ANY TABLE )

- Backup tables ( BACKUP ANY TABLE )

 

2. Creating User

CREATE USER scott

IDENTIFIED BY tiger ;

 

3. system privilege에서의 GRANT

GRANT privilege [, privilege...]

TO user [, user...]

[WITH ADMIN OPTION] ;

* WITH ADMIN OPTION : dba가 권한을 주는 user에게도 admin 권한을 줄 수 있다.

* user system privilege(DBA USER에게 할당 할 수 있는 권한)

CREATE SESSION : 테이터베이스에 connect하는 권한

CREATE TABLE : 테이블 만드는 권한

CREATE SEQUENCE : sequence 만드는 권한

CREATE VIEW : view 만드는 권한

CREATE PROCEDURE : stored prcedure, function 만드는 권한

GRANT create table, create sequence, create view

TO scott

--> scott에게 table, sequence, view만드는 권한을 준다.

 

4. ROLE : 사용자에게 부여할 수 있는 관련 권한을 하나로 묶어 명명한 그룹

Grant를 줄 role user를 만든후 그 role user grant를 주고,

role user의 권한을 각각의 user에게 넘겨준다.

SQL> CREATE ROLE manager ;

Role created.

SQL> GRANT create table, create view TO manager ;

Grant succeeded.

SQL> GRANT mananger TO brake, clock ;

Grant succeeded.

 

5. User Password 변경하기

ALTER USER user IDENITIFIED BY password ;

) ALTER USER scott IDENTIFIED BY lion ;

 

6. Object Privileges?

* 객체마다 다르다.

* 소유자는 객체에 대한 모든 권한을 갖는다.

* 소유자는 자신의 객체에 대한 특정 권한을 부여할 수 있다.

 

 

7. Object Privilege에서의 GRANT

GRANT object_priv [(columns)| ALL]

ON object

TO {user|role|PUBLIC}

[WITH GRANT OPTION] ;

* sue, rich 라는 user에게 emp 테이블을 select 권한을 준다.

GRANT select

ON emp

TO sue, rich ;

* scott, manager라는 user에게 dept 테이블의 dname,loc 컬럼을 update할 수 있게 권한을 준다.

GRANT update (dname, loc)

ON dept

TO scott, manager ;

 

* WITH GRANT OPTION

GRANT select, insert

ON dept

TO scott

WITH GRANT OPTION ;

--> scott에게 dept 테이블의 select, insert권한을 주면서 scott가 다른 유저에게도

이 권한을 줄 수 있게 한다.

 

* PUBLIC : 모든 유저에게 권한을 부여한다.

GRANT select

ON alice.dept

TO PUBLIC ;

--> 모든유저에게 alice가 만든 dept 테이블의 select권한을 준다.

 

* 모든 유저에게 모든 object권한을 주기

GRANT ALL

ON emp

TO PUBLIC ;

 

8. 권한 없애기 (REVOKE)

REVOKE {privilege [, privilege...] | ALL}

ON object

FROM {user[, user...]|role|PUBLIC}

[CASCADE CONSTRAINTS]

 

REVOKE select, insert

ON dept

FROM scott ; --> scott에게서 dept테이블의 select, insert권한을 없앤다.

* CASCADE CONSTRAINTS : 이 옵션을 않쓰면 revoke할 때 forien key

관계의 table revoke할 수 없다.

 

9. Privilege Grant를 볼 수 있는 Data Dictionary

ROLE_SYS_PRIVS : System privilege 권한에 대한 정보

ROLE_TAB_PRIVS : table(object) privilege 권한에 대한 정보

USER_ROLE_PRIVS : role정보

USER_TAB_PRIVS_MADE : 내가 다른 사람에게 준 TABLE 권한에 대한 정보

USER_TAB_PRIVS_RECD : 내가 다른 사람에게 받은 TABLE 권한에 대한 정보

USER_COL_PRIVS_MADE : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보

USER_COL_PRIVS_RECD : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보

 

*****************************************************************

TABLE <--> PROCEDURE

VIEW : DML 수행

SEQUENCE : ALTER, SELECT

******************************************************************

 

출처 : SQLER

select * from user_catalog;

프로그래밍/DB 2007. 11. 27. 14:31 Posted by galad

select * from user_catalog;

'프로그래밍 > DB' 카테고리의 다른 글

[펌] 오라클자료 - PL/SQL  (0) 2007.11.27
[펌] PL-SQL 정리  (0) 2007.11.27
[펌] SQL*Plus에서 꼭 알아두어야 할 활용 매뉴얼~!  (0) 2007.11.27
[펌] 인덱스 생성 [CREATE INDEX]  (0) 2007.11.27
Tablespace 정보보기  (0) 2007.11.27
SQL*Plus에서 꼭 알아두어야 할 활용 매뉴얼~!

● 제 1 장 데이터의 검색
• SQL 명령어는 다음과 같이 기술한다.
■ SQL 명령어는 한 줄 혹은 여러 줄에 기술한다.
■ 일반적으로 절들은 수정하기 쉽게 다른 줄에 기술한다.
■ TAB 을 사용할 수 있다.
■ SQL 명령어 단어는 생략하거나 분리할 수 없다.
■ SQL 명령어는 대소문자를 구분하지 않는다.
■ SQL 명령어는 ; 으로 종료한다.
■ SQL 명령어는 SQL BUFFER 에 저장된다.
■ SQL BUFFER 에 저장된 SQL 명령어는 / 혹은 RUN 으로 실행할 수 있다.
•SQL*PLUS 명령어는 다음과 같이 기술한다.
■ SQL*PLUS 명령어는 기본적으로 한 줄에 기술한다.
■ SQL*PLUS 명령어는 대소문자를 구별하지 않는다.
■ SQL*PLUS 명령어는 SQL BUFFER 에 저장되지 않는다.
■ SQL*PLUS 명령어는 다음과 같다.
? DESCRIBE table명 : TABLE 의 구조를 보여준다.
? SAVE file명 : SQL BUFFER 를 file 로 저장한다.
? START file명 : file 을 수행한다.
? @ file명 : file 을 수행한다.
? EDIT file명 : EDITOR 를 사용하여 file 을 편집한다.
? SPOOL file명 : QUERY 결과를 file 에 저장한다.
? SPOOL OFF : SPOOL FILE 을 닫는다.
? HOST : SQL*PLUS 를 떠나지 않고 HOST 상태로 간다.
? HELP 명령어 : SQL, SQL*PLUS, PL/SQL 에 대한 HELP 를 보내준다.
? EXIT : SQL*PLUS 를 종료한다.

• 전체 데이타의 검색
가장 간단한 SELECT 문장의 형식은 다음과 같다.
. SELECT 절에는 검색하고 싶은 COLUMN 명들을 기술한다.
. FROM 절에는 SELECT 절에서 기술된 COLUMN 명들이 포함된 TABLE 명을 기술한다.
TABLE 의 모든 ROW 와 모든 COLUMN 을 검색한다.
SELECT * - FROM table명 ;
[ 예제 ] S_DEPT TABLE 로부터 모든 ROW 와 COLUMN 을 검색하시오.
SELECT *
FROM S_DEPT ;

• 특정 column의 검색
SELECT 절에서 검색하고자 하는 COLUMN 명을 COMMA 를 사용하여 나열한다.
COLUMN 순서는 검색하고 싶은 순서대로 나열한다.
COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다.
SELECT column명, column명, column명,.. - FROM table명 ;
[ 예제 ] S_EMP TABLE 로부터 ID, LAST_NAME, START_DATE 를 검색하시오.
SELECT ID, LAST_NAME, START_DATE
FROM S_EMP ;

- 계속(1) -


• 산술식을 사용한 검색
산술 연산자를 사용하여 검색되는 데이타 값을 변경할 수 있으며 산술 연산식은 COLUMN 명, 상수 값, 산술 연산자로 구성됨.
SELECT 산술연산식 - FROM table명 ;
[ 예제 ] S_EMP TABLE 로부터 ID, LAST_NAME, 연봉을 검색하시오. (연봉은 SALARY * 12 로 계산한다. (+,-,*,/,())
SELECT ID, LAST_NAME, SALARY * 12
FROM S_EMP ;

• Column alias
기본적으로 COLUMN HEADING 은 COLUMN 명이 대문자로 출력된다. 그러나 많은 경우 COLUMN 명이 이해하기 어렵거나
무의미하기 때문에 COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.
ANSI SQL 92 와 호환을 위해 ALIAS 앞에 AS 를 붙일 수 있다.
ALIAS 에 공백이나 특수문자가 포함되거나 대소문자를 구별하고 싶으면 " " 로 막아준다.
COLUMN ALIAS 를 사용하여 COLUMN HEADING 을 변경할 수 있다.
SELECT column명 alias, column명 "alias", column명 as alias - FROM table명 ;
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, (SALARY + 100) * 12, DEPT_ID 를 검색하시오.
(단, COLUMN ALIAS 는 Employee, ANNUAL_SALARY, DEPARTMENT NO 로 정의하시오.)
SELECT LAST_NAME "Employee", (SALARY + 100) * 12 AS ANNUAL_SALARY,
DEPT_ID "DEPARTMENT NO"
FROM S_EMP ;

• Column의 결합
COLUMN 과 다른 COLUMN, 산술연산식, 상수 값과 결합하여 하나의 COLUMN 으로 결합할 수 있다.
SELECT column명|| column명 - FROM table명;
[ 예제 ] S_EMP TABLE 에서 FIRST_NAME 과 LAST_NAME 을 결합하여 ALIAS EMPLOYEE 로 검색하시오.
SELECT FIRST_NAME || LAST_NAME EMPLOYEE
FROM S_EMP ;

• Null값 처리
특정 COLUMN 에 값이 입력되어 있지 않을 때, 그 값이 NULL 이며, NULL 값이 산술 연산식에 포함되면 그 결과도 NULL 이다.
NULL 값은 0 이나 공백과 같지 않다. 그러므로 NVL FUNCTION 을 사용하여 NULL 값을 다른 값으로 대체하여야 한다.
NULL 값을 다른 값으로 대체.NVL (number_column, 9), NVL (date_column, '01-JAN-95'), NVL (character_column, 'ABCDE')
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, COMMISSION 값을 검색하시오.
(COMMISSION 은 SALARY * COMMISSION_PCT /100 으로 계산하시오.)
SELECT LAST_NAME, SALARY * NVL(COMMISSION_PCT,0) /100 COMMISSION
FROM S_EMP ;

• 중복 row의 제거
SELECT 결과 값에 중복된 값이 있을 때 중복을 피하고 UNIQUE 하게 검색한다. 중복된 ROW 를 제거한다.
SELECT DISTINCT column명, column명 - FROM table명;
[ 예제 ] S_DEPT TABLE 에서 NAME 이 중복되지 않게 검색하시오.
SELECT DISTINCT NAME
FROM S_DEPT ;



- 계속(2) -


• 데이타의 정렬
SELECT 되는 ROW 의 순서는 알 수 없다. 그러므로 ROW 를 SORT 하고 싶으면 ORDER BY 절을 사용하여야 한다.
DATA 의 DEFAULT SORT 순서는 ASCENDING 이며 다음과 같다.
? 숫자 : 1 에서 999 순으로 SORT 한다. ? 날짜 : 01-JAN-92 에서 01-JAN-95 순으로 SORT 한다.
? 문자 : A 에서 Z 순서로 SORT 한다. ? NULL : ASC 순에서는 뒤에, DESC 순에서는 앞에 나온다.
역순으로 SORT 하고 싶으면 COLUMN 명 뒤에 DESC 를 붙인다.
COLUMN 명 대신에 ALIAS 혹은 SELECT 한 COLUMN 의 순서로 지정할 수도 있다.
SELECT expr - FROM table명 - ORDER BY {column명, expr} [ASC|DESC] ;
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, DEPT_ID, START_DATE 를 LAST_NAME 순으로 검색하시오.
SELECT LAST_NAME, DEPT_ID, START_DATE
FROM S_EMP ORDER BY LAST_NAME ;

• 특정 row의 검색
WHERE 절에서 조건식을 기술하여 조건을 만족하는 ROW 만 검색할 수 있다.
조건식은 COLUMN 명, COMPARISON OPERATOR, VALUE 로 구성되어 있다.
문자 값은 ' ' 으로 묶어주고 값의 대소문자를 구별하여 적어준다. 날짜 값은 ' ' 으로 묶어주고 지정된 날짜 형태로 적어준다. '01-MAR-97', 숫자값은 값만 적어주며 특정 ROW 만 검색한다.
SELECT expr - FROM table명 - WHERE expr operator value
[ 예제 ] S_EMP TABLE 에서 LAST_NAME 이 Magee 인 사원의 FIRST_NAME, LAST_NAME,
TITLE 을 검색하시오. (=,>,<,>=,<=,<>) SELECT FIRST_NAME, LAST_NAME, TITLE
FROM S_EMP WHERE LAST_NAME = 'Magee' ;

• Between...and
BETWEEN OPERATOR 를 사용하여 범위를 지정할 수 있다. 범위를 지정할 때는 작은 값을 먼저 큰 값을 나중에 지정한다.
두 범위의 한계 값을 포함한다. BETWEEN...AND... - NOT BETWEEN...AND...
[ 예제 ] S_EMP TABLE 에서 START_DATE 가 09-MAY-91 에서 17-JUN-91 사이에 입사한 사원의 FIRST_NAME, LAST_NAME, START_DATE 를 검색하시오.
SELECT FIRST_NAME, LAST_NAME, START_DATE
FROM S_EMP WHERE START_DATE BETWEEN '09-MAY-91' AND '17-JUN-91' ;

• In[list]
IN OPERATOR 를 사용하여 나열된 값들 중에서 값을 검사한다.
IN(LIST), NOT IN(LIST)
[ 예제 ] S_EMP TABLE에서 DEPT_ID 가 10, 31, 41, 50 인 사원의 FIRST_NAME, LAST_NAME, DEPT_ID 를 검색하시오.
SELECT FIRST_NAME, LAST_NAME, DEPT_ID
FROM S_EMP WHERE DEPT_ID IN (10, 31, 41, 50) ;

• like
찾고자 하는 값을 정확히 모를 때, LIKE OPERATOR 를 사용하여 문자형태가 같은 ROW 를 검색한다.
WILDCARD 를 사용하여 문자의 형태를 지정한다. (% : 여러 문자, _ : 한문자 )
LIKE '형태', NOT LIKE '형태'
[ 예제 ] S_EMP TABLE에서 LAST_NAME 이 M 으로 시작하는 사원의 LAST_NAME 을 검색하시오.
SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE 'M%' ;
SELECT LAST_NAME FROM S_EMP WHERE LAST_NAME LIKE '__M____' ;

- 계속(3) -

• is null
IS NULL OPERATOR을 사용하여 값이 NULL 인 것을 찾을 수 있다.
NULL 값은 값이 정의되지 않은 것을 의미하기 때문에 = OPERATOR를 사용하여 어떤 값과 비교할 수 없기 때문에 사용한다.
IS NULL, IS NOT NULL
[ 예제 ] S_EMP TABLE에서 COMMISSION_PCT가 NULL인 사원의 LAST_NAME, SALARY, COMMISSION_PCT를 검색하시오.
SELECT last_name, salary,commission_pct,last_name, salary
FROM s_emp WHERE commission_pct is null;

• 조건식의 결합
조건식을 기술할 때 AND 와 OR 를 사용하여 여러가지 조건을 결합할 수 있다.
AND 와 OR 가 같이 사용됐을 때 AND 가 먼저 수행되고 OR 가 나중에 수행된다.
그러므로 우선순위를 바꾸고자 하면 ( ) 를 사용한다.
WHERE 조건식 AND | OR 조건식
[ 예제 ] S_EMP TABLE에서 DEPT_ID가 41이고 TITLE이 Stock Clerk인 사원의 LAST_NAME, SALARY, DEPT_ID, TITLE을 검색하시오.
SELECT LAST_NAME, SALARY, DEPT_ID, TITLE
FROM S_EMP WHERE DEPT_ID = 41 AND TITLE = 'Stock Clerk' ;

● 제 2 장 Single Row Functions
• 소문자로 변환
모든 문자를 소문자로 변환시킨다.
LOWER(COLUMN명)
[ 예제 ] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 FIRST_NAME, LAST_NAME 을 소문자로 출력시키시오.
SELECT LOWER(FIRST_NAME), LOWER(LAST_NAME)
FROM S_EMP WHERE LOWER(LAST_NAME) = 'smith' ;

• 대문자로 변환
모든 문자를 대문자로 변환시킨다.
UPPER(COLUMN명)
[ 예제 ] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원의 TITLE 을 대문자로 출력하시오.
SELECT UPPER(TITLE)
FROM S_EMP WHERE UPPER(LAST_NAME) = 'SMITH';

• 첫글자만 대문자로 변환
단어의 첫글자는 대문자로, 나머지는 소문자로 변환시킨다.
INITCAP(COLUMN명)
[ 예제 ] S_EMP TABLE 에서 TITLE 을 단어의 첫글자만 대문자로 출력시키시오.
SELECT INITCAP(TITLE) FROM S_EMP ;

• 문자의 부분을 자름
문자를 시작위치(M)에서 자리수(N) 만큼 잘라준다. 자리수(N)이 생략되면 시작위치(M)에서 끝까지 잘라준다.
SUBSTR(COLUMN명, M, N)
[ 예제 ] S_PRODUCT TABLE 에서 NAME COLUMN 의 앞에서 부터 3글자가 Ace 인 제품의 NAME 을 출력하시오.
SELECT NAME FROM S_PRODUCT
WHERE SUBSTR(NAME, 1, 3) = 'Ace' ;

- 계속(4) -


• 문자의 길이를 계산
문자의 길이를 RETURN 한다.
LENGTH(COLUMN명)
[ 예제 ] S_PRODUCT TABLE 에서 NAME, NAME 의 길이를 출력하시오.
SELECT NAME, LENGTH(NAME)
FROM S_PRODUCT;

• 숫자의 반올림
지정된 자리수(M) 밑에서 반올림한다.
COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)는 다음과 같다.
      M : -3-2-1 0 1 2 3
ROUND(COLUMN명, M)
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, SALARY/22 의 값을 소수 2째 자리까지 나타내고 소수 3째 자리에서 반올림하시오.
SELECT LAST_NAME, ROUND(SALARY/22, 2)
FROM S_EMP ;

• 숫자의 절사
지정된 자리수(M) 까지 나타내고 그 밑은 잘라버린다.
COLUMN 값이 1 2 3 4. 5 6 7 일 때 자리수(M)은 다음과 같다.
      M : -3-2-1 0 1 2 3 절사 값은 RETURN 한다.
TRUNC(COLUMN명, M)
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, SALARY / 22 의 값을 십의 자리까지 나타내고 일의 자리는 버림.
SELECT LAST_NAME, TRUNC(SALARY/22, -1)
FROM S_EMP ;

• 나누기의 나머지
M 을 N 으로 나누고 남은 나머지를 RETURN 한다.
MOD(M, N)
[ 예제 ] 10 을 3 으로 나눈 나머지를 구하시오.
SELECT MOD(10, 3)
FROM SYS.DUAL ;

• 날짜의 연산
DATABASE 안의 DATE 값은 다음과 같은 숫자로 저장되어 있다.
■ CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS 그러므로 산술 연산을 할 수 있다.
● DATE + NUMBER : 숫자만큼 일이 더해진 날짜가 RETURN 된다.
● DATE - NUMBER : 숫자만큼 일이 빼진 날짜가 RETURN 된다.
● DATE1 - DATE2 : 두 날짜 사이의 일수가 계산된다.
날짜 계산을 한다. (DATE + NUMBER, DATE - NUMBER, DATE1 - DATE2)
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, 입사한지 90 일째 되는 날, 입사한지 며칠 됐는 지 검색하시오.
SELECT LAST_NAME, START_DATE + 90, SYSDATE - START_DATE
FROM S_EMP; ( 날짜에는 시간도 포함되어 있으므로 일수 계산의 결과가 소수로 나온다. )



- 계속(5) -


• 날짜 사이의 개월 수
두 날짜 사이의 개월 수를 RETURN 한다.
MONTHS_BETWEEN(DATE1, DATE2)
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, 입사한지 몇 달이 됐는지 출력하시오.
SELECT LAST_NAME, MONTHS_BETWEEN(SYSDATE, START_DATE)
FROM S_EMP ; (일이 포함되어 있어서 소수로 출력된다.)

• 날짜에 달을 더함
날짜에서 숫자(N) 개월만큼 더해진 날짜를 RETURN 한다.
ADD_MONTHS(DATE, N)
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, START_DATE, 입사한지 3 개월되는 날짜를 출력하시오.
SELECT LAST_NAME, START_DATE, ADD_MONTHS(START_DATE, 3)
FROM S_EMP ;

• 지정한 요일 날짜
날짜에서 지정한 요일(CHAR)이 될 날짜를 RETURN 한다.
NEXT_DAY(DATE, 'CHAR')
[ 예제 ] 오늘을 기준으로 돌아오는 금요일이 언제인지 출력하시오.
SELECT SYSDATE, NEXT_DAY(SYSDATE, 'FRIDAY')
FROM SYS.DUAL ;

• 그 달의 마지막 날
날짜가 포함된 달의 마지막 날을 RETURN 한다.
LAST_DAY(DATE)
[ 예제 ] 이번 달의 마지막 날은 언제인지 출력하시오.
SELECT SYSDATE, LAST_DAY(SYSDATE)
FROM SYS.DUAL ;

• 날짜의 반올림
형태에 따른 반올림 기준은 다음과 같다.
? YEAR : 6월 이후, ? MONTH : 15일 이후, ? DAY : 12시 이후
날짜 데이타를 지정된 형태까지 나타내고 그 이하에서 반올림한다.
ROUND(COLUMN명, '형태')
[ 예제 ] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 15일 이후는 다음달로 올리시오.)
SELECT ID, LAST_NAME, ROUND(START_DATE, 'MONTH')
FROM S_EMP ;

• 날짜의 절사
날짜 데이타를 지정된 형태까지 나타내고 그 밑은 잘라낸다.
TRUNC(COLUMN명, '형태')
[ 예제 ] S_EMP TABLE 에서 ID, LAST_NAME, 입사 시작 달을 검색하시오. (단, 일자는 잘라버리시오.)
SELECT ID, LAST_NAME, TRUNC(START_DATE, 'MONTH')
FROM S_EMP ;


- 계속(6) -


• 문자를 날짜로 변환
CHARACTER TYPE 을 지정된 형태의 DATE TYPE 으로 변환한다.
TO_DATE(character_column명, '형태')
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.
(단, START_DATE 의 값이 92/02/07 인 사원을 검색하시오.)
SELECT LAST_NAME, START_DATE
FROM S_EMP WHERE START_DATE = TO_DATE('92/02/07', 'YY/MM/DD') ;

• 날짜를 문자로 변환
DATE 값은 기본적으로 DD-MON-YY 형태로 출력된다.
이것을 TO_CHAR FUNCTION 을 사용하면 원하는 다른 형태로 변환할 수 있다.
■ 형태를 지정할 때 사용된 대소문자로 출력된다.
■ DAY 와 MONTH 형태는 공백을 포함한 9 자리로 출력된다.
■ TO_CHAR 의 결과는 80 자리로 출력된다.
DATE TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.
TO_CHAR(date_column, '형태')
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, START_DATE 를 검색하시오.
(단, START_DATE 의 형태는 1991/06/17 14:20:00 와 같이 출력하시오.)
SELECT LAST_NAME, TO_CHAR(START_DATE, 'YYYY/MM/DD HH24:MI:SS'), START_DATE
FROM S_EMP ;

• 숫자를 문자로 변환
NUMBER TYPE 을 지정된 형태의 CHARACTER TYPE 으로 변환한다.
TO_CHAR(number_column명, '형태')
[ 예제 ] S_EMP TABLE 에서 LAST_NAME, SALARY 를 검색하시오.(단 SALARY 를 $1,450 와 같은 형태로 출력시키시오.)
SELECT LAST_NAME, TO_CHAR(SALARY, '$999,999')
FROM S_EMP ;

● 제 3 장. 여러Table로부터 Data검색
• Equijoin
SIMPLE JOIN (EQUI-JOIN)
여러개의 TABLE 들로부터 정보를 검색하려면, SELECT 문장의 FROM 절에 TABLE명들을 적고
WHERE 절에 각 TABLE의 ROW들을 연결시킬 조건식을 기술한다.
각 TABLE 의 COLUMN명이 중복될 때는 반드시 COLUMN명 앞에 TABLE명을 붙여야 한다.
(중복되지 않을 때는 붙이지 않아도 되지만 명확성을 위해서나 ACCESS 를 위해서 붙이는 것이 좋다.)
N 개의 TABLE 을 JOIN 할 때는 최소한 N-1 개의 조건식이 필요하다.
복합 COLUMN 으로 JOIN 할 때는 더 많은 조건식이 필요하다.
2개 이상의 TABLE 에서 = 조건식을 만족시키는 ROW 들을 연결하여 검색한다.
SELECT table명.column명, table명.column명...-FROM table1명, table2명-WHERE table1명.column1명 = table2명.column명 ;
[ 예제 ] S_EMP TABLE 과 S_DEPT TABLE 을 사용하여 사원들의 LAST_NAME, DEPT_ID, NAME 을 검색하시오.
SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME
FROM S_EMP, S_DEPT WHERE S_EMP.DEPT_ID = S_DEPT.ID ;



- 계속(7) -


• 특정 row의 join
JOIN 문장을 기술할 때 JOIN 조건식 이외에 다른 조건식을 AND 로 연결할 수 있다.
SELECT table명.column명, table명.column명...
FROM table1명, table2명 - WHERE table1명.column1명 = table2명.column2명 AND condition ;
[ 예제 ] S_EMP TABLE과 S_DEPT TABLE 을 사용하여 LAST_NAME 이 Menchu 인 사원의 LAST_NAME, DEPT_ID,
NAME 을 검색하시오.
SELECT S_EMP.LAST_NAME, S_EMP.DEPT_ID, S_DEPT.NAME
FROM S_EMP, S_DEPT WHERE S_EMP.DEPT_ID = S_DEPT.ID AND S_EMP.LAST_NAME = 'Smith' ;

• Table alias
JOIN 문장에서 TABLE명이 긴 경우 TABLE명.COLUMN명 으로 적는 것이 매우 불편하다.
그런데 TABLE명 대신 ALIAS 를 사용하면 편하게 사용할 수 있다.
(SELECT 문장에서 TABLE명 대신 ALIAS 를 지정했다면 그 문장에서는 계속해서 ALIAS 로 사용하여야 한다.)
TABLE ALIAS를 사용하여 JOIN 문장을 간단하게 기술한다.
SELECT alias명.column명, alias명.column명
FROM table1명 alias1명, table2명 alias2명 - WHERE alias1명.column1명 = alias2명.column2명 ;
[ 예제 ] S_CUSTOMER TABLE과 S_REGION TABLE 을 사용하여 고객 명,지역번호,지역 명을 검색하시오.
(단, COLUMN ALIAS 와 TABLE ALIAS 를 사용하시오.)
SELECT C.NAME "Customer Name", C.REGION_ID "Region Id", R.NAME "Region Name"
FROM S_CUSTOMER C, S_REGION R WHERE C.REGION_ID = R.ID ;

• Non-Equijoin
NON-EQUIJOIN
JOIN 문장에서 두 TABLE 을 JOIN 하는 조건식에 = OPERATOR 가 사용되지 않고
다른 OPERATOR 가 사용되는 것을 말한다.
SELECT table명.column명, table명.column명... - FROM table1명, table2명 - WHERE 조인조건식 ;
[ 예제 ] EMP TABLE 과 SALGRADE TABLE 을 사용하여 사원의 ENAME, JOB, SAL,GRADE를 검색하시오.
SELECT E.ENAME, E.JOB, E.SAL, S.GRADE FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;
(BETWEEN OPERATOR 대신에 <= 와 >= 를 사용해도 되지만 BETWEEN 이 간편하다.)

• Outer Join
두 TABLE 을 JOIN 할 때 JOIN 조건식을 만족시키지 못하는 ROW 는 검색에서 빠지게 된다.
그런데 이러한 ROW 들이 검색되도록 하는 것이 OUTER JOIN 이다.
(+) OUTER JOIN OPERATOR 를 데이타가 없는 어느 한쪽의 COLUMN 쪽에 붙인다.
JOIN 결과, 데이타가 없는 쪽의 COLUMN 값은 NULL로 검색된다. 조건식을 만족시키지 못하는 데이타도 검색한다.
SELECT table명.column명, table명.column명 - FROM table1명, table2명
WHERE table1명.column1명 = table2명.column2명(+)
[ 예제 ] S_EMP TABLE 과 S_CUSTOMER TABLE 을 사용하여 영업사원의 LAST_NAME, SALES_REP_ID, NAME 을 검색하시오.
(단, 영업사원이 정해져 있지 않은 고객의 이름도 검색하시오.)
SELECT E.LAST_NAME, C.SALES_REP_ID, C.NAME
FROM S_EMP E, S_CUSTOMER C
WHERE E.ID(+) = C.SALES_REP_ID ;


- 계속(8) -


• Self Join
TABLE 의 ALIAS 를 사용하여, 마치 2 개의 TABLE 처럼 생각하여 자신의 TABLE 과 자신의 TABLE 을 JOIN 한다.
SELECT alias명.column명, alias명.column명...
FROM table명 alias1명, table명 alias2명 - WHERE alias1명.column1명 = alias2명.column2명 ;
[ 예제 ] S_EMP TABLE 에서 사원들의 LAST_NAME 과 그들의 상사 LAST_NAME 을 검색하시오.
SELECT W.LAST_NAME "Woker", M.LAST_NAME "Manager"
FROM S_EMP W, S_EMP M WHERE W.MANAGER_ID = M.ID ;

● 제 4 장. Group Functions
• Group Function
각각의 FUNCTION 은 ARGUMENT 를 받는데 기능은 다음과 같다.
■ DISTINCT : 중복된 값은 제외한다. ■ ALL : DEFAULT 로써 모든 값을 포함한다.
■ COLUMN명 : NULL 값은 제외한다. ■ * : NULL 값도 포함한다.
TABLE 전체를 하나의 GROUP 으로 보고 GROUP FUNCTION 값을 RETURN 한다.
SELECT group_function(column명), group_function(column명)... - FROM table명 ;
[ 예제 ] S_EMP TABLE 에서 회사 전체의 급여합계, 최고급여, 최소급여, 인원수를 검색하시오.
SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), COUNT(SALARY) FROM S_EMP ;
( COUNT(SALARY) 는 급여를 받는 사원의 총 인원수고 COUNT(*) 는 급여를 받지 않는 사원의 인원수도 포함된다.)

• 소group으로 분리
기본적인 SELECT 절(그룹화 되지 않은 SELECT절)에는 COLUMN 명과 GROUP FUNCTION 이 같이 기술될 수 없다.
SELECT 절에 COLUMN 명이 기술되려면 GROUP BY 절이 반드시 기술되어야 한다.
SELECT 절에 기술된 COLUMN 명들은 전부 GROUP BY 절에 기술되어야 하며
GROUP BY 절에 기술된 COLUMN 명들은 SELECT 절에 기술되지 않아도 된다.
(하지만 결과를 파악하기 위해서는 SELECT 절에 기술해주는 것이 좋다.)
GROUP BY 절을 기술하면 GROUP BY 절에 기술된 COLUMN 값으로 1 개의 TABLE이 소 GROUP 으로 나눠진다.
결과는 COLUMN 값으로 SORT 되어서 출력된다. 1개의 TABLE 을 소 GROUP 으로 나누어 GROUP FUNCTION 값을 구한다.
SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명] ;
[ 예제 ] S_EMP TABLE 에서 DEPT_ID, TITLE 별로, 최고급여, 최소급여, 인원수를 검색하시오.
SELECT DEPT_ID, TITLE, MAX(SALARY), MIN(SALARY), COUNT(SALARY)
FROM S_EMP GROUP BY DEPT_ID, TITLE;

• 특정 group의 선택
HAVING 절이 기술됐을 때 처리되는 순서는 다음과 같다.
① ROW 들이 GROUPing 된다. ② GROUP 에 대해 GROUP FUNCTION 이 적용된다.
③ HAVING 절을 만족하는 GROUP 을 선택한다.
GROUP BY 절과 HAVING 절의 순서는 바뀌어도 되지만 의미상 GROUP BY 절 다음에 HAVING 절을 기술하는 것이 좋다.
HAVING 절에서는 GROUP FUNCTION 을 사용하여 GROUP 에 대한 조건식을 기술한다.
SELECT column1명[, column2명], group_function(column명) - FROM table명 - GROUP BY column1명[, column2명]
HAVING 그룹조건식 ;
[ 예제 ] S_EMP TABLE에서 TITLE별로 급여합계를 검색하시오. (단, 급여합계가 5000이상인 GROUP만 출력하시오)
SELECT TITLE, SUM(SALARY) PAYROLL FROM S_EMP
GROUP BY TITLE HAVING SUM(SALARY) >= 5000 ;


- 계속(9) -

• Group의 정렬
기본적으로 GROUP BY 절에 기술된 COLUMN 값으로 SORT 된다.
이 순서를 바꾸고자 하면 ORDER BY 절을 기술하면 된다. DATA 의 SORT 순서를 정한다.
SELECT column1명[, column2명], group_function(column명) - FROM table명
GROUP BY column1명[, column2명] - ORDER BY column명| group_function(column명) ;
[ 예제 ] S_EMP TABLE에서 DEPT_ID 별로 인원수를 검색하시오. (단, 인원수가 많은 부서부터 출력하시오.)
SELECT DEPT_ID, COUNT(*) FROM S_EMP GROUP BY DEPT_ID ORDER BY COUNT(*) DESC ;

● 제 5 장. Subquery
• Single Row Subquery
SUBQUERY의 결과가 1개의 ROW로 나오는 것을 SINGLE ROW SUBQUERY라 하며 다음과 같은 OPERATOR를 사용할 수 있다.
=, >, >=, <, <= VALUE 값을 구하기 위해 SELECT 문장을 사용한다.
SELECT column명, column명... - FROM table명
WHERE column명 operator (SELECT column명 FROM table명 WHERE 조건식 );
[ 예제 ] S_EMP TABLE 에서 LAST_NAME 이 Smith 인 사원과 같은 업무(TITLE)를 하고 있는 사원의 LAST_NAME, TITLE 을 검색하시오.
SELECT LAST_NAME, TITLE FROM S_EMP
WHERE TITLE = ( SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Smith') ;

• From절의 Subquery
FROM 절에 기술된 SUBQUERY 문은 VIEW 처럼 사용된다.
SELECT alias명.column명, alias명,column명... - FROM table1명 alias1명, (SELECT column2명
FROM table2명 - WHERE 조건식) alias2명 - WHERE alias1명.column1명 OPERATOR alias2명.column2명 ;
[ 예제 ] S_EMP TABLE에서 SALARY가 회사평균급여 보다 적은 사원의 LAST_NAME, SALARY, 회사평균급여를 검색하시오.
SELECT E.LAST_NAME, E.SALARY, S.AVGSAL
FROM S_EMP E, (SELECT AVG(SALARY) AVGSAL FROM S_EMP) S WHERE E.SALARY < S.AVGSAL ;

• Multi Row Subquery
SUBQUERY 의 결과가 여러 ROW 일 때는 반드시 IN OPERATOR 를 사용하여야 한다.
SELECT column명, column명... - FROM table명
WHERE column명 IN ( SELECT column명 FROM table명 WHERE 조건식);
[ 예제 ] S_EMP TABLE과 S_DEPT TABLE에서 Operations부서에서 근무하는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.
SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP
WHERE DEPT_ID IN (SELECT ID FROM S_DEPT WHERE NAME = 'Operations') ;

• Multi Column Subquery
SELECT 문장의 WHERE 절에서 여러개의 COLUMN 값을 비교하려면 LOGICAL OPERATOR 를 사용하여 여러개의 조건식
을 기술하여야 한다. 그런데 MULTI COLUMN SUBQUERY 를 사용하면 이를 해결할 수 있다.
SELECT column명, column명,,, - FROM table명
WHERE (column명, column명...) IN (SELECT column명, column명... FROM table명 WHERE 조건식);
[ 예제 ] S_EMP TABLE에서 LAST_NAME Patel인 사원과 같은 부서, 같은 업무를 맡고 있는 사원의 LAST_NAME, TITLE, DEPT_ID 를 검색하시오.
SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP
WHERE (DEPT_ID, TITLE) IN(SELECT DEPT_ID, TITLEFROM S_EMPWHERE LAST_NAME = 'Patel') ;
SELECT LAST_NAME, TITLE, DEPT_ID FROM S_EMP
WHERE (DEPT_ID) IN (SELECT DEPT_ID FROM S_EMP WHERE LAST_NAME = 'Patel')
OR (TITLE) IN (SELECT TITLE FROM S_EMP WHERE LAST_NAME = 'Patel') ;

- 계속(10) -


● 제 6 장. Table 생성
• 이름 붙이는 법
이름은 다음의 규칙을 따라서 지정한다.
■ TABLE 명이나 COLUMN 명은 문자로 시작하고 30 자 이내로 지정한다. ■ A~Z, a~z, 0~9, _, $, # 을 사용할 수 있다.
■ 한 USER 내에서는 다른 OBJECT 의 이름과 동일하게 지정할 수 없다.
■ ORACLE7 SERVER 예약어를 사용할 수 없다. ■ 대소문자를 구별하지 않는다.

• Oracle 7 datatype
COLUMN 의 DATATYPE 은 다음과 같다.
■ CHAR(size) : 고정된 size 의 문자 값, 최대 255 자까지 지정할 수 있다.
■ VARCHAR2(size) : size내에서의 가변길이 문자 값,최대 2000자까지 지정할 수 있다.
■ LONG : 가변길이 문자 값, 최대 2 기가 바이트까지 사용할 수 있다. TABLE 당 한 개의 COLUMN 에만 지정 가능하다.
■ NUMBER(p,s) : 정수, 소수 자리수의 합이 P, 소수 자리수가 s 인 숫자값, 최대 38 자리수까지 지정할 수 있다.
■ DATE : 날짜와 시간 값, B.C. 4712년 1월 1일부터 A.D. 4712년 12월 31일까지 입력할 수 있다.
■ RAW(size) : size 내에서의 가변길이 BINARY DATA ■ LONGRAW : 가변길이 BINARY DATA

• 다른 table로부터 table생성
기존하는 TABLE 로 부터 데이타와 구조를 복사하여 TABLE 을 생성한다.
CREATE TABLE table명 [(column명, column명...)] - AS subquery ;
[ 예제 ] S_EMP TABLE 에서 DEPT_ID 가 41 인 사원들의 ID, LAST_NAME, USERID, START_DATE 만을 복사하여 EMP_41 TABLE 을 생성하시오.
CREATE TABLE EMP_41 AS SELECT ID, LAST_NAME, USERID, START_DATE
FROM S_EMP WHERE DEPT_ID = 41;
(S_EMP TABLE 에서 COLUMN명, TYPE, SIZE, NOT NULL CONSTRAINT 가 복사되어 EMP_41 TABLE 이 생성되며,
데이타는 DEPT_ID = 41 인 ROW 만 복사된다.)

• Constraint
CONSTRAINT 의 종류는 다음과 같다.
■ NOT NULL : COLUMN에 NULL값이 입력되는 것을 허용하지 않는다. COLUMN-CONSTRAINT 로만 기술해야 한다.
■ UNIQUE : 한 개의 COLUMN혹은 복합 COLUMN을 UNIQUE KEY로 지정하며 UNIQUE KEY에는 중복된 값을 허용하지 않는다.
한개의 COLUMN 으로 구성된 UNIQUE KEY 는 NULL 값을 허용한다.
COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.
복합 COLUMN 으로 구성된 UNIQUE KEY 는 TABLE-CONSTRAINT 로만 기술해야 한다.
UNIQUE KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.
■ PRIMARY KEY
ROW 를 UNIQUE 하게 대표할 수 있는 한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.
PRIMARY KEY 에는 중복된 값과 NULL 값을 허용하지 않는다.
TABLE 당 한 개의 PRIMARY KEY 만 지정할 수 있다. COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.
복합 COLUMN 으로 구성된 PRIMARY KEY 는 TABLE-CONSTRAINT 로만 기술해야 한다.
PRIMARY KEY COLUMN 의 UNIQUE INDEX FILE 이 자동 생성된다.
■ FOREIGN KEY
한개의 COLUMN 혹은 복합 COLUMN 으로 지정한다.
같은 TABLE 혹은 다른 TABLE의 PRIMARY KEY 나 UNIQUE KEY 값을 참조한다.
FOREIGN KEY 값은 모 TABLE 에 존재하는 데이타와 같던가 NULL 값을 허용한다.
COLUMN 이나 TABLE-CONSTRAINT 로 기술할 수 있다.

- 계속(11) -


※ CHECK : 각각의 ROW 가 만족해야할 조건을 지정한다.
조건식은 QUERY 조건식과 동일하게 지정한다. (단, 다음과 같은 것은 사용할 수 없다.)
CURRVAL, NEXTVAL, LEVEL, ROWNUM, SYSDATE, USER COLUMN이나 TABLE-CONSTRAINT로 기술할 수 있다.
CONSTRAINT 명은 다음과 같이 지정한다.
? CONSTRAINT 는 DICTIONARY 에 저장되므로 참조하기 쉽게 의미있게 붙여준다.
? 일반적으로 TABLE명_COLUMN명_CONSTRAINT종류와 같은 형태로 지정한다.
? 사용자가 CONSTRAINT 명을 지정하지 않으면 ORACLE7이 SYS_Cn의 형태로 붙인다.
? 동일한 USER 내에서 CONSTRAINT명은 UNIQUE해야 한다.
CONSTRAINT 는 다음과 같이 기술할 수 있다.
COLUMN-CONSTRAINT : column명 [CONSTRAINT constraint명] constraint종류
TABLE-CONSTRAINT : [CONSTRAINT constraint명] constraint종류 (column명, column명..)

• Table 생성
CREATE TABLE table명 - (column명 type(size) [DEFAULT VALUE] [column constraint],
column명 type(size) [DEFAULT VALUE] [column constraint], - .... , - [table constraint], - [table constraint], ....) ;
[ 예제 ] S_EMP TABLE CHART를 보고 TABLE 을 생성하시오.
(단, TABLE CONSTRAINT 로 기술할 수 있는 것은 TABLE CONSTRAINT 로 정의하시오.)
CREATE TABLE S_EMP(ID NUMBER(7), LAST_NAME VARCHAR2(25) CONSTRAINT S_EMP_LAST_NAME_NN NOT NULL,
FIRST_NAME VARCHAR2(25), USERID VARCHAR2(8) CONSTRAINT S_EMP_USERID_NN NOT NULL,
START_DATE DATE DEFAULT SYSDATE, COMMENTS VARCHAR2(25), MANAGER_ID NUMBER(7),
TITLE VARCHAR2(25),
DEPT_ID NUMBER(7),
SALARY NUMBER(11,2),
COMMISSION_PCT NUMBER(4,2),
CONSTRAINT S_EMP_ID_PK PRIMARY KEY(ID),
CONSTRAINT S_EMP_USERID_UK UNIQUE,
CONSTRAINT S_EMP_DEPT_ID_FK FOREIGN KEY(DEPT_ID)
REFERENCES S_DEPT(ID),
CONSTRAINT S_EMP_COMMISSION_PCT CHECK
(COMMISSION_PCT IN (10, 12.5, 15, 17.5, 20))) ;

● 제 7 장. Data DICTIONARY
• DICTIONARY
? DATABASE 가 만들어 졌을때 DICTIONARY TABLE 도 만들어 진다.
? DATABASE 가 사용중일때 DICTIONARY TABLE 은 ORACLE7 SERVER 에 의해 UPDATE 된다.
? 사용자들은 DICTIONARY TABLE 을 SELECT 할 수 있다. ? DICTIONARY TABLE 은 SYS USER 의 소유다.
? DICTIONARY TABLE의 값은 대문자로 들어있다. ? DICTIONARY TABLE 의 종류는 다음과 같은 방법으로 알 수 있다.
SELECT   *
FROM    DICTIONARY ;
DICTIONARY TABLE 의 종류는 다음과 같다.
? USER : USER 가 소유하고 있는 OBJECT 의 정보를 보여준다.
? ALL : USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.
? DBA : DBA USER 가 ACCESS 할 수 있는 OBJECT 의 정보를 보여준다.


- 계속(12) -


• 활용예
DICTIONARY TABLE 의 검색예는 다음과 같다.
■ 자신이 갖고 있는 TABLE 의 이름을 검색한다.
SELECT   OBJECT_NAME - FROM    USER_OBJECTS - WHERE   OBJECT_TYPE = 'TABLE';
■ 자신이 갖고 있는 OBJECT 의 종류를 검색한다.
SELECT   DISTINCT OBJECT_TYPE - FROM   USER_OBJECTS;
■ GRANT 와 관련된 DICTIONARY TABLE 의 이름을 검색한다.
SELECT   TABLE_NAME - FROM   DICTIONARY - WHERE   UPPER(COMMENTS) LIKE '%GRANT%';
■ S_EMP TABLE 의 CONSTRAINT 종류를 검색한다.
SELECT   CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION, R_CONSTRAINT_NAME
FROM   USER_CONSTRAINTS - WHERE   TABLE_NAME = 'S_EMP';
■ S_EMP TABLE 의 COLUMN CONSTRAINT 를 검색한다.
SELECT CONSTRAINT_NAME, COLUMN_NAME - FROM USER_CONS_COLUMNS - WHERE   TABLE_NAME = 'S_EMP';

● 제 8 장. Data 조작
• 데이타 입력
TABLE 전체 COLUMN 에 값을 입력한다.
INSERT INTO table명 - VALUES (value, value...);
[ 예제 ] S_EMP TABLE에 다음과 같은 데이타를 입력하시오.
[ID : 26, LAST_NAME : Jung Mi, FIRST_NAME : Hong, USERID : Hjungmi,
START_DATE : 05-APR-97, COMMENTS : Teacher, MANAGER_ID : 10,
TITLE : Stock Clerk, DEPT_ID : 45, SALARY : 1200 COMMISSION_PCT : 10]
INSERT INTO S_EMP
VALUES (26, 'Jung Mi', 'Hong', 'Hjungmi', '05-APR-97', Teacher', 10, 'Stock Clerk', 45, 1200, 10) ;
(값을 지정하는 순서는 TABLE 의 COLUMN 순서에 맞춘다. 이 방법보다는 COLUMN명을 기술하여 입력하는 방법이 더 좋다.)

• 특정 column에 데이터입력
데이타를 입력하고자 하는 COLUMN을 선택하여 입력한다.
INSERT INTO table명(column명, column명....) - VALUES (value, value....);
[ 예제 ] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.
[ID : 27, LAST_NAME : Smith, FIRST_NAME : Donna, START_DATE : 05-APR-97]
INSERT INTO S_EMP(ID, LAST_NAME, FIRST_NAME, START_DATE)
VALUES (27, 'Smith', 'Donna', '05-APR-97') ;

• Null, 특수 value 입력
COLUMN 값에 NULL 값을 지정하는 방법은 3 가지가 있다. ? INSERT 문장의 COLUMN LIST 에서 생략한다.
? INSERT 문장의 VALUE 절에서 NULL 로 지정한다. ? INSERT 문장의 VALUE 절에서 '' 로 지정한다.
COLUMN 값에 특수한 값을 입력할 수 있다. (SYSDATE : 현재날짜와 시간, USER : 현재 USERID)
[ 예제 ] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.
[ID : 29, LAST_NAME : Donna, USERID : USER, SALARY : NULL, START_DATE : SYSDATE]
INSERT INTO S_EMP(ID, LAST_NAME, USERID, SALARY, START_DATE)
VALUES (29, 'Donna', USER, NULL, SYSDATE);



- 계속(13) -


• 특수형태의 날짜/시간입력
DATE 값을 입력할 때는 지정된 DATE 형태로 입력하여야 한다.
일반적으로 DD-MON-YY 형태를 사용하며, 이 형태로 데이타를 입력하면 세기는 현재의 세기로, 시간은 자정으로 입력된다.
다른 세기의 날짜나 시간을 입력하고 싶으면 TO_DATE FUNCTION 을 사용한다.
지정된 형태가 아닌 다른 형태의 날짜 값을 입력한다. ex>TO_DATE('날짜값','날짜형태')
[ 예제 ] S_EMP TABLE 에 다음과 같은 데이타를 입력하시오.
[ID : 30, LAST_NAME : Donna, USERID : SQL01, START_DATE : 199704051400]
INSERT INTO S_EMP(ID, LAST_NAME, USERID, START_DATE)
VALUES (30, 'Donna', 'SQL01', TO_DATE('199704051400','YYYYMMDDHH24MI'));

• 다른table로부터 데이타입력
INSERT 문장을 사용하여 기존하는 TABLE 의 데이타를 다른 TABLE 로 COPY 할 수 있다.
INSERT INTO table명[(column명, column명...)] - SUBQUERY;
[ 예제 ] S_EMP TABLE 의 ROW들을 HISTORY TABLE 로 COPY 하시오.
(단, 01-JAN-94 이전에 입사한 사원의 ID,LAST_NAME,SALARY,START_DATE 를 COPY 하시오)
INSERT INTO HISTORY(ID, LAST_NAME, SALARY, START_DATE)
SELECT ID, LAST_NAME, SALARY, START_DATE
FROM S_EMP WHERE START_DATE < '01-JAN-94' ;
(INSERT 절의 COLUMN 수와 SELECT 절의 COLUMN 수는 같아야 한다.)

• 데이타 수정
UPDATE 문장을 사용하여 이미 존재하는 COLUMN 값을 수정한다.
UPDATE table명 - SET column명 = value, [column명 = value] - [WHERE 조건식] ;
[ 예제 ] S_EMP TABLE 에서 ID 가 1 인 사원의 데이타를 다음과 같이 수정하시오. (DEPT_ID : 32, SALARY : 2550)
UPDATE S_EMP SET DEPT_ID = 32, SALARY = 2550 WHERE ID = 2 ;

• 데이타 삭제
DELETE 문장을 사용하여 데이타를 삭제한다.
DELETE FROM table명 - [WHERE 조건식] ;
[ 예제 ] S_EMP TABLE에서 ID 가 20 보다 큰 사원을 삭제하시오.
DELETE FROM S_EMP WHERE ID > 20 ;

• 저장
COMMIT 문장(COMMIT;)에 의해 변경된 모든 내용이 DATABASE에 저장되며 변경된 모든 데이타는 DATABASE에 저장된다.
그 전의 데이타는 완전히 지워지며 모든 사용자가 변경한 내용을 볼 수 있고 변경된 ROW 에 걸려있던 LOCK 이 해제된다.
그러므로 다른 사용자가 수정할 수 있으며 모든 SAVEPOINT 가 없어진다.
TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 저장한다.

• 취소
ROLLBACK 문장(ROLLBACK)은 모든 변경된 내용을 취소하며 수정하기 전의 데이타가 복구된다.
변경된 ROW 에 걸려있던 LOCK 이 해제되고 다른 사용자들이 그 ROW 에 대해서 변경을 할 수 있다.
TRANSACTION 을 종료하고 TRANSACTION 안의 모든 변경된 작업을 취소한다.



- 계속(14) -


• Savepoint지정~취소
TRANSACTION 안에서 ROLLBACK 할 수 있는 POINT 를 지정한다. 지정된 POINT 까지만 ROLLBACK 한다.
SAVEPOINT savepoint명 ; - ROLLBACK TO savepoint명 ;
[ 예제 ] S_EMP TABLE에서 TITLE이 Stock Clerk 인 사원의 SALARY 를 10% 인상하시오. SAVEPOINT 를 지정하시오.
S_REGION TABLE 에 다음과 같은 데이타를 입력하시오. ID : 8, NAME : Central
SAVEPOINT 까지 ROLLBACK 하시오. UPDATE 결과를 저장하시오.
UPDATE S_EMP SET SALARY = SALARY * 1.1 WHERE TITLE = 'Stock Clerk' ; SAVEPOINT S1;
INSERT INTO S_REGION(ID, NAME) VALUES (8, 'Central') ; ROLLBACK TO S1; COMMIT;

● 제 9 장. Table변경/삭제
• Column 추가
TABLE 에 새로운 COLUMN 을 추가한다.
ALTER TABLE table명 - ADD (column명 type(size) [DEFAULT value] [column_constraint], - ...........) ;
[ 예제 ] S_REGION TABLE 에 다음과 같은 COLUMN 을 추가하시오. (COMMENTS VARCHAR2(25))
ALTER TABLE S_REGION ADD (COMMENTS VARCHAR2(25))
(추가될 COLUMN 의 위치는 지정할 수 없다. 새로운 COLUMN 은 마지막 위치에 생성된다.)

• Column 변경
ALTER TABLE 문장의 MODIFY 절을 사용하여 다음과 같은 변경을 할 수 있다. COLUMN 의 크기를 확장할 수 있다.
데이타가 들어있지 않으면 COLUMN 의 크기를 줄일 수 있다. 데이타가 들어있지 않다면 COLUMN 의 타입을 수정할 수 있다.
COLUMN 에 NULL 값이 없다면 NOT NULL CONSTRAINT 를 지정할 수 있다. DEFAULT VALUE 를 변경할 수 있다.
이미 생성되어 있는 COLUMN 을 변경한다.
ALTER TABLE table명 - MODIFY (column명 type(size) [DEFAULT value] [NOT NULL], - .............) ;

• Constraint 추가
이미 생성되어 있는 TABLE 에 CONSTRAINT 를 추가한다.
ALTER TABLE table명 - ADD (table_constraint) ;
[ 예제 ] S_EMP TABLE 에 다음과 같은 CONSTRAINT 를 추가하시오.
[ MANAGER_ID COLUMN 이 S_EMP TABLE 의 ID COLUMN 을 REFERENCE 하는 FOREIGN KEY CONSTRAINT 를 추가하시오. ]
ALTER TABLE S_EMP
ADD (CONSTRAINT S_EMP_MANAGER_ID_FK FOREIGN KEY(MANAGER_ID) REFERENCES S_EMP(ID)) ;

• Constraint 삭제
이미 생성되어 있는 TABLE 의 CONSTRAINT 를 삭제한다.
ALTER TABLE table명 - DROP PRIMARY KEY | - UNIQUE(column명) | - CONSTRAINT constraint명 [CASCADE] ;
[ 예제 ] S_EMP TABLE의 다음과 같은 CONSTRAINT를 삭제하시오. (MANAGER_ID COLUMN의 FOREIGN KEY CONSTRAINT)
ALTER TABLE S_EMP DROP CONSTRAINT S_EMP_MANAGER_ID_FK ;

• 전체 데이타의 삭제
TRUNCATE 문장은 DDL 이다. ROLLBACK SEGMENT 를 만들지 않고 모든 데이타를 삭제한다.
데이타가 삭제된 FREE 영역은 환원된다. TABLE 로부터 모든 데이타를 삭제한다.
TRUNCATE TABLE table명 ;
[ 예제 ] S_ITEM TABLE 의 모든 데이타를 삭제하시오.
TRUNCATE TABLE S_ITEM ;

- 계속(15) -


• Constraint disable/enable
TABLE 에 있는 모든 데이타가 CONSTRAINT 를 만족시켜야 ENABLE 할 수 있다.
PRIMARY KEY, UNIQUE CONSTRAINT 를 ENABLE 하면 그에 따른 INDEX FILE 이 자동적으로 생성된다.
CASCADE OPTION 은 FOREIGN KEY CONSTRAINT 를 DISABLE 할 때 사용한다.
CONSTRAINT 를 삭제하고 새로 만들지 않고 DISABLE, ENABLE 한다.
ALTER TABLE table명-DISABLE |ENABLE PRIMARY KEY |-UNIQUE(column명) |CONSTRAINT constraint명 [CASCADE] ;
[ 예제 ] S_DEPT TABLE 의 PRIMARY KEY CONSTRAINT 를 DISABLE 시키시오.
ALTER TABLE S_DEPT DISABLE CONSTRAINT S_DEPT_ID_PK CASCADE;
(S_EMP TABLE 의 S_EMP_DEPT_ID_FK CONSTRAINT 도 자동적으로 DISABLE 된다.)

• Table 삭제
TABLE 을 삭제하면 그 TABLE 에 딸린 INDEX FILE 도 삭제된다.
VIEW, SYNONYM, STORED PROCEDURE, FUNCTION, TRIGGER 등은 삭제되지 않는다.
CASCADE CONSTRAINTS 는 모 TABLE 을 삭제하고 자 TABLE 의 FOREIGN KEY CONSTRAINT 도 삭제한다.
DROP TABLE table명 [CASCADE CONSTRAINTS] ;
[ 예제 ] S_DEPT TABLE 을 삭제하시오.
DROP TABLE S_DEPT CASCADE CONSTRAINTS ;

• 이름의 변경
TABLE, VIEW, SEQUENCE, SYNONYM 의 이름을 변경한다.
RENAME old명 TO new명 ;
[ 예제 ] S_ORD TABLE 의 이름을 S_ORDER 로 변경하시오.
RENAME S_ORD TO S_ORDER ;

● 제 10 장. Sequence
• Sequence 생성
SEQUENCE 는 여러 사용자에게 UNIQUE 한 값을 생성해 주는 OBJECT 이다.
SEQUENCE 를 사용하여 PRIMARY KEY 값을 자동적으로 생성한다.
CREATE SEQUENCE sequence명 - INCREMENT BY n - START WITH n - MAXVALUE n | NOMAXVALUE
MINVALUE n | NOMINVALUE - CYCLE | NOCYCLE - CACHE n | NOCACHE ;
[ 예제 ] S_DEPT TABLE 의 ID COLUMN 값에 사용할 SEQUENCE 를 다음과 같이 생성하시오.
(START : 51, INCREMENT : 1, MAXVALUE : 9999999, NOCYCLE, NOCACHE)
CREATE SEQUENCE S_DEPT_ID INCREMENY BY 1 START WITH 51
MAXVALUE 9999999 NOCACHE NOCYCLE ;

• Sequence 변경
SEQUENCE 에 정의된 값을 변경한다.
ALTER SEQUENCE sequence명 - INCREMENT BY n - MAXVALUE n | NOMAXVALUE - MINVALUE n | NOMINVALUE
CYCLE | NOCYCLE - CACHE n | NOCACHE ; -
[ 예제 ] S_DEPT_ID SEQUENCE 를 다음과 같이 수정하시오. (CACHE : 10)
ALTER SEQUENCE S_DEPT_ID
CACHE 10 ;



- 계속(16) -


• Sequence 삭제
SEQUENCE 를 삭제한다.
DROP SEQUENCE sequence명 ;
[ 예제 ] S_DEPT_ID SEQUENCE 를 삭제하시오.
DROP SEQUENCE S_DEPT_ID ;

● 제 11 장. VIEW
• Simple view
SUBQUERY 문장이 간단한 경우 VIEW 를 통해 SELECT,INSERT,UPDATE,DELETE 를 할 수 있다.
■ SELECT : SUBQUERY 의 조건식을 만족하는 데이타만 검색된다.
■ INSERT : NOT NULL COLUMN 을 다 포함하고 있는 경우 INSERT 를 할 수 있다.
SUBQUERY 의 조건식을 만족하지 않는 데이타도 입력이 가능하다.
■ UPDATE : VIEW 를 통해 SELECT 할 수 있는 데이타만 수정할 수 있다.
SUBQUERY 의 조건식을 만족하지 않는 데이타도 수정이 가능하다.
■ DELETE : VIEW 를 통해 SELECT 할 수 있는 데이타만 삭제할 수 있다.
CREATE VIEW view명 [(alias명, alias명....)] - AS SUBQUERY ;
[ 예제 ] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.
CREATE VIEW EMP41 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE
FROM S_EMP WHERE DEPT_ID = 45 ;

• With check option
VIEW 를 정의할때 지정한 조건식을 만족하는 데이타만 INSERT, 또는 조건식을 만족하는 데이터로만 UPDATE 가 가능하다.
데이타가 VIEW 의 조건식을 만족하는지 CHECK 한다.
CREATE VIEW view명 [ (alias명, alias명...)] - AS SUBQUERY - WITH CHECK OPTION ;
[ 예제 ] S_EMP TABLE에서 DEPT_ID가 45인 사원의 ID, LAST_NAME, DEPT_ID, TITLE을 선택해서 VIEW를 생성하시오.
(단, DEPT_ID 가 45 가 아닌 사원은 입력되지 못하게 만드시오.)
CREATE VIEW EMP45 AS SELECT ID, LAST_NAME, DEPT_ID, TITLE
FROM S_EMP WHERE DEPT_ID = 45 WITH CHECK OPTION ;

• With read only
SELECT만 가능한 VIEW 를 생성한다.
CREATE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY - WITH READ ONLY ;
[ 예제 ] S_EMP TABLE 에서 ID, LAST_NAME, DEPT_ID, SALARY 가 SELECT 만 되도록 VIEW 를 생성하시오.
CREATE VIEW R_EMP AS SELECT ID, LAST_NAME, SALARY
FROM S_EMP WITH READ ONLY ;

• Force
기준 TABLE 이 존재하지 않아도 VIEW 를 생성한다.
CREATE FORCE VIEW view명 [(alias명, alias명...)] - AS SUBQUERY ;
[ 예제 ] S_EMP TABLE 이 없어도 S_EMP TABLE 에서 ID, LAST_NAME, SALARY 를 선택해서 VIEW 를 생성하시오.
CREATE FORCE VIEW T_EMP
AS SELECT ID, LAST_NAME, SALARY
FROM S_EMP ;


- 계속(17) -


• complex view
SUBQUERY문장에 JOIN, FUNCTION, DISTINCT/연산이 포함된 경우를 말하며 이 경우 VIEW를 통한 DML은 수행할 수 없다.
COMPLEX VIEW 를 생성한다. CREATE VIEW view명 (alias명, alias명...) - AS SUBQUERY ;
[ 예제 ] S_EMP TABLE과 S_DEPT TABLE에서 ID, LAST_NAME, DEPT_ID, NAME을 선택해서 VIEW를 생성하시오.
CREATE VIEW EMPDEPT AS SELECT E.ID, E.LAST_NAME, E.DEPT_ID, D.NAME
FROM S_EMP E, S_DEPT D WHERE E.DEPT_ID = D.ID ;

• View 삭제
VIEW 를 삭제하면 DATABASE 로부터 VIEW 의 정의가 삭제된다. VIEW 가 기초로 한 TABLE 은 삭제되지 않는다.
DROP VIEW view명 ;
[ 예제 ] EMPDEPT VIEW 를 삭제하시오.
DROP VIEW EMPDEPT ;

● 제 12 장. Index
• Index 생성
TABLE 생성시 PRIMARY KEY 나 UNIQUE CONSTRAINT 를 지정하면 UNIQUE INDEX 가 자동적으로 만들어 진다.
이 외의 COLUMN 으로 QUERY 를 할 때 속도를 향상시키기 위해서 INDEX 를 생성한다.
INDEX를 생성하면 QUERY 속도는 빨라질 수 있으나 DML속도는 늦어질 수 있다.
일반적으로 다음과 같은 경우에 INDEX 를 생성한다.
■ COLUMN 이 WHERE 절이나 JOIN 조건식에 빈번하게 사용될 때 ■ COLUMN 값이 넓게 분포되어 있을 때
■ COLUMN 값에 NULL 값이 많이 포함되어 있을 때 ■ TABLE 이 크고 QUERY 하는 데이터 양이 10 % 이하일 때
CREATE [UNIQUE] INDEX index명 - ON table명(column명[, column명...]) ;
[ 예제 ] S_EMP TABLE 에서 LAST_NAME 의 QUERY 속도를 향상하기 위하여 INDEX 를 생성하시오.
CREATE INDEX S_EMP_LAST_NAME_IDX ON S_EMP(LAST_NAME) ;

• Index 삭제
INDEX 는 수정할 수 없다. 수정하고 싶은 경우 삭제하고 다시 생성한다.
DROP INDEX index명 ;
[ 예제 ] S_EMP_LAST_NAME_IDX INDEX 를 삭제하시오.
DROP INDEX S_EMP_LAST_NAME_IDX ;

'프로그래밍 > DB' 카테고리의 다른 글

[펌] PL-SQL 정리  (0) 2007.11.27
select * from user_catalog;  (0) 2007.11.27
[펌] 인덱스 생성 [CREATE INDEX]  (0) 2007.11.27
Tablespace 정보보기  (0) 2007.11.27
Tablespace 삭제  (0) 2007.11.27

[펌] 인덱스 생성 [CREATE INDEX]

프로그래밍/DB 2007. 11. 27. 14:29 Posted by galad
출처 블로그 > on2uu의 블로그
원본 http://blog.naver.com/on2uu/80003972222

CREATE [ UNIQUE | BITMAP ] INDEX index_name ON table_name(column_name)

[TABLESPACE tablespace_name];


UNIQUE : UNIQUE Index를 생성한다.

BITMAP : BITMAP Index를 생성한다.

index_name : 생성하고자 하는 인덱스 이름

table_name : 인덱스를 생성하고자 하는 테이블 이름

column_name : 인덱스로 생성하고자 하는 컬럼 이름

tablespace_name : 인덱스가 위치할(생성될) 테이블 스페이스 이름


예) CREATE INDEX idx_emp ON tb_emp (empno);

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


범례)

대문자 : Reserved Word

소문자 : User Define

[ ] : Option, 지정하지 않아도 되거나 생략시 기본 설정값으로 대체됨.


적용)

ORACLE 7 이상

'프로그래밍 > DB' 카테고리의 다른 글

select * from user_catalog;  (0) 2007.11.27
[펌] SQL*Plus에서 꼭 알아두어야 할 활용 매뉴얼~!  (0) 2007.11.27
Tablespace 정보보기  (0) 2007.11.27
Tablespace 삭제  (0) 2007.11.27
Making a Tablespace Read Only  (0) 2007.11.27

Tablespace 정보보기

프로그래밍/DB 2007. 11. 27. 14:29 Posted by galad
Tablespace 정보보기
Tablespace과 관련된 데이타딕셔너리 뷰

USER_EXTENTS, DBA_EXTENTS, USER_SEGMENTS, DBA_SEGMENTS,
USER_FREE_SPACE, DBA_FREE_SPACE, DBA_USERS, DBA_TS_QUOTAS,
USER_TABLESPACES, DBA_TABLESPACES, DBA_DATA_FILES, V$DATAFILE

DBA_TABLESPACE
데이타베이스에 있는 모든 Tablespace 이름, 기본저장영역의 매개변수값에 대한 정보
 
 SQL> SELECT tablespace_name "TABLESPACE",
              initial_extent "INITIAL_EXT",
              next_extent "NEXT_EXT",
              min_extents "MIN_EXT",
              max_extents "MAX_EXT",
              pct_increase FROM sys.dba_tablespaces;

 TABLESPACE   INITIAL_EXT  NEXT_EXT   MIN_EXT   MAX_EXT PCT_INCREASE 
-----------   -----------  --------  --------- -------- ------------
 SYSTEM          10240     10240         1       121           50
 USER_DATA       10240     10240         1       121           50
 ROLLBACK_DATA   10240     10240         1       121           50
 TEMPORARY_DATA  10240     10240         1       121           50
 SP_TEST         51200     51200         2        50           50

DBA_DATA_FILES
Tablespace에 연관된 데이타파일의 이름, 크기 등의 정보
 
 SQL> SELECT file_name,bytes,tablespace_name FROM sys.dba_data_files;

 FILE_NAME                              BYTES       TABLESPACE_NAME
-----------------------------------  ------------  -----------------
 C:\ORAWIN95\DATABASE\USR1ORCL.ORA     2097152       USER_DATA
 C:\ORAWIN95\DATABASE\RBS1ORCL.ORA     5242880       ROLLBACK_DATA
 C:\ORAWIN95\DATABASE\TMP1ORCL.ORA     2097152       TEMPORARY_DATA
 C:\ORAWIN95\DATABASE\SYS1ORCL.ORA     11534336      SYSTEM
 D:\SP_TEST1.DBF                       5242880       SP_TEST

DBA_FREE_SPACE
데이타베이스에 있는 각Tablespace의 빈 확장영역크기에 대한 정보
 
 SQL> SELECT tablespace_name,file_id,count(*) "PIECES", MAX(blocks) "MAXIMUM",
       MIN(blocks) "MINMUM", AVG(blocks) "AVERAGE", SUM(blocks) "TOTAL"
       FROM sys.dba_free_space WHERE tablespace_name = *SP_TEST* 
       OR tablespace_name = *SYSTEM*
       GROUP BY tablespace_name,file_id;
 
 TABLESPACE_NAME  FILE_ID  PIECES  MAXIMUM  MINMUM  AVERAGE  TOTAL
---------------- -------- ------- -------- ------- -------- -------
   SP_TEST           5       1      2559      2559   2559     2559
   SYSTEM            1       8      348       20     93.5      748
SUM (각 Tablespace의 빈영역의 크기)
PIECES (Tablespace의 데이타 파일에 있는 단편화 크기)
MAXIMUM (가장 큰영역)

Tablespace 삭제

프로그래밍/DB 2007. 11. 27. 14:28 Posted by galad
Tablespace 삭제
Tablespace가 더이상 필요없는 경우 Tablespace와 내용을 삭제
Oracle7에서는 System Tablespace을 제외한 모든 Tablespace 삭제 가능
DROP TABLESPACE 권한 필요

Tablespace 삭제시 주의사항

1. Tablespace를 삭제하면 데이타 복구가 불가능하므로 삭제할 Tablespace에
있는 데이타가 나중에 필요 없는지 여부를 판단한 후 삭제
2. Tablespace 삭제 전과 후 데이타베이스 Full Backup 필요 ==> 나중에 문제 발생시 복구가 가능하도록 하기위해

Tablespace를 Oracle에서 삭제한 후 OS명령어(Del, rm)로 삭제된 Tablespace의 데이타파일을 삭제해야 함
사용중인 세그먼트가 들어 있는 Tablespace 삭제 불가(Tablespace의 테이블 현재 사용중인 경우,
Tablespace에 사용중인 Rollback Segment가 포함된 경우) ==> Tablespace를 Offline 상태로 변경 한 후에만 삭제 가능
Tablespace 삭제한 후 Tablespace 에대한 정보는 데이타딕셔너리에 남아 있으나 Tablespace 상태가 INVALID

예] sp_test Tablespace 삭제

 SQL>DROP TABLESPACE sp_test INCLUDE CONTENTS 
옵션] INCLUDE CONTENTS : Tablespace내에 데이타가 존재하는 경우
CASCADE CONSTRAINTS : Primary Key, Forein Key 등의 Constraint 조건을 연속으로 삭제하는 경우

'프로그래밍 > DB' 카테고리의 다른 글

[펌] 인덱스 생성 [CREATE INDEX]  (0) 2007.11.27
Tablespace 정보보기  (0) 2007.11.27
Making a Tablespace Read Only  (0) 2007.11.27
Altering Tablespace Availability  (0) 2007.11.27
Tablespace 관리에 대한 지침사항  (0) 2007.11.27

Making a Tablespace Read Only

프로그래밍/DB 2007. 11. 27. 14:28 Posted by galad
Making a Tablespace Read Only
필요 조건
읽기 전용 테이블스페이스를 쓸 수 있도록 만들기
WORM장치에서 일기 전용 테이블스페이스 생성

Tablespace내의 데이타파일에 쓰기 방지
· 방법 : ALTER TABLESPACE 명령 사용
· 권한 : ALTER TABLESPACE 권한
· 예] sp_test라는 Tablespace를 Read Only으로

     SQL>ALTER TABLESPACE sp_test READ ONLY;
· Read Only는 Tablespace Online, Offline 상태가 아님

필요조건
Tablespace이 Online 상태
· Offline 상태에서 Tablespace을 읽기 전용으로 변경시
· 에러 발생 ORA-01539: tablespace 'SP_TEST' is not online
전체 데이타베이스내에 실행중인 트랜잭션이 없어야 함
Tablespace에 사용중인 Rollback Segment가 없어야 함
Tablespace은 현재 Online Backup을 수행하지 않음
· (백업시 Tablespace내의 데이타파일의 Header File 변경)
7.1.0 이상

Read Only Tablespace에 속하는 데이타파일의 이름, 크기 변경 불가

Read Only 해제
Tablespace에 READ/WRITE 가 가능 하도록
방법 : ALTER TABLESPACE 명령 사용
권한 : ALTER TABLESPACE 권한
예] sp_test라는 Tablespace을 Read Only에서 해제
 SQL>ALTER ATBLESPACE sp_test READ WRITE;
필요조건
· Tablespace 내의 모든 데이타파일이 온라인 상태
· (V$datafile View에서 Datafile 상태 확인 후 ALTER DATABASE DATAFILE ONLINE으로)

WORM 장치에서 Read Only 테이블 생성
갱신이 필요없는 Read Only 파일이 있어면 WORM(Write Once Read Many)장치에서 Read Only Tablespace 생성
WORM장치에서 Read Only Tablespace을 생성하는 절차
    1. 다른장치에서 쓸수 있는 Tablespace 생성한 후 Tablespace에 속한 개체를 생성하여 데이타에 넣음
    2. ALTER TABLESPACE 명령의 READ ONLY 옵션으로 Read Only으로 Tablespace 변경
    3. Tablespace의 데이타파일을 WORM 장치에 복사한 후 Copy명령어로 파일을 복사
    4. Tablespace을 Offline으로
    5. WORM 장치에 복사한 데이타파일이름과 일치하도록 데이타파일 이름 변경
    ==> Control File 이름 변경
    6. Tablespace을 Online

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 정보보기  (0) 2007.11.27
Tablespace 삭제  (0) 2007.11.27
Altering Tablespace Availability  (0) 2007.11.27
Tablespace 관리에 대한 지침사항  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27

Altering Tablespace Availability

프로그래밍/DB 2007. 11. 27. 14:27 Posted by galad
Altering Tablespace Availability
Tablespace을 Online과 Offline 상태를 이용하여 사용자가 일시적으로 테이블 사용 가능 여부를 변경
Tablespace를 Online으로 설정
Tablespace를 Offline으로 설정

Tablespace을 Online으로 설정
데이타베이스가 Open된 상태에서 설정 가능
명령어 : ALTER TABLESPACE
권한 : ALTER TABLESPACE 권한
SYSTEM Tablespace은 항상 Online 상태
예] sp_test Tablespace를 Online으로
   SQL> ALTER TABLESPACE  sp_test ONLINE;

Tablespace을 Offline으로 설정
Offline 설정할 수 있는 경우
o. 데이타베이스의 일부분의 Tablespace를 사용할 수 없게하고, 나머지 Tablespace를 정상적인 접근이 가능하도록 할 경우
o. Offline Tablespace 백업할 경우
o. 응용프로그램 갱싱시 응용프로그램과 연관된 테이블 그룹을 일시적으로 Offline하는 경우
데이타베이스가 Open된 상태에서 설정 가능
명령어 : ALTER TABLESPACE
권한 : ALTER TABLESPACE 권한

Tablespace Offline의 3가지 선택사항

NORMAL :
· Offline 수행시 Tablespace 내의 모든 데이타파일에 대해 Check Point 수행
· Tablespace 내의 모든 데이타 파일이 Online 상태인 경우
· (Tablespace 내의 모든 데이타파일에 오류가 없는 경우에 사용)
· Online으로 복귀시 Media Recovery가 필요 없음
· Noarchivelog Mode에서 사용

TEMPORARY :
· Offline 수행시 Tablespace 내의 데이타파일중 Online 상태인 데이타파일에 대해 Check Point 수행
· Tablespace에 하나이상의 데이타파일에 오류가 있을 경우 사용
· Online으로 복귀시 정상적으로 Offline 설정인 안된 경우에만 Media Recovery가 필요

IMMEDIATE :
· Offline 수행시 데이타파일에 대해 check Point를 수행 않음
· Online으로 복귀시 반드시 Media Recovery 수행하여야 함
· Noarchivelog Mode인 경우 설정 불가

Tablespace을 Offline 설정시 Normal(default) 사용 하는 것이 좋음
(Tablespace를 다시 Online으로 변경시 Recovery 가 필요 없기 때문)

예] sp_testTablespace을 정상적으로 Offline

       SQL>ALTER TABLESPACE sp_test OFFLINE NORMAL
[참조] Online Tablespace를 Offline으로 변경시 현재 사용중인 Rollback segment가 포함되어 있는지 확인

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 삭제  (0) 2007.11.27
Making a Tablespace Read Only  (0) 2007.11.27
Tablespace 관리에 대한 지침사항  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27
Tablespace 생성  (0) 2007.11.27

Tablespace 관리에 대한 지침사항

프로그래밍/DB 2007. 11. 27. 14:27 Posted by galad
Tablespace 관리에 대한 지침사항
다중 테이블스페이스 사용
테이블스페이스 저장 영역 매개변수 지정
사용자에게 테이블 스페이스 할당량 지정

Multiple Tablespace 사용
데이타베이스 작업을 보다 융통성 있게 해줌
데이타베이스가 Multiple Tablespace를 사용하여 다음과 같은 작업 가능
· 데이타 딕셔너리 데이타로부터 사용자 데이타 분리
· 한 응용프로그램의 데이타를 다른 응용프로그램의 데이타로부터 분리
· I/O 경합을 줄이기 위해 서로 다른 Tablespace의 데이타 파일을 별도의 디스크 드라이브에 저장
· 사용자 데이타로부터 Rollback Segment 데이타를 분리하여 단일 디스크 고장에 의한 영구적인 데이타 손실 방지
· 개별 Tablespace은 Offline으로 다른 사항은 Online온라인으로 설정
· 고도의 갱신작업, 읽기 전용 작업, 임시 세그먼트 저장과 같은 특정 유형의 데이타베이스 사용을 위해 Tablespace 예약
· 개별 Tablespace 백업

Tablespace 저장 영역 매개변수 지정
새 Tablespace 생성시 Tablespace저장 영역, 여러가지 매개변수를 지정 가능
지정하지 않으면 기본 저장 영역 매개변수를 사용

사용자에게 Tablespace 할당량 지정
사용자에게 Tablespace에 대한 저장공간할당을 가능
CREATE USER, ALTER USER 명령에서 QUOTA 절

· CREATE USER절

        SQL> CREATE USER hcpark IDENTIFIED BY hcpark
                    DEFAULT TABLESPACE user_data
                    QUOTA 10M ON temp
                    QUOTA  5M ON user_data;

· ALTER USER절

       SQL> ALTER USER hcpark 
                  QUOTA 20M ON user_data;

'프로그래밍 > DB' 카테고리의 다른 글

Making a Tablespace Read Only  (0) 2007.11.27
Altering Tablespace Availability  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27
Tablespace 생성  (0) 2007.11.27
[펌] 오라클 TableSpace 및 사용자 생성  (0) 2007.11.27

Tablespace 할당 관리

프로그래밍/DB 2007. 11. 27. 14:26 Posted by galad
Tablespace 할당 관리
Tablespace의 저장 영역 설정 변경
빈영역 병합

Tablespace의 저장영역 설정 변경
데이타베이스 작업을 보다 융통성 있게 해줌
테이블 생성시 설정한 매개변수를 변경하지 않고 Tablespace에 앞으로 생성할 개체의 기본사양 변경 가능
명령 : ALTER TABLEAPCE 변경
권한 : ALTER TABLEAPCE 권한 필요
예] sp_test1의 기본 저장 영역을 변경
  변경전
     SQL> CREATE TABLESPACE sp_test
          DATAFILE '/oracle_data/sp_test1.dbf' SIZE 5M
          DEFAULT STORAGE(
                   INITIAL 50K
                   NEXT 50K
                   MINEXTENTS 2
                   MAXEXTENTS 50
                PCTINCREASE 0) OFFLINE;
  변경후
     SQL> ALTER TABLESPACE sp_test
          DEFAULT STORAGE(
                   INITIAL 50K
                   NEXT 50K
                   MINEXTENTS 2
                   MAXEXTENTS 50
                PCTINCREASE 50);

빈 영역의 병합
Tablespace Segment 영역은 Extent(Block의 모임)에 의해 관리
Tablespace Segment 영역에 새로운 Extent를 할당하는 경우 가장 크기가 유사한 영역을 사용하므로,
큰 빈 영역은 작은 영역으로 나누어지고, 작은 빈 영역은 큰영역으로 병합되어짐
SMON(시스템 모니터) 프로세스가 Tablespace의 작은 빈 Extent를 병합
영역의 단편화가 심한 경우(연속적인 영역이 디스크 상에서 비연속적으로 저장) 빈영역을 단일 영역 트랜잭션으로 병합가능
· 8번째 병합을 하면 영역 트랜잭션을 Commit되고, 다른 트랜잭션은 영역을 할당하거나 해체함
Tablespace 병합시 ALTER TABLESPACE 권한 필요
예] Tablespace 단위로 모든 사용가능한 빈 Extent 영역을 큰 Extent 영역으로 병합
 SQL> ALTER TABLESPACE sp_test COALESCE;

Tablespace 정보보기
Tablespace 병합가능한 Extent영역에 대한 정보는 DBA_FREE_SPACE_COALESCED 뷰를 사용

 SQL> SELECT * FROM DBA_FREE_SPACE_COALESCED;

 
 TABLESPACE_NAME  TOTAL_EXTENTS EXTENTS_COALESCED PERCENT_EXTENTS_COALESCED TOTAL_BYTES
 BYTES_COALESCED  TOTAL_BLOCKS  BLOCKS_COALESCED  PERCENT_BLOCKS_COALESCED   

 SYSTEM                  8                  8                  100              1521664
 1521664                743                743                 100
 
 USER_DATA               1                  1                  100              1859584
 1859584                908                908                 100
 
 ROLLBACK_DATA           1                  1                  100              3090432
 3090432               1509               1509                 100
 
 TEMPORARY_DATA          1                  1                  100              2095104
 2095104               1023               1023                 100
 
 SP_TEST                 1                  1                  100              5240832
 5240832               2559               2559                 100

Tablespace 생성

프로그래밍/DB 2007. 11. 27. 14:26 Posted by galad
Tablespace 생성
Tablespace 생성
Temporary Tablespace 생성

Tablespace 생성
ORACLE 저장영역관리 작업을 피하고자 할때 사용
운영체제마다 테이블 생성단계 다름
SYSTEM Tablespace : 데이타베이스의 첫번째 Tablespace로 데이타베이스 생성시 자동으로 생성
새로운 Tablespace을 생성하는 경우
· 데이타베이스 확장할때(관련된 데이타베이스에 더 많은 디스크 저장 영역을 할당)
· 저장된 다른 데이타와는 별도로 특정유형의 데이타를 새로운 논리적 저장구조에 저장할때
데이타베이스 전체 크기를 늘리는 방법
· 새로운 Tablespace를 생성하는 대신 기존 Tablespace에 데이타 파일을 추가

Instance는 Tablespace에 데이타를 넣을려면 최소한 두개의 Rollback Segment필요(System Rollback Segment를 포함)

새로운 Tablespace 생성에 필요한 권한과 명령
· 사용자가 CREATE TABLESPACE 권한
· CREATE TABLESPACE 명령

예] sp_test라는 Tablespace 생성
· Tablespace 크기는 5M, 1개의 데이타 파일 가짐, Tablespace 저장영역을 'c:\temp\sp_test1', 매개변수를 명시적 설정, Tablespace를 Offline

     SQL> CREATE TABLESPACE sp_test
          DATAFILE '/oracl_data/sp_test1.dbf' SIZE 5M
          DEFAULT STORAGE(
                  INITIAL 50K
                  NEXT 50K
                  MINEXTENTS 2
                  MAXEXTENTS 50
                  PCTINCREASE 0) OFFLINE;
· 여기서 데이타파일 경로를 지정하지 않는 경우에는 현재 디렉토리에 데이타 파일을 생성

Temporary Tablespace 생성
다중 SORT 작업의 수행 속도 개선이나 오버헤드를 감소, ORACLE 저장영역관리 작업을 피하고자 할때 사용
단지 Sort Segment를 사용할 수 있게하는 Tablespace
Temporary Tablespace에는 영구적인 자료저장 불가능
v$sort_segment
Temporary Tablespace의 Sort Segment의 저장영역할당, 해제에 대한정보
   SQL> desc v$sort_segment;

     Name                            Null?    Type
     ------------------------------- -------- ----

  	TABLESPACE_NAME                          VARCHAR2(31)
  	SEGMENT_FILE                             NUMBER
	SEGMENT_BLOCK                            NUMBER
  	EXTENT_SIZE                              NUMBER
  	CURRENT_USERS                            NUMBER
  	TOTAL_EXTENTS                            NUMBER
  	TOTAL_BLOCKS                             NUMBER
  	USED_EXTENTS                             NUMBER
  	USED_BLOCKS                              NUMBER
  	FREE_EXTENTS                             NUMBER
  	FREE_BLOCKS                              NUMBER
  	ADDED_EXTENTS                            NUMBER
  	EXTENT_HITS                              NUMBER
  	FREED_EXTENTS                            NUMBER
  	FREE_REQUESTS                            NUMBER
  	MAX_SIZE                                 NUMBER
  	MAX_BLOCKS                               NUMBER
  	MAX_USED_SIZE                            NUMBER
  	MAX_USED_BLOCKS                          NUMBER
  	MAX_SORT_SIZE                            NUMBER
  	MAX_SORT_BLOCKS                          NUMBER

Tablespace를 생성하는 동안 Tablespace를Temporary Tablespace으로 설정
       SQL> CREATE TABLESPACE sp_test TEMPORARY; 
기존의 Tablespace를Temporary Tablespace으로 설정
       SQL>ALTER TABLESPACE sp_test TEMPORARY; 
Temporary Tablespace를 Offline으로 설정 가능하고 Tablespace 상태를 Online/Offline으로 바꿔도 Tablespace의 Temporary상태는 변경 안됨

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 관리에 대한 지침사항  (0) 2007.11.27
Tablespace 할당 관리  (0) 2007.11.27
[펌] 오라클 TableSpace 및 사용자 생성  (0) 2007.11.27
[펌] 오라클 9i R2의 Table Compression  (0) 2007.11.27
오라클 sysdate...  (0) 2007.11.27

/*
id : sys
pw : change_on_install
NPXTS_LDARDATA2 / NPXTS_LDARINDEX2
*/

/* 테이블 스페이스 생성(datafile의 path는 적절히) */
/* data table space 생성 */
create tablespace NPXTS_LDARDATA2
datafile 'd:\database\NPXTS_LDARDATA2.dbf' size 300m
autoextend on next 100m maxsize unlimited
default storage (initial 1m
    next 5m
    minextents 1
    maxextents unlimited
    /* pctfree 10 */
    /* pctincrease 50 */);
   
/* index table space 생성 */
create tablespace NPXTS_LDARINDEX2
datafile 'd:\database\NPXTS_LDARINDEX2.dbf' size 300m
autoextend on next 100m maxsize unlimited
default storage (initial 1m
    next 5m
    minextents 1
    maxextents unlimited
    /* pctfree 10 */
    /* pctincrease 50 */);
   

/* 사용자 생성 */
create user ldar20042
identified by ldar20042
default tablespace NPXTS_LDARDATA2
temporary tablespace temp
quota unlimited on NPXTS_LDARDATA2
quota unlimited on NPXTS_LDARINDEX2;

/* 사용자에 권한부여 */
grant connect to ldar20042;

/* 모두 지우고 다시시작할 경우 SYS로 접속하여 다음을 실행 */
/*
drop user ldar21_sm cascade;
drop tablespace ldar21_data including contents;
drop tablespace ldar21_index including contents;
*/

/*
drop user ldar2004 cascade;
drop tablespace NPXTS_ldardata including contents;
drop tablespace NPXTS_ldarindex including contents;
*/

'프로그래밍 > DB' 카테고리의 다른 글

Tablespace 할당 관리  (0) 2007.11.27
Tablespace 생성  (0) 2007.11.27
[펌] 오라클 9i R2의 Table Compression  (0) 2007.11.27
오라클 sysdate...  (0) 2007.11.27
[펌] 오라클 EXPORT 및 IMPORT 유틸리티  (0) 2007.11.27

오라클 9i R2의 Table Compression

 

RDBMS를 사용한 이래로 점점 더 많은 정보가 데이타베이스에 쌓이고 있으며 Telecom 업무와 같은 다량의 데이타를 관리하는 경우 수 테라에서 수십 테라바이트에 이르는 방대한 데이타를 관리해야 하는 어려움에 직면해 있으며 데이타의 양에 비례하여 하드웨어의 비용도 증가하고 있는 것이 현실이다.

이에 대한 대안으로 오라클 9i R2에서 새로 선보인 TABLE Compression 방법에 대해 알아보고 이를 활용하여 얼마나 물리적인 저장공간을 줄일 수 있으며 대량의 데이타를 분석해야 하는 DW 환경에서 성능상 어느 부분에 영향을 미치고 온라인의 어느 경우에 사용가능한지 성능을 비교해 보고자 한다.

TABLE Compression방법은 DB2와 같은 타 DBMS에서는 이미 사용되고 있는 방법으로 오라클은 Oracle 9i Release2에서 기능이 추가되었다.

오라클의 Table Compression의 특징은 다음과 같다.

  • TABLE, TABLE Partition, Materialized View에서 사용할 수도 있으며 Tablespace 단위로 지정 가능하다.
  • Block 단위로 I/O를 수행하므로 물리적 I/O가 감소한다.
  • Lossless dictionary-based 알고리즘을 사용하여 block내 중복값을 제거하는 압축방법을 사용한다.
  • Compression 및 Decompression은 ROW 단위로 수행되며 Row level locking은 유효하다.
  • Data의 Compression Ratio는 온라인 30~80% DW의 경우 400%까지도 가능하며 데이타 분포도에 따라 다를 수 있다.

1. Compression의 원리

오라클에서 채택하고 있는 Compression방법은 Data Segment Compression 또는 heap-organized block-level compression라고도 하며 한 block내에서 복원되어야 하는 정보는 그 Block내에 모두 존재해야 한다.

아래의 그림은 주문 Table에 고객 정보가 같이 있는 경우를 가정하고 Block내의 압축 저장원리를 설명하였다.


압축된 Block과 압축되지 않은 Block의 비교

이는 column 길이와 중복값의 정도에 따라 모든 중복값은 Symbol Table의 해당값을 참조하고 있으며 압축의 결과로 column의 순서가 해당 block내에서 재정렬 될 수도 있다. 오라클의 Symbol Table Entry는 최적의 Compression 결과를 위해 Data Loading시에 시스템에 의해 결정되어 생성되므로 Symbol Table Entrty를 사용자의 임의로 변경할 필요가 없다. 오라클 알고리즘은 압축 factor와 별도로 분포도의 변경에 대하여 동적으로 변경사항에 대하여 적용된다.


2. Compression Ratio(압축율)

압축율은 데이타의 분포도에 따라 다르지만 DW환경에서는 2:1, 4:1 많은 경우 12:1 까지도 압축되기도 한다. 각 Block의 중복값을 제거하는 알고리즘을 사용하므로 데이타 로드시에 Cardinality가 낮은 값으로 정렬해서 data를 Loading하는 방법이 좋다. DW상황의 Materialized View는 대부분 Group by에 의해 정렬된 값을 생성하는 경우가 많으므로 높은 Compression Ratio을 유지할 수 있다. 또한 block size가 클수록 한 Block내에 중복값이 많이 포함될 수 있으므로 compress Ratio에 영향을주며 Storage Parameter 인 PCTFREE가 낮을수록 Block내에 많은 양의 데이타의를 저장할 수 있으므로Compression Ratio가 높아진다. UPDATE 작업이 거의 없는 Compressed Table에는 PCTFREE를 0로 하는 것이 좋으며 compress option을 사용하여 table creation시에는 default PCTFREE 0으로 지정된다.


3. Compression 대상

Compress 대상은 Table, Materialized View, Partition table의 개별 Partition별로 Compress option지정이 가능하다. Tablespace level에서 지정한 경우 tablespace내에 생성되는 모든 Table들은 default로 Compress option이 적용된다. Table의 Compress option은 변경도 가능하지만 이후에 입력되는 데이타만 Compression의 적용 대상이 된다.

bulk insert나 bulk load시의 Compresion이 일어나는 시기는

  • Direct Path SQL*Loader 사용시
  • Create Table as SELECT(CTAS) 문장 사용시
  • Parallel INSERT ( 또는 append hint를 통한 Serial INSERT) 문장 사용시에 발생한다.

ALTER TABLE TABLE_NAME MOVE COMPRESS;

명령을 통하여 기존에 존재하는 table에 compress option을 지정할 수 있으나 table 전체에 Exclusive Lock 상태로 작업을 진행하므로 이를 고려하여 다른 DML 작업에 영향이 미치지 않도록 해야한다. Compress 적용 Data type은 LOB와 LOB에서 파생된 CLOB등을 제외한 모든 Type에 적용 가능하다.

partition table과 non-partitioned table의 compression여부를 확인하는 dicitionary는 아래의 SQL을 통해 확인해 볼 수 있다.

1) partitioned table

SELECT TABLE_NAME, PARTITION_NAME, COMPRESSION
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME LIKE UPPER(:TAB_NAME)||"%";

2) non-partitioned table

SELECT E.OWNER, E.SEGMENT_NAME, E.SEGMENT_TYPE, S.SPARE1,
DECODE(S.SPARE1,1,"NORMAL",6145,"COMPRESSED",4097,"COMP->NOCOMP","OTHER") COMP_TYPE
FROM SYS.SEG$ S, DBA_EXTENTS E
WHERE E.SEGMENT_NAME LIKE UPPER(:seg_name)||"%"
AND E.SEGMENT_TYPE = "TABLE"
AND E.EXTENT_ID = 0
AND E.BLOCK_ID = S.BLOCK#
AND E.FILE_ID = S.FILE#;

4. Compression/non-Compress Table 성능비교

물리적인 compress ratio는 데이타의 분포도에 따라 다르다. 주로 DW의 데이타의 경우 Cardinality가 낮으나 OLTP성 Transaction 데이타의 경우 Cardinality가 높아 중복 값의 비중이 낮은 경우가 많다. Compression ratio가 높을수록 Data file size나 Redo log file Size가 줄어들게 되므로 Backup /Recovery등 유지보수 효과를 높여줄 뿐만아니라 , Database buffer cache의 Hit Ratio 향상에 도움을 주고 물리적인 DISK I/O를 줄여주는 효과가 있다.

아래의 테스트는 OLTP성 TABLE중 대리점 TABLE로 TEST한 결과이다. e-mail, fax, 주소, 전화번호등 정보등 주로 Cardinality가 높은 편이다.


<그림2> OLTP성 TABLE의 압축율과 SQL 성능비교


결과를 보면 생성시에는 압축시에 2배이상의 시간이 필요하며 압축율은 50%정도의 compression ratio를 보이고 있으며 50%의 Compress ratio에서는 SELECT시의 속도 TEST시 거의 차이가 나타나지 않음을 알 수 있다. Update시에는 40~70% 정도 더 낮은 성능이 나타나는데 이는 압축된 Table의 update시 더 복잡한 operation 과정이 필요하고 PCTFREE등의 Storage Parameter등의 영향으로 판단된다. Delete는 평균 30%정도의 성능향상을 보였는데 이는 data의 압축으로 logging data의 양도 줄어들게 되고 row의 길이가 줄어들게 되어 1 Block내에 더 많은 Row를 포함하는 등의 영향에 따른 것으로 판단된다.아래의 경우는 DW Star Schema하에서의 압축율을 보여주고 있다.


<그림3> DW Star Schema 모델상황의 Compression Ration 비교

위의 그림에서는 300%이상의 Compression Ratio를 보이고 있는데 이와 같이 중복 Value가 많아 Compression Ratio가 높고 DML작업이 적은 DW 환경에서 Compression Option을 사용하는 것이 좋으며, 이와는 반대로 update 빈도가 높은 OLTP 환경에서는 사용시 Performance에 문제를 발생시킬 수 있으므로 사전 Sampling을 통하여 최소 50%이상의 압축율을 보이는지 여부와 DML 사용정도등을 조사한 후 DML의 요구가 많지 않은 집계성 Table에 사용할 것을 권장한다.

오라클 sysdate...

프로그래밍/DB 2007. 11. 27. 14:18 Posted by galad

select to_char(t1,'yyyy-mm-dd hh24:mi:ss'), to_char(t2,'yyyy-mm-dd hh24:mi:ss') from test;

TO_CHAR(T1,'YYYY-MM TO_CHAR(T2,'YYYY-MM
------------------- -------------------
2004-11-19 10:52:35 2004-11-19 10:53:35


초단위까지 보고 싶을때...

출처 블로그 > 살아가는 이야기
원본 http://blog.naver.com/tinylass/120011094923

Export 및 Import 유틸리티 개요

  • Export 유틸리티는 다음에 대한 논리적 백업을 제공합니다.
    - 데이터베이스 객체
    - 스키마 객체
    - 테이블스페이스
    - 전체 데이터베이스
  • Import 유틸리티는 데이터베이스로 데이터를 옮기기 위해 유효한 엑스포트 파일을 읽는 데 사용됩니다. 엑스포트 파일에서 임포트된 객체에는 리두 로그 기록을 적용할 수 없으므로 데이터 손실이 발생할 수는 있지만 이를 최소화할 수 있습니다.

DBA는 Export 및 Import 유틸리티를 사용하여 다음과 같은 작업을 수행함으로써 일반적인 운영 체제 백업을 보완할 수 있습니다.

  • 데이터베이스 객체 또는 전체 데이터베이스의 기록(historical) 아카이브 생성. 변화하는 업무 요구 사항을 지원하기 위해 스키마를 수정하는 경우가 여기에 해당됩니다.
  • 이진 파일에 테이블 정의 저장. 주어진 스키마 구조의 기준선(baseline)을 생성 및 유지 관리할 때 유용합니다.
  • Oracle 버전 간의 데이터 이동. Oracle7에서 Oracle8로 업그레이드하는 경우를 예로 들 수 있습니다.
  • 다음과 같은 경우를 방지합니다.
    - 실수로 테이블을 삭제하거나 절단(truncate)하는 등의 사용자 오류
    - 테이블의 논리적 훼손
    - 데이터베이스의 일부분에만 영향을 주는 잘못된 일괄 처리 작업 또는 DML 문
  • 다음을 복구합니다.
    - 한 물리적 데이터베이스의 개별 테이블스페이스에 여러 논리적 데이터베이스가 존재하는 경우 논리적 데이터베이스 하나를 나머지 물리적 데이터베이스와는 다른 시점으로 복구합니다.
    - VLDB(Very Large Database)에 있는 테이블스페이스를 복구할 때 백업에서 전체 데이터베이스를 복원하여 롤포워드하는 것보다 TSPITR(tablespace point-in-time recovery)이 더 효과적인 경우 이를 복구합니다.

참고: 이 단원에서는 Export 및 Import 유틸리티에 대해 기술하고 이들이 백업 및 복구 작업에 미치는 영향에 대해 설명합니다. 이 유틸리티에 대한 자세한 설명을 보려면 Oracle8i Server Utilities 설명서를 참조하십시오.

 

#################################################

EXPORT 유틸리티 실행방법

 

. 대화식 다이얼로그

. Enterprise Manager 내의 Data Manager의 Export페이지

. 파라미터를 명시함으로써 명령라인 인터페이스

#################################################

 

익스포트 방법

  • 대화식 다이얼로그. 운영체제에서 EXP 명령을 명시하고 아무런 파라미터도 명시하지 않음으로 Export 유틸리티는 디폴트 값을 제공하면서 입력을 위한 프롬프트를 줄 것입니다.
  • Oracle Enterprise Manager 내의 Data Manager의 Export 페이지.
  • 명령 라인 모드를 선택 시 선택된 옵션들은 명백히 명령 라인에 명시되어야 합니다. 어떠한 빠진 옵션들은 Export 유틸리티 디폴트 값들이 될 것입니다.

: 많은 옵션들이 명령 라인 인터페이스를 사용하여야만 이용 가능합니다. 그러나 명령 라인과 함께 파라미터 파일을 사용할 수 있습니다.

엑스포트 방식

  • 대화식 대화상자: 운영 체제에서 매개변수를 사용하지 않고 EXP 명령을 지정하면 Export 유틸리티는 기본값을 제공하면서 입력 프롬프트를 표시합니다.
  • Oracle Enterprise Manager에 포함되어 있는 Data Manager의 엑스포트 페이지
  • 명령행 모드를 선택할 경우 선택한 옵션을 명령행에 명시적으로 지정해야 합니다. 옵션을 누락하면 Export 유틸리티의 기본값이 지정됩니다.

참고: 많은 옵션이 명령행 인터페이스에서만 사용 가능하지만 명령행과 함께 매개변수 파일을 사용할 수도 있습니다.


명령행 엑스포트

Export 유틸리티의 명령행 모드를 사용하여 데이터베이스 데이터를 운영 체제 파일로 복사할 수 있습니다. 이 파일은 Import 유틸리티에서만 읽을 수 있습니다.

예제

행을 포함하여 scott의 스키마에 속한 emp 및 dept 테이블을 포함하는 expincr1.dmp 엑스포트 파일을 생성합니다.

$ exp scott/tiger tables=(emp,dept) rows=y file=expincr1.dmp

행을 포함하여 scott의 스키마에 속한 모든 객체를 포함하도록 expdat.dmp라는 빠른 엑스포트 파일을 생성합니다.

$ exp system/manager owner=SCOTT DIRECT=Y

ts_emp 테이블스페이스에 속한 모든 객체의 정의를 포함하는 expdat.dmp 엑스포트 파일을 생성하고 ts_emp.log 로그 파일을 생성합니다.

$ exp system/manager TRANSPORT_TABLESPACE=y TABLESPACES=(ts_emp) LOG=ts_emp.log

마지막 누적 또는 완전 엑스포트 이후 데이터베이스에서 수정된 모든 정의 및 데이터를 포함하는 expcum1.dmp 엑스포트 파일을 생성합니다.

$ exp system/manager FULL=y INCTYPE=cumulative FILE=expcum1.dmp

참고: 명령행 모드 옵션은 대화식 모드 옵션과 유사합니다.

엑스포트 매개변수

매개변수

설명

USERID

엑스포트할 스키마 객체의 사용자 이름/암호

FILE

출력 파일 이름

ROWS

엑스포트 파일에 테이블 행을 포함시킬 것인지 여부: (Y)es/(N)o

FULL

전체 데이터베이스를 엑스포트할 것인지 여부: (Y)es/(N)o

OWNER

엑스포트할 사용자: 사용자 이름

TABLES

엑스포트할 테이블: 테이블 목록

INDEXES

인덱스를 엑스포트할 것인지 여부: (Y)es/(N)o

DIRECT

직접 모드 엑스포트 지정 여부: (Y)es/(N)o

INCTYPE

엑스포트 레벨 유형

PARFILE

매개변수가 지정된 파일 이름

HELP

대화식 모드에서 엑스포트 매개변수 표시(Y)

LOG

정보 및 오류 메시지용 파일 이름

CONSISTENT

엑스포트 중에 데이터가 갱신될 경우 데이터베이스의 읽기 일관성 뷰를 제공할 것인지 여부: (Y)es/(N)o

BUFFER

데이터 버퍼 크기(바이트): (정수)

TRANSPORT_TABLESPACE

이동 가능한 테이블스페이스 메타 데이터의 엑스포트 설정(릴리스 8.1 전용)

TABLESPACES

이동할 테이블스페이스(릴리스 8.1 전용)

POINT_IN_TIME_RECOVER

Export 유틸리티가 Oracle 데이터베이스에 있는 하나 이상의 테이블스페이스를 엑스포트할지 여부 표시(릴리스 8.0 전용)

RECOVERY_TABLESPACES

포인트 인 타임 복구를 사용하여 복구할 테이블스페이스 지정(릴리스 8.0 전용)
Oracle Server Readme, Release 8.0.4 참조

COMPRESS

하나의 확장 영역에 모든 데이터를 포함시킬지 여부 지정: (Y)es/(N)o

참고: 위에 나열한 매개변수는 모든 Export 유틸리티 매개변수의 전체 목록이 아니며 DBA가 복원을 위해 자주 사용하는 매개변수입니다

완전한 익스포트 (Complete Export)
누적적(cumulative)이고 증분적인(incremental) 익스포트를 사용한다면 기본 백업을 생성하기 위해 정기적으로 완전한 익스포트를 수행해야 합니다. 완전한 익스포트 후에 자주 증분적인 익스포트를 수행하고 가끔 누적적인 익스포트를 수행하십시오. 주어진 시간 후에 다른 하나의 완전한 익스포트에 대해 이 사이클을 다시 반복해야 합니다.
위 예에서 보여지는 바와 같이 완전한 데이터베이스 익스포트는 모든 테이블과 데이터 정의를 백업해 줍니다.

제한사항
완전(Full) 데이터베이스 모드 (FULL=Y)로만 완전한, 증분적인 또는 누적적인 익스포트를 수행할 수 있습니다.

증분적인 익스포트 (Incremental Export)
증분적인 익스포트는 임의의 종류의 최근 익스포트 이후 변경된 객체들을 포함합니다. 증분적인 익스포트는 변경된 행 뿐만 아니라 테이블 정의 정보와 모든 테이블 데이터를 익스포트합니다. 전형적으로 여러분은 누적적 또는 완전한 익스포트 보다는 증분적 익스포트를 더욱 자주 수행합니다.

어떤 테이블에 대한 임의의 갱신은 (UPDATE, INSERT, 또는 DELETE) 자동적으로 증분적 익스포트 대상 테이블이 됩니다.


위 예에서 테이블 1, 3, 6은 완전한 익스포트인 Time 1에서 취한 최근 익스포트 이후로 변경이 발생하였습니다.

주: 증분적 익스포트는 몇몇 대형 테이블을 자주 액세스하는 응용 프로그램인 경우 매우 좋은 전략이 될 수 없습니다. 작은 테이블에 걸쳐 변경이 다소간 흩어져 있는 departmentalized 애플리케이션에 적합합니다.

누적적 익스포트 (Cumulative Export)
누적적 익스포트는 가장 최근의 누적적 또는 완전한 익스포트 이후로 변경된 테이블들을 백업합니다.


위 예에서 테이블 1, 2 및 6은 Time 1 이후로 변경되었으며 테이블 4는 Time 2 이후로 변경되었습니다. 따라서 누적적 익스포트는 가장 최근 완전 익스포트 이후로 변경된 모든 테이블들을 백업합니다.

incremental 또는 cumulative export를 수행할 때에는 full=y 파라미터와 함께 inctype 파라미터를 사용합니다.

incremental export 일 경우는,

exp sys/change_on_install file=filename full=y inctype=incremental

cumulative export 일 경우는,

exp sys/change_on_install file=filename full=y inctype=cumulative

와 같이 실행합니다.

증분적 및 누적적 익스포트의 이점
증분적 및 누적적 익스포트는 많은 사용자들이 그들 자신의 테이블들을 생성하는 환경에서 일하는 DBA가 직면하고 있는 문제점들을 해결하는 것을 도와 줍니다. 이런 유형의 익스포트의 이점은 다음과 같은 것을 포함합니다:

  • 사용자가 우연히 삭제시킨 테이블을 DBA가 복원 가능
  • 더 적은 데이터가 익스포트 되기 때문에 더 작은 익스포트 파일 필요
  • 가장 최근의 증분적 또는 누적적 익스포트 이후로 변경된 객체들만 백업되기 때문에 더 적은 시간 소요

Direct Path 익스포트 개념
Direct-Path 기능을 사용함으로써 데이터를 훨씬 더 빨리 추출할 수 있습니다. 파라미터 DIRECT=Y가 명시될 때 Export 유틸리티는 SQL-명령 처리 계층을 통하는 대신 데이터 계층에서 직접적으로 읽습니다.

Direct-Path 익스포트의 구조

  • 익스포트의 direct 모드는 파라미터 DIRECT=Y를 명시함으로써 설정될 수 있습니다.
  • Direct-Path 익스포트는 인스턴스의 다른 자원들과 경쟁하지 않습니다.
  • Direct read 모드의 경우 세션에 의해 사용되는 사적인 영역(private area)으로 데이터 베이스 블록을 읽어 들입니다.
  • 행들은 전송을 위해 Two-Task Command(TTC) 버퍼로 직접 이동됩니다.
  • TTC 버퍼 내의 데이터는 Export 유틸리티가 기대하는 형식으로 되어 있습니다.

Direct-Path 익스포트의 명시
Direct-Path 익스포트 사용 전에 catexp.sql 스크립트를 실행해야 합니다.

DIRECT 파라미터 사용 방법
명령 라인 옵션
DIRECT 명령 라인 파라미터를 사용함으로써 Direct-Path 익스포트를 활성화할 수 있습니다.
  $ exp user=scott/tiger full=y direct=y

파라미터 파일
exp_par.txt란 파라미터 파일의 예:
  USERID=scott/tiger
  TABLES= (emp,dept)
  FILE=exp_one.dmp
  DIRECT=Y

운영체제 프롬프트에서 파라미터를 실행하기 위해:
  $ exp parfile=exp_param.txt

Direct-Path 익스포트
Export 유틸리티의 Direct-Path 옵션은 conventional-path 익스포트와는 구별되는 어떤 기능을 도입합니다.

Direct-Path 기능

  • 익스포트 유형은 화면 출력, 익스포트 덤프 파일 및 LOG 파라미터로 명시한 로그 파일에 표시됩니다.
  • 데이터는 이미 익스포트가 기대하는 형식으로 되어 있으며 이로써 불필요한 데이터 전환을 피해 줍니다. 데이터는 Export 클라이언트에게 이동되는데 이 클라이언트가  익스포트 파일에 데이터를 씁니다.
  • Direct-Path 익스포트는 최적화된 “SELECT * FROM table”을 어떤 형용사구 없이 사용합니다.

주: 열 데이터의 형식이나 익스포트 덤프 파일의 명세는 conventional-path 익스포트와는  다릅니다.

Direct-Path 제한 사항
Export 유틸리티의 direct-Path 옵션은 conventional-path 익스포트와 구별해 주는 어떤 제한 사항들을 갖고 있습니다.

  • Direct-Path 익스포트 기능은 대화식 EXP 세션을 사용하여 활성화될 수 없습니다.

  • Direct-Path 옵션이 사용될 때 클라이언트측의 문자 집합은 서버측의 문자 집합과  일치해야 합니다.

  • Export 유틸리티의 BUFFER 파라미터는 Direct-Path 익스포트에 아무런 영향을  미치지 않는데 이 파라미터는 conventional-path 옵션에 의해서만 사용됩니다.

  • VARRAY 열 및 중첩된 테이블을 포함하여 LOB, BFILE, REF 또는 객체형 열을  갖고 있는 행을 direct-Path로 임포트 할 수 없습니다. 데이터가 아니라 테이블을  생성하기 위한 데이터 정의 정보만 익스포트 됩니다.

Export 유틸리티의 호환성
DBA로서 Export 유틸리티와 관련된 호환성 문제를 알 필요가 있습니다.

문제점

  • 오라클7 익스포트 파일을 생성하기 위해 오라클8 데이터베이스에 대해 오라클7 Export 유틸리티를 사용할 수 있습니다.

  • 오라클6 (또는 이전) Export는 오라클8 데이터베이스에 대해 사용될 수 없습니다.

  • 낮은 버젼의 Export 유틸리티가 더 높은 버젼의 오라클 서버와 실행될 때 낮은 버젼에서 존재하지 않았던 데이터베이스 객체들의 범주는 익스포트로부터  제외됩니다.

  • 테이블이 Direct-Path 옵션을 사용하여 생성되었다면 이 파일은 다른 포맷으로  되어있으며 오라클7.3 이전 Import 유틸리티에 의해 읽혀질 수 없습니다.

  • 더 낮은 버젼의 오라클 서버 Import를 사용하여 더 높은 버젼의 Export 이용을 시도할 때 자주 에러를 산출합니다.

Import 유틸리티
Import 유틸리티는 유효한 Export 유틸리티 파일을 사용하여 데이터 복구 시 사용될 수 있습니다.

복구 위해 Import 유틸리티의 사용

  • 테이블 정의 정보는 익스포트 파일에 저장되기 때문에 테이블 정의 정보 생성. 행없이 데이터 임포트 선택시 단지 테이블 정의 정보만 생성할 것입니다.

  • 테이블, 사용자 또는 Full 임포트 모드를 사용하여 유효한 익스포트 파일로부터 데이터 추출.

  • 완전한, 증분, 또는 누적적인 익스포트 파일로부터 데이터 임포트.

  • 이전에 언급한 방법들 중 하나를 사용하여 어떤 테이블이 우연히 삭제되거나 truncate  되는 사용자 장애 에러로부터 복구

Table 모드

Table 모드는 모든 테이블을 임포트하지 않고 사용자 스키마에서 지정된 모든 테이블을 임포트합니다. 권한 있는 사용자는 다른 사용자 소유의 지정된 테이블을 임포트할 수 있습니다.

User 모드

User 모드는 사용자 스키마에 있는 모든 객체를 임포트합니다. 권한 있는 사용자는 지정된 사용자 집합의 스키마에 있는 모든 객체를 임포트할 수 있습니다.

Tablespace 모드

Tablespace 모드를 사용하면 권한 있는 사용자가 Oracle 데이터베이스 간에 테이블스페이스 집합을 이동할 수 있습니다.

Full Database 모드

Full Database 모드는 SYS 스키마에 있는 객체를 제외한 모든 데이터베이스 객체를 임포트합니다. 이 모드에서는 권한 있는 사용자만 임포트를 수행할 수 있습니다.

예제

expincr1.dmp 엑스포트 파일을 사용하여 행을 포함해 emp 및 dept 테이블을 scott 스키마로 임포트합니다.

$ imp scott/tiger tables=(emp,dept) rows=y file=expincr1.dmp

expincr1.dmp 엑스포트 파일을 사용하여 행을 포함해 Scott 스키마에 속한 모든 객체를 임포트합니다.

$ imp system/manager FROMUSER=scott file=expincr1.dmp

expdat.dmp 엑스포트 파일을 사용하여 ts_emp 테이블스페이스에 속한 모든 객체의 정의를 임포트합니다.

$ imp system/manager TRANSPORT_TABLESPACE=y TABLESPACES=ts_emp

참고: 명령행 모드 옵션은 대화식 모드 옵션과 유사합니다.

임포트 매개변수

매개변수

설명

USERID

임포트할 스키마 객체의 사용자 이름/암호

FILE

입력 파일의 이름. 유효한 Export 유틸리티 파일이어야 합니다.

ROWS

임포트 파일에 테이블 행을 포함시킬지 여부

IGNORE

해당 객체가 존재할 경우 생성 오류 무시

FULL

전체 파일 임포트

TABLES

임포트할 테이블

INDEXES

인덱스를 임포트할 것인지 여부

INCTYPE

증분 임포트 유형 지정. SYSTEM 및 RESTORE 옵션이 있습니다.

PARFILE

매개변수 사양 파일

HELP

대화식 모드에서 엑스포트 매개변수 표시

LOG

정보 및 오류 메시지용 파일

DESTROY

데이터베이스를 구성하는 기존 데이터 파일을 재사용해야 할지 여부 지정

FROMUSER

임포트할 객체를 포함하는 스키마 목록

TOUSER

임포트할 스키마를 소유한 사용자 이름 목록 지정

INDEXFILE

인덱스 생성 명령을 받을 파일 지정

TRANSPORT_TABLESPACE

엑스포트 파일에 있는 이동 가능한 테이블스페이스 메타 데이터를 Import 유틸리티가 임포트하도록 명령

TABLESPACES

데이터베이스로 이동할 테이블스페이스 목록

DATAFILES

데이터베이스로 이동할 데이터 파일 목록

TTS_OWNERS

이동 가능한 테이블스페이스 집합에 있는 데이터를 소유한 사용자 목록

POINT_IN_TIME_RECOVER

Import 유틸리티가 나머지 데이터베이스에 영향을 주지 않고 Oracle 데이터베이스에 있는 하나 이상의 테이블스페이스를 이전 시점으로 복구할지 여부 표시(릴리스 8.0 전용)

참고: 위에 나열한 매개변수는 모든 Import 유틸리티 매개변수의 전체 목록이 아니며 DBA가 복원 작업을 위해 자주 사용하는 매개변수입니다.

임포트 과정 순서
테이블을 임포트할 때 익스포트 파일이 읽혀지고 테이블과 데이터는 다음 순서로 생성됩니다.

  1. 새로운 테이블이 생성됩니다. 요점은 이 테이블은 기술적으로 오라클에 새로운 (NEW) 테이블들입니다. 그들은 원래 테이블들과 같은 데이터 및 성격을 가지고 있으나 사실상 이 테이블들은 데이터베이스에 새로이 생성되어 집니다. 이것은 논리적으로 아카이브 로그 파일이 이 테이블들에 적용되어 질 수 없는 이유인데, 아카이브 로그는 새로이 생성된 테이블에 기술적으로  아무런 갱신도 하지 않기 때문입니다.

  2. 인덱스 구조가 구축됩니다. DBA는 INDEXES=N으로 설정하고 임포트 과정 다음에 인덱스를 구축함으로써 임포트 과정 동안 어느 정도의 시간을 절약할 수 있습니다.이것은 임포트를 지원하기 위해 요구되는 롤백 세그먼트의 개수를 또한 제한할 것입니다.

  3. 데이터는 테이블에 임포트되나 ROWS=Y인 경우에만 그렇습니다. 인덱스는 채워집니다. INDEXES=Y가 명시될 때 인덱스는 테이블과 더불어 생성되며 따라서 데이터 임포트와 더불어 갱신됩니다.

  4. 트리거가 임포트되고 무결성 제약 조건들이 새로운 테이블에 대해 활성화됩니다.

테이블 임포트 순서는 중요할 수 있습니다. 예를 들어 외래키(foreign key)를 갖고 있는 테이블이 기본키(primary key)를 갖고 있는 테이블에 referential check을 갖고 있다면 외래키(foreign key) 테이블이 먼저 임포트 될때 아직 임포트 안된 기본키를 참조하는  모든 행은 제약조건이 활성화되어 있다면 거절될 것입니다. 전체 데이터베이스 익스포트할 때에는 문제가 안됩니다

NLS 고려사항
하나의 문자 집합을 사용하는 오라클 데이터베이스에서 다른 문자 집합을 사용하는 데이터베이스로 데이터 이동 시 데이터 전환이 적절하게 처리되어야 함을 확인하십시오. NLS_LANG 환경 변수를 데이터가 익스포트 되어질 데이터베이스의 문자 집합 정의로 설정함으로써 해결할 수 있습니다. 이것을 올바르게 설정하지 않을 때  데이터의 원치 않는 문자 전환을 야기하여 데이터의 손실을 유발할 수 있습니다.


미국 영어같은 7-bit ASCII 문자 집합에서 덴마크어 같은 8 비트 문자 집합으로 전환시 모든 문자가 덴마크어 알파벳에서와 동일한 문자를 가지고 있기 때문에 어떤 전환도 필요 없습니다. 덴마크어 같은 8 비트 ASCII 문자 집합에서 미국 영어 같은 7 비트 문자 집합으로 전환시 미국 알파벳에 없는 추가 덴마크어 문자들은 물음표(?)로 전환되게 합니다. 이 경우에 물음표는 적절한 결과인 알려지지 않은 덴마크어 문자로 치환됩니다.

지침

  • 8 비트씩 데이터 이동 시 문자들이 손실되는지 아닌지는 데이터 입력을 위해 사용되는 언어의 명세에 달려 있습니다. 예를 들어 스페인 알파벳은 덴마크 알파벳에는 없는 문자를 가지고 있으므로 스페인어 데이터베이스로부터 덴마크어 데이터베이스로 데이터 이동 시 데이터 변환을 초래할 것이며  따라서 이런 문자들의 손실도 가능하게 될 것입니다.

  • 여러 바이트씩 데이터 이동시도 다중 바이트 언어의 명세에 달려 있습니다.

요약 참조

  관련 내용

  참조

  파라미터

  None

  동적 성능 뷰

  None

  데이터 딕셔너리 뷰

  None

  명령

  Exp
  Imp

  • DEPT Table(Master Table), EMP Table(Child Table) 을 EXPORT 하려한다. 그러나 EXPORT 수행 중에 DEPT, EMP Table 모두 변경될 가능성이 많을 경우 두 Table 의 Data 일관성을 보장하기 위해 사용해야 하는 Option 은?
    A. CONSISTENT
    B. DIRECT
    C. COMPRESS
    D. ROWS
O



 

  • Direct Path EXPORT 설명 중 옳지 않은 것은?
    A. Database 자원에 대해 다른 사용자들과 경쟁하지 않는다.
    B. Database Block 을 Session 이 사용하는 Private Area 로 읽어 들인다.
    C. I/O 버퍼의 크기를 지정하기 위해 BUFFER Option 을 사용한다.
    D. 전송을 위해 TTC 버퍼로 직접 행을 전송한다.
O



 

  • Direct-path 방식의 export 에서 사용할수 없는 option 은?
    A. BUFFER
    B. RECORDLENGTH
O



 

  • EXPORT Option INCTYPE 설명 중 옳지 않은 것은?
    A. COMPLETE 는 모든 Table Data, Definition 을 Export 한다.
    B. INCREMENTAL 은 최근의 COMPLETE, CUMULATIVE, INCREMENTAL 이후에 갱신된 Table 을 Export 한다.
    C. CUMULATIVE 는 최근의 COMPLETE, CUMULATIVE 이후에 갱신된 Table 을 Export 한다.
    D. INCTYPE Option 사용 시 변경된 Record 만 Export 된다.
X 정답:D



 

  • Entire database 를 export 하려한다. 또한 export 되는 시점의 consistent 한 상태로 export 하려할때 그 명령은 다음 중 어느 것인가?
    A. EXP CONSISTENT=Y
    B. EXP FULL=Y CONSISTENT=Y
    C. EXP FULL=Y
    D. EXP FULL=Y CONSISTENT=Y TABLES=(s_emp)
X 정답:B



 

  • Export files 은 Import utility 에 위해서만 Database 에 object 를 재성성 할수 있다?
    A. TRUE
    B. FALSE
O



 

  • Export utility 에서 사용가능한 export mode 는? (multiple choice)
    A. a. Column
    B. Full database
    C. Grant
    D. User
    E. Table
O



 

  • IMPORT 시 Rollback Segment 에 관련된 Error 를 방지하기 위해 COMMIT Option 을 사용한다?
    A. TRUE
    B. FALSE
X 정답:A



 

  • IMPORT 시 Table 과 Data 가 생성되는 순서가 옳은 것은?
    A. Data Import -> Table 생성 -> Index 생성 -> Trigger, Constraints Enable
    B. Table 생성 -> Data Import -> Trigger, Constraints Enable -> Index 생성
    C. Table 생성 -> Index 생성 -> Data Import -> Trigger, Constraints Enable
X 정답:C



 

  • Logical backup 에 대해 archived redo log file 를 적용하여 복구할수 있다?
    A. TRUE
    B. FALSE
O



 

  • Table 을 Import 할때 default 로 system tablespace 에 생성된다?
    A. TRUE
    B. FALSE
O



 

  • dba.dmp export file 에 있는 모든 table 을 import 할려면 다음 중 맞는 것은?
    A. IMP system/manager FILE=DBA.DMP TABLES=FULL
    B. IMP system/manager FILE=DBA.DMP FULL=Y
    C. IMP system/manager FILE=DBA.DMP FULL,USERS=Y
    D. IMP system/manager FILE=DBA.DMP SHOW=Y
O

'프로그래밍 > DB' 카테고리의 다른 글

[펌] 오라클 9i R2의 Table Compression  (0) 2007.11.27
오라클 sysdate...  (0) 2007.11.27
오라클 사용자 계정 추가 및 테이블 스페이스 설정  (0) 2007.11.27
[펌] mysql 명령어 모음  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27

1. 오라클 사용자 계정 추가

sqlplus /nolog

connect / as sysdba

CREATE TABLESPACE PORTAL_DAT
    DATAFILE '/data1/portal_dat.dbf' SIZE 500m
    DEFAULT STORAGE ( INITIAL 524288
                      NEXT 524288
                      MINEXTENTS 2
                      MAXEXTENTS 512
                      PCTINCREASE 0 ) ;
                     
create TABLESPACE PORTAL_TEMP_DAT DATAFILE
                      '/data1/portal_temp_dat.dbf' size 500m
                     
/

CREATE TABLESPACE PORTAL_IDX
    DATAFILE '/data1/portal_idx.dbf' SIZE 500m
    DEFAULT STORAGE ( INITIAL 524288
                      NEXT 524288
                      MINEXTENTS 2
                      MAXEXTENTS 512
                      PCTINCREASE 0 ) ;
/

CREATE USER portal123 IDENTIFIED BY portal123
DEFAULT TABLESPACE PORTAL_DAT
TEMPORARY TABLESPACE temp;

ALTER USER portal123 IDENTIFIED BY portal123
DEFAULT TABLESPACE PORTAL_DAT
TEMPORARY TABLESPACE temp;

GRANT CONNECT, RESOURCE TO portal123;

'프로그래밍 > DB' 카테고리의 다른 글

오라클 sysdate...  (0) 2007.11.27
[펌] 오라클 EXPORT 및 IMPORT 유틸리티  (0) 2007.11.27
[펌] mysql 명령어 모음  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27

[펌] mysql 명령어 모음

프로그래밍/DB 2007. 11. 27. 14:15 Posted by galad
출처 블로그 > 고감각의 창조를 위한 지식레시피
원본 http://blog.naver.com/kogamgac/60029140770

mysql 명령어 모음

 

# root암호설정 - root로 로그인하여 해야함
% mysqladmin -u root password '변경암호'
% mysqladmin -u root -p기존암호 password '변경암호'


root암호변경설정
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
This is done with:
/usr/bin/mysqladmin -u root -p password 'new-password'
/usr/bin/mysqladmin -u root -h ns.dbakorea.pe.kr -p password 'new-password'


DB작업
DB생성: mysql> create database DB명 ( or % mysqladmin -u root -p create DB명 )
DB삭제: mysql> drop database DB명
DB사용: mysql> use DB명 (엄밀히 말하자면, 사용할 'default database'를 선택하는 것이다.)
DB변경: mysql> alter database db명 DEFAULT CHARACTER SET charset (4.1이상에서만 available)


This article comes from dbakorea.pe.kr (Leave this line as is) MySQL 연결
mysql -u 사용자 -p DB명 ( or % mysqladmin -u root -p drop DB명 )

데이터파일 실행(sql*loader기능)
mysql>load data infile "데이터파일" into table 테이블명 ;
데이터파일에서 컬럼구분은 탭문자, Null값은 /n로 입력
데이터파일의 위치는 /home/kang/load.txt 와 같이 절대경로로 지정할것.

질의 파일 실행
쉘프롬프트상에서
mysql -u 사용자 -p DB명 < 질의파일
or
mysql프롬프트상에서
mysql> source 질의파일

쉘프롬프트상에서 질의 실행
dbakorea@lion board]$ mysql mysql -u root -pxxxx -e \
>            "INSERT INTO db VALUES(
>            'localhost', 'aaa', 'aaa',
>            'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y')"


사용자 생성 & 사용자에게 DB할당
shell> mysql --user=root -p mysql

mysql> INSERT INTO user VALUES('localhost','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('localhost','DB명','사용자','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES('%','DB명','사용자','Y','Y','Y','Y','Y','Y');

mysql> FLUSH PRIVILEGES; (or shell prompt: mysqladmin -u root -pxxxx reload)

CASE 2: GRANT명령을 이용한 사용자 생성(이 방법이 권장된다)
kang이라는 DB를 만들고, 이 DB를 아래에서 나열된 권한을 가진 kang이라는 사용자를 생성
create database kang;
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';

mysql> create database kang;
Query OK, 1 row affected (0.00 sec)

mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
Query OK, 0 rows affected (0.00 sec)

mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';
Query OK, 0 rows affected (0.01 sec)

mysql>

여러가지 명령정리
mysql> show variables;                                              서버의 variables(설정사항)출력
mysql> show variables like 'have_inno%'                             조건에 맞는 variables만 출력
mysql> show databases;                                              database목록
mysql> show tables;                                                 현재DB의 테이블목록(temporary table은 출력하지 않음)
mysql> show tables from db명;                                       지정된 db명이 소유한 테이블목록
mysql> show tables like 'mem%';                                     조건에 맞는 테이블목록만 출력
mysql> show index from 테이블명;                                    인덱스 보기
mysql> show columns from 테이블명;                                  테이블구조(describe 테이블명, explain 테이블명)
mysql> show table status;                                           현재 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show table status from db명;                                 지정된 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show create table 테이블명;                                  해당 테이블 생성 SQL문 출력
mysql> rename table 테이블1 to 테이블2;                             테이블명 변경(ALTER TABLE 테이블1 RENAME TO 테이블2)
mysql> rename table 테이블1 to 테이블2, 테이블3 to 테이블4;         rename multiple tables
mysql> rename table db1명.테이블명 to db2명.테이블명;               테이블을 다른 DB로 이동
mysql> alter table 테이블명 add 컬럼명 데이터타입;                  컬럼추가
mysql> alter table 테이블명 del 컬럼명;                             컬럼제거
mysql> alter table 테이블명 modify 컬럼명 컬럼타입;                 컬럼명에 지정된 컬럼타입의 변경
mysql> alter table 테이블명 change old컬럼명 new컬럼명 컬럼타입     컬럼명 변경
mysql> alter table 테이블명 type=innodb;                            테이블type변경
mysql> create table 테이블명(..) type=heap min_rows=10000;          10000row를 수용할 수 있을 만큼 메모리할당(heap type이므로)
mysql> select version();                                            MySQL서버버전 출력
mysql> create table 테이블2 as select * from 테이블1;               테이블1과 동일한 테이블 생성(with 데이터, as는 생략가능)
mysql> create table 테이블2 as select * from 테이블1 where 1=2;     테이블1과 동일한 구조의 테이블 생성(without 데이터, 1=2는 0으로 할수도 있다.)
mysql> insert into 테이블2 select * from 테이블1;                   테이블1의 데이터를 테이블2에 insert


테이블이 존재여부 파악
DROP TABLE IF EXISTS 테이블명;
CREATE TABLE 테이블명 (...);
프로그래밍 언어에서 COUNT(*)를 사용하여 질의가 성공하면 테이블이 존재함을 파악할 수 있다.
ISAM, MyISAM의 경우 COUNT(*)가 최적화되어 상관없으나, BDB, InnoDB의 경우 full scan이 발생하므로 사용하지 마라.
대신 select * from 테이블명 where 0; 을 사용하라. 질의가 성공하면 테이블이 존재하는 것이고, 아니면 존재하지 않는 것이다.



접속
mysql {-h 접속호스트} -u 사용자 -p 사용DB
-h로 다른 서버에 존재하는 MySQL접속시 다음과 같이 MySQL DB에 설정해줘야 한다.
mysql> INSERT INTO user VALUES('접근을 허용할 호스트ip','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES('접근을 허용할 호스트ip','사용DB','사용자','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES; or 쉴프롬프트상에서 % mysqladmin -u root -p flush-privileges


검색조건(where)
regular expression을 지원하다니 신기하군..
mysql> select * from work where 열명 regexp "정규표현식";


백업 & 복구
mysqldump {-h 호스트} -u 사용자 -p DB명 > 백업파일
mysql {-h 호스트} -u 사용자 -p DB명 < 백업파일

mysqldump -u root -p --opt db_dbakorea > dbakorea.sql
mysqldump -u root -p --opt db_board | mysql ---host=remote-host -C database (상이한 머쉰)
mysql -u dbakorea -p db_dbakorea < dbakorea.sql

mysqldump -u root -p --opt db_dbakorea | mysql ---host=ns.dbakorea.pe.kr -C db_dbakorea

테이블 생성구문만을 화면에서 보려면 다음과 같이 --no-data를 사용한다. 테이블명을 생략하면 모든 테이블 출력
mysqldump -u 유저명 -p --no-data db명 테이블명

테이블 검사
isamchk

오라클 sysdate와 동일
insert into test values('12', now());

유닉스 time()함수 리턴값 사용
FROM_UNIXTIME(954788684)
UNIX_TIMESTAMP("2001-04-04 :04:04:04")

MySQL 디폴트 DB&로그파일 위치
/var/lib/mysql
/var/lib디렉토리는 여러 프로세스들이 사용하는 데이터를 저장하는 일종의 파일시스템상의 데이터베이스라고 볼 수 있다.

replace
해당 레코드 존재하면 update하고, 존재하지 않는다면 insert한다.(insert문법과 동일)
replace into test values('maddog','kang myung gyu')'

explain
explain 질의문: 지정한 질의문이 어떻게 실행될 건지를 보여줌
mysql> explain select u.uid, u.name, a.name from sm_user u, sm_addr a where u.uid=a.uid;
+-------+------+-----------------+-----------------+---------+-------+------+-------+
| table | type | possible_keys   | key             | key_len | ref   | rows | Extra |
+-------+------+-----------------+-----------------+---------+-------+------+-------+
| u     | ALL  | PRIMARY         | NULL            |    NULL | NULL  |  370 |       |
| a     | ref  | sm_addr_uid_idx | sm_addr_uid_idx |      11 | u.uid |   11 |       |
+-------+------+-----------------+-----------------+---------+-------+------+-------+
2 rows in set (0.01 sec)


temporary table
크기가 큰 테이블에 있는 subset에 대한 질의라면 subset을 temporary table에 저장한 후 질의하는 것이 더 빠를 경우가 있다.
temporary table는 세션내에서만 유효하고(현재 사용자만이 볼수 있다는 뜻), 세션종료시 자동적으로 drop된다.

create temporary table (...);
create temporary table (...) type=heap;        디스크가 아닌 메모리에 테이블 생성

존재하는 permanent table의 테이블명과 동일하게 생성할 수 있으며,
temporary table은 permanent table보다 우선시되어 처리된다.
4.0.7의 감마버전에서 테스트하면 결과는 약간 달라진다. 버그인건지..

mysql> create table test (id varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values('dbakorea');
Query OK, 1 row affected (0.00 sec)

mysql> create temporary table test(id varchar(10));
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
Empty set (0.00 sec)

mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+----------+
| id       |
+----------+
| dbakorea |
+----------+
1 row in set (0.00 sec)



Table Type에 다른 Files on Disk

ISAM   .frm (definition) .ISD (data) .ISM (indexes)
MyISAM .frm (definition) .MYD (data) .MYI (indexes)
MERGE  .frm (definition) .MRG (list of constituent MyISAM table names)
HEAP   .frm (definition)
BDB    .frm (definition) .db (data and indexes)
InnoDB .frm (definition)

보통 mysqldump를 사용하여 백업을 수행하여 다른 DB서버에 데이터를 restore하면 된다.
MySQL은 별다른 작업없이 데이터파일을 단순히 복사(copy)하는 것만으로도 다른 서버에
DB을 이동시킬 수 있다. 하지만, 이런 방식이 지원되지 않는 table type도 있다.

ISAM: machine-dependent format하기때문에..
BDB : .db파일에 이미 테이블위치가 encode되어 있기때문에..
MyISAM, InnoDB, MERGE :가능(machine-independent format)

별다른 지정을 하지 않았다면 디폴트 TABLE type이 MyISAM이므로, 무난히 migration할 수 있다.
floating-point컬럼(FLOAT,DOUBLE)이 있다면 이러한 방식이 실패할 수 도 있다.

쉘에서는 mysql이 되는데 PHP에서 mysql.sock error를 내면서 MySQL이 안되는 경우
mysql.sock은 /tmp 아니면 /var/lib/mysql에 생기게 된다.
나의 경우, /var/lib/mysql에 mysql.sock파일이 있는데 PHP에서는 /tmp에서 찾으려하면서 에러를 발생했다.
/usr/bin/safe_mysqld파일에서 다음과 같이 수정한다.
주석(#)이 달린 것이 원래것이고 그 밑에 있는것이 수정한 것이다.

# MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/var/lib/mysql/mysql.sock}
MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/tmp/mysql.sock}

위와 같이 하니 /usr/bin/mysql이 /var/lib/mysql/mysql.sock에서 소켓파일을 찾으려 했다.
socket file을 지정하는 --socket이라는 옵션으로 다음과 같이 지정하면 된다.

mysql --socket=/tmp/mysql.sock -u dbakorea -p db_test

하지만 mysql실행시마다 이렇게 써줘야한다는 것이 상당히 귀찮다. 옵션이 바로 적용되게 설정하자.
mysql은 설정사항을 다음 3가지 파일에서 검색한다.

/etc/my.cnf            global options(MySQL 전체적으로 사용되는 옵션 정의)
mysql-data-dir/my.cnf  특정 DB에 적용되는 option (/var/lib/mysql/my.cnf)
~/.my.cnf              사용자 각각의 설정('~'문자는 사용자의 홈디렉토리는 의미)

/usr/share/mysql디렉토리에 예제가 있으므로 참고한다.
소켓파일의 지정은 다음줄을 넣어주면 된다.

socket          = /tmp/mysql.sock


== /etc/my.cnf예 ==
# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /tmp/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock



MySQL에서 통계처리시
orderby, groupby 는 sort_buffer를 늘여준다.(show variables)

live table(smslog)에서 모든 질의를 처리하지 말고 summary table에 질의결과를 저장해 재질의 처리한다.
summary table이 heap-type table가 가능한지 확인할 것.

INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
     tblTemp1.fldOrder_ID > 100;


join이 subselect보다 빠르다.
join시 사용되는 컬럼은 동일한 column type과 길이를 가져야만 최적의 속도를 보장한다.
즉, 동일 column type이지만 길이가 다르다면(char(11), char(10)), 동일한 컬럼도메인으로 변경해주는 것이 좋다.
where의 in은 optimize되어 있으므로 빠르다
insert,select는 동시에 수행가능하다.(어떻게?)
explain으로 질의과정 점검


varchar to/from char
conversion varchar를 char로 변경할 경우 모든 컬럼타입을 동시에 변경해야 한다.
반대의 경우, 하나만 char->charchar변경시 다른 모든 컬럼도 varchar로 변경됨
참.. 특이하구만..

mysql> CREATE TABLE chartbl (name VARCHAR(40), address VARCHAR(80));
Query OK, 0 rows affected (0.05 sec)

mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(40) | YES  |     | NULL    |       |
| address | varchar(80) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

mysql> alter table chartbl modify name char(40);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(40) | YES  |     | NULL    |       |
| address | varchar(80) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table chartbl modify name char(40), modify address char(80);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc chartbl;
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| name    | char(40) | YES  |     | NULL    |       |
| address | char(80) | YES  |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql>


"For each article, find the dealer(s) with the most expensive price."

표준안
     SELECT article, dealer, price
     FROM   shop s1
     WHERE  price=(SELECT MAX(s2.price)
                   FROM shop s2
                   WHERE s1.article = s2.article);

수정안(최적화)
     CREATE TEMPORARY TABLE tmp (
             article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
             price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);

     LOCK TABLES shop read;

     INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

     SELECT shop.article, dealer, shop.price FROM shop, tmp
     WHERE shop.article=tmp.article AND shop.price=tmp.price;

     UNLOCK TABLES;

     DROP TABLE tmp;



==============================================================================
MySQL 특성정리
==============================================================================
primary key, foreign key지원
index 지원(15개컬럼, 256byte까지)
MySQL에서의 Stored Script개념 => SQL server language
commit-rollback개념 => lock tables(lock table test write -> 트랜잭션.. -> unlock tables)
컬럼명길이: 64자까지, 컬럼 Alias: 256자까지
not case-sensitive: keywords, functions, column, index명
case-sensitive: database, table, alias명
키워드,함수명은 대소문자구별이 없지만, db명과 table명은 Unix계열이라면 case-sensitive하다.
(이는 오브젝트명이 OS의 fs에 따라 저장되기 때문이다. 서버의 lower_case_table_names 변수를
1로 설정하면 오브젝트명은 모두 소문자로 저장되므로 유닉스-윈도간 호환성을 높일 수 있다.

지원되지 않는 부분:
Stored Procedure(5.0이상부터 지원된다고 함)
View(5.0이상부터 지원된다고 함)
Trigger(5.0이상부터 지원된다고 함)
subquery(4.1이상부터 지원된다고 함)
union, union all(4.0이상부터 지원됨)

[테이블 type에 따른 인덱스 특성]
Index Characteristic            ISAM    MyISAM              HEAP        BDB                 InnoDB
NULL values allowed             No      Yes                 As of 4.0.2 Yes                 Yes
Columns per index               16      16                  16          16                  16
Indexes per table               16      32                  32          31                  32
Maximum index row size (bytes)  256     500                 500         500/1024            500/1024
Index column prefixes allowed   Yes     Yes                 Yes         Yes                 No
BLOB/TEXT indexes allowed       No      Yes(255 bytes max)  No          Yes (255 bytes max) No


인덱스 생성
- alter table을 이용한 인덱스 생성이 더 flexible함
- 인덱스명은 생략가능

ALTER TABLE 테이블명 ADD INDEX 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD UNIQUE 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD PRIMARY KEY (인덱스컬럼);
ALTER TABLE 테이블명 ADD FULLTEXT (인덱스컬럼);

CREATE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE FULLTEXT INDEX 인덱스명 ON 테이블명 (인덱스컬럼);

unique인덱스와 primary key인덱스와의 차이
unique은 null허용하지만, primary key는 null허용 안함
unique은 하나의 테이블에 여러개 올 수 있지만, primary key는 하나만 존재

테이블생성시 지정
CREATE TABLE 테이블명
(
  ... column declarations ...
  INDEX 인덱스명 (인덱스컬럼),
  UNIQUE 인덱스명 (인덱스컬럼),
  PRIMARY KEY (인덱스컬럼),
  FULLTEXT 인덱스명 (인덱스컬럼),
...

);


index prefix 생성
- 컬럼의 전체길이중 일부만 인덱스로 사용
- supported for ISAM, MyISAM, HEAP, and BDB tables, but not for InnoDB tables
- 지정되는 길이는 byte단위가 아닌 charater단위이므로, multi-byte character일 경우 주의
- blob, text 컬럼타입일 경우, index prefix 가 유용(255 길이까지 가능)

CREATE TABLE 테이블명
(
  name  CHAR(30) NOT NULL,
  address CHAR(60) NOT NULL,
  INDEX (name(10),address(10))
);


인덱스 삭제
DROP INDEX 인덱스명 ON 테이블명;
ALTER TABLE 테이블명 DROP INDEX 인덱스명;
ALTER TABLE 테이블명 DROP PRIMARY KEY;


outer join

[MySQL]
left outer joing : SELECT t1.*, t2.* FROM t1 LEFT  OUTER JOIN t2 ON t1.i1 = t2.i2;
right outer joing: SELECT t1.*, t2.* FROM t1 RIGHT OUTER JOIN t2 ON t1.i1 = t2.i2;

[Oracle]
left outer joing : SELECT t1.*, t2.* FROM t1, t2 where t1.i1 = t2.i2(+);
right outer joing: SELECT t1.*, t2.* FROM t1, t2 where t1.i1(+) = t2.i2;

SELECT
  student.name, student.student_id,
  event.date, event.event_id, event.type
FROM
  student, event
  LEFT JOIN score ON student.student_id = score.student_id
          AND event.event_id = score.event_id
WHERE
  score.score IS NULL
ORDER BY
  student.student_id, event.event_id;
 

:= 문장을 이용한 변수의 설정

현재 dbakorea의 데이터베이스강좌게시판에 등록된 총 게시물은 43개이다. 43개의 강좌를 읽은 수(hit수)는 각각 다르다.
평균 hit수를 구해 보자.

mysql> select @total_hit := sum(hit), @total_record := count(*) from zetyx_board_database;
+------------------------+---------------------------+
| @total_hit := sum(hit) | @total_record := count(*) |
+------------------------+---------------------------+
|                   3705 |                        43 |
+------------------------+---------------------------+
1 row in set (0.00 sec)

mysql> select @total_hit/@total_record as 평균HIT;
+-----------------+
| 평균HIT         |
+-----------------+
| 86.162790697674 |
+-----------------+
1 row in set (0.00 sec)



select substring(subject from 9) from zetyx_board_database where substring(subject, 1, 8) = '[ORACLE]';


보통 상용DBMS들이 row-level locking을 지원한다. 쉽게 말해 레코드단위로 락킹한다는 말이다.
반면, MySQL의 MyISAM 테이블타입은 table-level locking을 사용한다.
쉽게 말하면, insert, update, delete작업은 전체 테이블에 락을 걸고 처리된다는 것이다.
row-level락보다 비효율적이지만,.. MySQL은 빠르기 때문에 이 단점이 상쇄된다.

Compressed MyISAM(packed MyISAM)
정적인 테이블데이터는 압축하여 20-60%정도의 공간을 절약할 수 있다.
Production데이터를 CD로 받아서 차후 디스크에 풀지 않고 CD자체로 바로 사용할 수도 있다.
gzip등으로 백업받으면 이를 푸는 과정이 필요할 것이다.
% myisampack dbakorea.myi

데이터베이스 게시판의 Merge Table에 좀 더 자세한 내용을 적어 두었다.


RAID Table
1개의 테이블은 OS상에 3개의 파일로 구성된다.
스키마파일(.frm), data파일(.myd), index파일(.myi)
MySQL의 RAID테이블은 데이터파일(.myd)을 여러개의 파일들로 구성하는 것이다.

create table raid_test (...)
type=myisam raid_type=striped raid_chunks=4 raid_chunsize=8

테이블을 4개의 데이터파일로 나누고, 8kb단위로(8kb stripe) 라운드로빈 방식으로 write가 이루어진다.

'프로그래밍 > DB' 카테고리의 다른 글

[펌] 오라클 EXPORT 및 IMPORT 유틸리티  (0) 2007.11.27
오라클 사용자 계정 추가 및 테이블 스페이스 설정  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27

07 PL/SQL

프로그래밍/DB 2007. 11. 27. 14:12 Posted by galad

★ 프로시져 간단 예제2

- empno 2개를 입력 받아, 첫번째 사람의 sal을 v_sal에 받은 후,

두번째 사람의 sal을 v_sal * 1.2로 바꾼다.


create or replace procedure proc2(a_empno in number, a_empno2 in number)
is
   v_sal number;
begin
   proc1(a_empno, v_sal);   // 미리 만든 proc1을 사용한다.
   update emp set sal = 1.2 * v_sal where empno = a_empno2;
end;
/


show errors


// 결과 확인

SQL> select empno, sal from emp;   // 프로시져 실행 전의 결과

     EMPNO        SAL
---------- ----------
      7369        800
      7499       1600
      7521       1250
      7566       2975
      7654       1250
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500
      7876       1100

      7900        950                  // 두번째 사람의 sal을 바꾼다
      7902       3000
      7934       1300                  // 첫번째 사람의 sal을 가져와서

14 개의 행이 선택되었습니다.


SQL>  exec proc2(7934, 7900);

PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> select empno, sal from emp;       // 실행 후의 결과

     EMPNO        SAL
---------- ----------
      7369        800
      7499       1600
      7521       1250
      7566       2975
      7654       1250
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500
      7876       1100

      7900       1560             // 7934의 1.2배로 바뀌었다.
      7902       3000
      7934       1300

14 개의 행이 선택되었습니다.





/******************************************************************************
*   파일      : CallTest.java
*   용도      : CallableStatement를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 28
*   Version : 1.0
******************************************************************************/

package CallableStatement;

import java.sql.*;
import java.io.*;
import ConnectionPool.DBConnectionMgr;

public class CallTest
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        DBConnectionMgr mgr = DBConnectionMgr.getInstance();
        Connection conn = null;
        CallableStatement cstmt = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = 0;
       
        try
        {
           conn = mgr.getConnection();
           cstmt = conn.prepareCall("{call proc1(?, ?)}");   // 함수 호출하는 방식
          
           System.out.print("찾을 사원의 번호은? >> ");
           String str = br.readLine();      // 사원 번호를 입력 받아서          
           num = Integer.parseInt(str);
          
           cstmt.setInt(1, num);        // 넣고
           cstmt.registerOutParameter(2, Types.CHAR);   // 결과를 어떤 형식으로 받을 것인가.
          
           cstmt.execute();
          
           int salary = cstmt.getInt(2);   // 결과를 받는다.
          
           System.out.println(salary);
           System.out.println("End");
          
           cstmt.close();
           conn.close();
           mgr.freeConnection(conn);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}


CallableStatement는 PreparedStatement를 상속받은 인터페이스로 DB에 저장된 Stored Procedure를 수행하는데 활용된다.
설정은 PreparedStatement와 동일하게 ?, ?, ? 로 설정을 하고 이후에 setXXX 메소드로 설정 할 수 있다.
실행한 결과를 받아 올때는 out 파라미터 등록 메소드인 registerOutParameter()로 등록을 해야만

실행 후에 getXXX 메소드로 결과를 추출할 수 있다.
conn.prepareCall(“{cal test1}”);
conn.prepareCall(“{call test2(?,?)}”);
conn.prepareCall(“{? = call test2(?,?)}”);

'프로그래밍 > DB' 카테고리의 다른 글

오라클 사용자 계정 추가 및 테이블 스페이스 설정  (0) 2007.11.27
[펌] mysql 명령어 모음  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27

[펌] PL/SQL 05

프로그래밍/DB 2007. 11. 27. 14:11 Posted by galad
출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26878643

 

1. 개요
  - 작업을 수행하는 명명된 PL/SQL블록.
  - 반복실행을 위한 DB 객체로서 DB에 저장.
  - 매개변수를 가질 수 있고 호출될 수 있음.
  - 머리말, 선언부, 실행부, 예외처리부로 구성.
  - 재이용성, 유지가능성을 높여줌

 

2. 구문
  Create [Or Replace] Procedure procedure_name
  (argument1 [mode1] datatype1,
   argument2 [mode2] datetype2, …)
   Is | As

   Begin

   [Exception]

   End [procedure_name];

 

   procedure_name 프로시저의 이름
   Argument   전달 인수 명
   Mode        인수의 유형
     IN(default)  input argument
     OUT          output argument
     INOUT        input/output argument
   Datatype   인수의 데이터 타입

 

3. SQL*PLUS 이용 프로시저 생성
  - 스크립트 파일 생성
    : Sql> ed[it] 파일명.sql
  - 프로시저 스크립트 생성 후 스크립트 파일 저장.
  - 프로시저 생성 및 컴파일
    : Sql> @파일명 또는 start 파일명
  - 컴파일 오류 발생시 오류 확인
    : Sql> show error [Procedure 프로시저명]
  - 프로시저 실행
    : Sql> execute 프로시저명(인수명)

 

4. 프로시저 생성 예
  SQL> ed raise_salary.sql

  Create Or Replace Procedure raise_salary
  (v_id in emp.empno%TYPE)
  IS
  Begin
     update emp
          set sal = sal * 1.10
     where empno = v_id;
  End raise_salary;
  /

 

  SQL>@raise_salary
  프로시저가 생성되었습니다.

 

  SQL> execute raise_salary(7369)
  PL/SQL 처리가 정상적으로 완료되었습니다

 

5. 매개변수 전달 방법
  - 다중의 매개변수를 가지는 프로시저에서 매개변수의 값을 지정하기 위한 위치(Positional), 명명(Named), 결합(Combination)의 방법을 이용할 수 있음.
  - 위치 : 선언된 매개변수의 순서로 값을 나열
  - 명명 : 특수구문(=>)을 이용하여 매개변수 이름과  짝을 이룸으로써 순서없이 값을 나열
  - 결합 : 위치, 명명의 나열방식으로 값을 나열

 

  Create Or Replace Procedure add_dept
  (v_deptno in dept.deptno%type,
   v_name   in dept.dname%type  default  'unknown',
   v_loc    in dept.loc%type  default  'unknown')
  IS
  Begin
     Insert into dept
       values (v_deptno, v_name, v_loc);
  End  add_dept;
  /

 

  Begin
    add_dept(41);
    add_dept(42, 'TRAINING','SEOUL'); 
    add_dept(v_loc=>'JEONJU', v_deptno=>43, v_name=>'EDUCATION');
    add_dept(44, v_loc=>'DALAS', v_name=>'PRODUCING');
  End;
  /

 

6. 프로시저 삭제
  - SQL*PLUS를 사용하여 :
    Drop Procedure procedure_name
  - 프로시저 삭제 예 :
    Drop Procedure raise_salary;
  - 롤백은 Drop Procedure같은 데이터 정의 언어(DDL) 명령어 실행 후에는 불가능.

 

 

'프로그래밍 > DB' 카테고리의 다른 글

[펌] mysql 명령어 모음  (0) 2007.11.27
07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 04  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27
[펌] PL/SQL 02  (0) 2007.11.27

[펌] PL/SQL 04

프로그래밍/DB 2007. 11. 27. 14:11 Posted by galad
출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26877522

1. PL/SQL에서 SQL문장
  - SQL에 있는 DML, 트랜잭션 제어 명령 지원.
  - SELECT 명령어를 사용하여 database에서 한 행의 데이터를 추출.
  - 값은 단일 집합만 리턴될 수 있고 Into절을 이용하여 변수에 값을 할당.
  - DML 명령어를 사용하여 database의 다중 행에 대한 변경 가능.
  - COMMIT, ROLLBACK 명령어로 transaction을 제어함.
  - 암시적인 커서속성으로 DML 결과를 결정함.
    (SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND, SQL%ISOPEN)
  - PL/SQL은 DDL(CREATE, ALTER, DROP TABLE), DCL(GRANT, REVOKE)을 지원하지 않음.

 

2. PL/SQL에서 SELECT문장
  - Database에서 SELECT로 단일행의 data를 읽어들임.

  - SELECT  select_list
     INTO    {variable_name [, variable_name] | record_name}
    FROM    table
    WHERE   condition;

  - SQL의 SELECT 문장에 대한 모든 구문형식을 이용가능.
  - 호스트(바인드) 변수는 콜론으로 접두어를 붙여야 함.
    :v_variable_name

  - INTO절은 필수, SELECT절에서 SQL이 리턴하는 값을 저장하기 위한 변수의 이름을 지정.
  - SELECT절에서 선택된 각 항목당 하나의 변수를 INTO절에 지정해야 하며 순서도 일치.

  - 질의는 하나의 행만 리턴해야 하며 둘 또는 그 이상의 행 또는 행이 없이 리턴되면 에러 발생.
  - PL/SQL은 NO_DATA_FOUND 와 TOO_MANY_ROWS 예외로 블록의 예외 section에서 추적할 수 있는 표준 예외를 조성하여 이 에러를 처리할 수 있음.

 

  - TOO_MANY_ROWS 발생 예 :
  SQL> variable dept number
  SQL> variable salary number
  SQL> ed two_rows


  declare
     v_sum_sal  emp.sal%Type;
     v_deptno    emp.deptno%Type;
  Begin
     select deptno, sum(sal)
     into   v_deptno, v_sum_sal
     from   emp
     group by deptno;
     :salary := v_sum_sal;
     :dept   := v_deptno;
  End;
  /


  SQL>  @two_rows
  1행에 오류:
  ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
  ORA-06512: 줄 5에서

 

3. PL/SQL에서 데이터 검색위한 지침
  - Semicolon(;) 으로 개별 SQL 문장을 종료하기.
  - SELECT 문장이 PL/SQL 안에 내장될 때
    INTO절 사용.
    WHERE 절은 선택적.
  - SELECT 절에서의 column과 INTO절에서 출력변수의 수를 동일하게 선언해야 하고 위치상으로 대응되며, datatype은 일치해야 함.
  - 동적으로 %TYPE, %ROWTYPE 사용.
  - SUM같은 그룹함수는 SQL문장에서는 사용가능하지만 PL/SQL 구문에 사용 못함

 

4. PL/SQL에서 INSERT


  DECLARE
    v_empno emp.empno%TYPE;
  BEGIN
     SELECT  empno_sequence.NEXTVAL
     INTO v_empno
     FROM dual;

     INSERT INTO emp(empno, ename, job, depno)
     VALUES (v_empno, 'HARDING', 'CLERK', 10 );
  END ;
  /

 

5. PL/SQL에서 UPDATE


  DECLARE
     v_sal_increase emp.sal%TYPE  :=  2000 ;
  BEGIN
     UPDATE  emp
 SET  sal = sal  + v_sal_increase
       WHERE  job = 'ANALYST';
  END ;
  /

 

6. PL/SQL에서 DELETE


  DECLARE
     v_deptno  emp.deptno%TYPE  :=  10 ;
  BEGIN
     DELETE     FROM  emp
     WHERE              deptno = v_deptno ;
  END ;
  /

 

7. 암시적 커서
  - 암시적 커서의 속성을 이용하여, SQL 문장의 결과를 테스트할 수 있음. 
  - 암시적 커서 4가지 속성
     SQL%ROWCOUNT : 가장 최근의 SQL문장에 의해 영향을 받은 행의 수(정수값)
     SQL%FOUND    : 가장 최근의 SQL문장이 하나 또는 그 이상의 행에 영향을 미친 다면 BOOLEAN 속성은TRUE로 평가됨
     SQL%NOTFOUND : 가장 최근의 SQL문장이 어떤 행에도 영향을 미치지 않는다면 BOOLEAN속성은TRUE로 평가됨
     SQL%ISOPEN   : PL/SQL이 실행된 후에 즉시 암시적으로 커서를 닫으므로 항상 FALSE로 평가됨

  - 암시적 커서 사용 예 :
   SQL>VARIABLE  rows_deleted  Varchar2(100)


   DECLARE
     v_ordid  NUMBER := 605 ;
   BEGIN
     DELETE    FROM    item
     WHERE    ordid = v_ordid  ;

     :rows_deleted := SQL%ROWCOUNT ||' rows deleted.');
   END ;
   /

'프로그래밍 > DB' 카테고리의 다른 글

07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27
[펌] PL/SQL 02  (0) 2007.11.27
[Oracle/펌] PL/SQL 01  (0) 2007.11.27