2011년 6월 30일 목요일

[Oracle.6]DML (Data Manipulation Language) - TRANSACTION

DML ( Data Manipulation Language )
테이블의 데이터는 조회 및 추가, 수정, 삭제할 수 있어야 한다. DML은 이와 관련된 명령어를 부르는 용어로 데이터 조작 명령을 통해 테이블 내 데이터를 추가, 수정, 삭제 할 수 있다.
1. TRANSACTION
TRANSACTION은 하나의 작업의 단위를 말한다. 예를 들어 A씨가 B씨에게 $500을 이체 하려고 하면, 정상적인 이체가 이루어 지면 A씨 계좌에서 $500이 차감되고, B씨 계좌에서 $500이 더해지고 이것이 데이터베이스에 자장된다. 이것이 하나의 작업이 되는 것이다.
반면 A씨 계좌에서 $500을 차감 했는데 B씨 계좌를 처리하고자 할 때 시스템에 문제가 생겨 정상적으로 처리가 되지 않았을 경우에는 A씨 계좌에 대한 처리도 무효가 되어야 한다.
Oracle에서는 DML문이 정상적으로 실행되더라도 Transaction은 아직 진행 중이다. 따라서Transaction을 종료하고자 할 때는 반드시 작업이 성공적으로 처리되면 COMMIT, 작업을 취소하고자 한다면 ROLLBACK 명령으로 Transaction을 종료 하여야 한다.
1) INSERT TRANSACTION
INSERT INTO 테이블이름(칼럼이름1, 칼럼이름2, …)
VALUES(1, 2, …)
테이블에 데이터를 추가하기 위한 명령. 추가한 후에는 Transaction을 정상적으로 종료하여야 한다. ( COMMIT or ROLLBACK )
2) 여러 행을 한번에 INSERT
INSERT INTO 테이블이름(칼럼이름1, 칼럼이름2, …)
SELECT 구문
3) 여러 테이블을 한번에 INSERT
INSERT [ALL / FIRST ]
           WHEN 조건1 THEN
                     INTO 테이블이름1
           WHEN 조건2 THEN
                     INTO 테이블이름2
           ELSE
INTO 테이블이름0
SELECT 구문;
기존 INSERT구문에 OPTION, 조건 SELECT 구문이 추가 되었다. ALL일 경우 조건을 파악하여 참이면 INTO절을 수행하게 된다.
INSERT문을 중심으로 TRANSACTION에 대해 보았다. 다음으로 제약 조건과 함께 다른 조작 언어들을 살펴 보자.



*** 참조 문헌 : 10g로 시작하는 오라클 SQL & PL/SQL - 5장 데이터조작의 장애를 제거하라

2011년 6월 29일 수요일

[Oracle.5]SQL - Join, Subquery, Group by 확장, 계층적 질의

1. JOIN
하나 이상의 테이블에서 데이터를 얻고자 한다면 테이블의 수만큼 질의문을 작성해야 한다. 하지만 JOIN을 이용하여 하나의 질의문에서 하나이상의 테이블의 데이터를 얻을 수 있다.
1) SELECT FROM 을 이용한 조인
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1, 테이블이름2
WHERE 테이블이름1.칼럼이름 = 테이블이름2.칼럼이름;
양쪽 칼럼에 동일하게 있는 칼럼을 WHERE절에서 같다는 조건을 추가 시킨다.
2) JOIN절을 사용한 명시적 조인
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1
JOIN 테이블이름2
ON 테이블이름1.칼럼이름 = 테이블이름2.칼럼이름;
FROM절에 JOIN을 명시하였고 ON절에 두 테이블이 JOIN하기 위한 조건을 정의 하였다.
3) 3개 이상의 테이블 조인
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1, 테이블이름2, 테이블이름3
WHERE 테이블이름1.칼럼이름1 = 테이블이름2.칼럼이름1
  AND 테이블이름1.칼럼이름2 = 테이블이름3.칼럼이름2;
4) OUTER JOIN
OUTER JOIN은 조건(ON)을 만족하는 행뿐만 아니라 특정 테이블을 지정하여 만족하지 않은 경우도 질의의 결과로 포함하고자 할 때 사용합니다.
1)SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1
LEFT OUTER JOIN 테이블이름2
ON 테이블이름1.칼럼이름 = 테이블이름2.칼럼이름;
2) SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1, 테이블이름2
WHERE 테이블이름1.칼럼이름(+) = 테이블이름2.칼럼이름;
하나 이상의 테이블로부터 질의문을 작성할 때는 다음과 같은 습관을 가져야 한다.
1) 요구하는 정보는 무엇인가?
2) 요구하는 정보를 어느 테이블로부터 가져와야 하는가?
3) 어떤 칼럼이 해당하는 정보를 가지고 있는가?
2. Subquery
하나의 질의문에 두개의 SELECT절을 사용한다.
SELECT 칼럼이름1, 칼럼이름2 …
FROM 테이블이름1
WHERE 칼럼이름 = (SELECT 칼럼이름 FROM 테이블이름2)
최종경과를 출력하는 SELECT절을 MAIN Query라고 하고 ()안의 질의는 MAIN Query에 상대되는 개념으로 Subquery라 한다. Subquery의 수행결과가 Main Query에 넘겨져 최종 결과가 출력 횐다.
Ex)
SQL > SELECT employee_id, last_name, salary
      FROM employees
      WHERE salary > ( SELECT AVG(salary) FROM employees );
SQL > SELECT employee_id, last_name, job_id, salary
      FROM employees
      WHERE ( job_id, salary ) IN (SELECT job_id, MAX(salary) FROM employee GROUP BY job_id);
3. GROUP BY 절의 확장
1) GROUP BY ROLLUP
SELECT 칼럼이름, 계산식, 함수
FROM 테이블[, 테이블, 서브쿼리, , ]
[WHERE 원하는 자료를 걸러내기 위한 조건 나열]
[GROUP BY ROLLUP 그룹화할 조건 나열]
[HAVING 그룹함수 걸러내기 위한 사용
[ORDER BY 최종 결과의 정렬에 사용될 조건 나열]
GROUP BY ROLLUP (A, B, C) 하면 우측부터 하나씩 제외해 가면서 그 결과를 반환한다.
1. A, B, C 
2. A, B 
3. A 
4. 전체
2) GROUP BY CUBE
SELECT 칼럼이름, 계산식, 함수
FROM 테이블[, 테이블, 서브쿼리, , ]
[WHERE 원하는 자료를 걸러내기 위한 조건 나열]
[GROUP BY CUBE 그룹화할 조건 나열]
[HAVING 그룹함수 걸러내기 위한 사용
[ORDER BY 최종 결과의 정렬에 사용될 조건 나열]
GROUP BY CUBE (A, B, C) 하면 존재하는 모든 경우의 수에 대해 그룹을 지어준다.
1. A, B, C 
2. A, B 
3. B, C 
4. A, C 
5. A
6. B
7. C
8. 전체
3) GROUP BY GROUPING SETS
GROUPING SET ROLLUP CUBE와는 다르게 원하는 집계만 뽑아 결과를 얻을 수 있다.
CUBE(A, B, C)  GROUPING SETS으로 표현하면
GROUPING SETS( (A,B,C), (A,B), (A,C), (B,C), (A), (B), (C), () ) 이다.
만약 (A,B)별 집계와 (B,C)별 집계만 필요하다고 하면, GROUPING SETS( (A,B), (A,C) ) 를 사용하면 효과적으로 필요한 연산만 수행할 수 있다.
4. 계층적 질의
SELECT [LECEL], 칼럼이름, 계산식, 함수 
FROM 테이블[, 테이블, 서브쿼리, , ]
[WHERE 원하는 자료를 걸러내기 위한 조건 나열]
[START WITH 계층의 시작점이 될 행을 구별하는 논리식 표현]
[CONNECT BY 계층을 구성할 때 사용될 논리식 표현]
1) START WITH
완성된 계층의 중심을 설정하기 위해 사용되는 절이다. 생략이 가능하고, 생략하면 각각의 행이 중심이 되는 계층적 질의가 수행된다.
2) CONNECT BY
상위 계층의 행과 하위 계층의 행을 연결하는 규칙을 지정하는 절이며 생략할 수 없다.
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID 또는
CONNECT BY EMPLOYEE_ID = MANAGER_ID 와 같은 형태로 사용된다.
3) 실행 순서
1. START WITH
2. CONNECT BY
3. WHERE
계층적 질의에서는 SYS_CONNETCT_BY_PATH 함수를 사용할수 있으며, 부모 계층을 나타내지 않게 되면 하위 계층도 나오지 않게 된다. 또한, ORDER BY GROUP BY 절은 정력순서를 훼손하기 때문에 사용해서는 안된다



*** 참조 문헌 : 10g로 시작하는 오라클 SQL & PL/SQL - 4장 데이터 얻기 한 걸음 더 내딛다

2011년 6월 28일 화요일

[Oracle.4]SQL Functions

SQL Functions
보다 효율적이고 알아보기 쉬운 SQL문을 작성하기 위하여.
1. Single-Row Functions
어떤 테이블에 10개의 Row가 있고 질의문에 조건이 없다면, 10개의 Row 모두에 단일 행 함수가 적용되어 변환된 결과를 반환한다. , 단일 행 함수는 행마다 적용 된다.
1) Number Functions
숫자 데이터 타입의 값을 조작하여 변화된 숫자 값을 반환하는 함수.
1-1) MOD : MOD( m, n )
m n으로 나누었을 때 나머지를 반환 한다.
1-2) ROUND : ROUND( m, n )
m을 소수점 n+1 자리에서 반올림한 결과를 반환 한다.
1-3) WIDTH_BUCKET : WIDTH_BUCKET( expr, min_value, max_value, num_buckets )
어떤 값의 최소에서부터 최대값을 설정하고 bucket을 지정하여 임의의 값이 지정된 범위 내에서 어느 위치에 있는지를 반환 한다.
2) Character Functions
문자 데이터 타입의 값을 조작하여 문자 값을 반환 하는 함수.
2-1) LOWER, UPPER : LOWER( char ), UPPER( char )
입력된 문자 값을 소문자, 대문자로 변환 한다.
2-2) SUBSTR : SUBSTR( string, position, substriong_length )
문자열에서 일부 문자값을 선택적으로 반환 한다.
3) Datetime FunctionsDATE로 지정된 데이터 타입의 값에 적용 하는 함수.
3-1) SYSDATE : SYSDATE
시스템의 설정된 날짜 값을 반환 한다.
3-2) ADD_MONTH : ADD_MONTHS( date, integer )
지정한 날짜 중 해당 월에 정수를 더한 값을 반환 한다.
3-3) LAST_DAY : LAST_DAY( date )
해당하는 월의 마지막 일을 반환 한다.
3-4) MONTHS_BETWEEN : MONTHS_BETWEEN( date1, date2 )
날짜와 날짜 사이의 기간을 월로 나타냅니다.
4) Conversion Functions
4-1) TO_CHAR ( datetime ) : TO_CHAR( datetime, ‘format’ )
DATE 관련 데이터 타입을 VARCHAR2 데이터 타입으로 변환 한다.
SQL > SELECT TO_CHAR( SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’ ) “sysdate”
      FROM dual;
Result > 2011-06-28 11:22:10
FORMAT
D : 요일 번호 (1-7)         DAY : 요일명                DD :  (1-31)               DY : 요일명 약자
HH :  (1-12)               HH24 :  (0-23)            MI :  (0-59)               MM :  (1-12)
MON : 월 이름 약자       MONTH : 월 이름          SS :  (0-59)                YEAR : 년도
YYYY : 4자리 년도
4-2) TO_CHAR ( number ) : TO_CHAR( number, ‘format’ )
NUMBER 타입을 VARCHAR2 데이터 타입으로 변환 한다.
SQL > SELECT TO_CHAR( 20000, ‘$999,999’) “money”
      FROM dual;
Result > $20,000
FORMAT ( 123.45 를 기준 ) : L은 화폐단위, S는 양수나 음수를 표시
999.999 : 123.450                      9999 : 123                   $999.99 : $123.45
L999.99 : \123.45                     S99.999 : +123.45           999,999 : 12,345
5) Miscellaneous Single-Row Functions
5-1) DECODE : DECODE( expr, search, result, default )
expr과 각 search값을 비교하여 같으면 result값을 반환 하고 같지 않다면 default 값을 반환 한다.
SQL > SELECT job_id,
                DECODE(job_id, ‘SA_MAN’, ‘Sales Dept’, ‘SA_REP’, ‘Sales Dept’, ‘Another’) “decode”
      FROM jobs WHERE job_id LIKE ‘S%’;
설명 > job_id S로 시작하는 것 중에서 ‘SA_MAN’ ‘SA_REP’인 경우 ‘Sales Dept’로 표현하고,
      그 이외는 ‘Another’로 나타낸다.
5-2) NVL : NVL( expr1, expr2 )
expr1 NULL값인 경우 expr2의 값을 반환 한다.
2. Aggregate Functions
하나 이상의 행으로부터 하나의 결과를 반환한다.
1) AVG
1-1) AVG( expr )
하나 이상의 값들로부터 평균값을 반환 한다.
1-2) AVG( expr ) OVER( analytical_clause )
분석 함수로 사용된 예.
2) RANK
2-1) RANK( expr ) WITHIN GROUP( ORDER BY expr )
전체 값을 대상으로 각 값의 순위를 반환 한다.
2-2) RANK( ) OVER ( query_partition_clause order_by_clause )
특정 순위가 아닌 전체 순위에 대해 하나하나 알고 싶을 때 사용.
3) SUM, MIN, MAX, COUNT
합계, 최대, 최소, 전체 행의 수를 반환 하는 함수.
3. Analytical Functions
행의 집단에 대해 연산이 이루어진다는 점에서 일반 그룹 함수와 유사하다. 그러나 일반 그룹 함수는 하나의 집단에 대해 하나의 결과가 RETURN 되지만 분석용 함수는 하나의 집단에 대해 여러 가지 기준을 적용해서 여러 개의 결과가 RETURN 될 수 있다.
분석용 함수는 하나의 Query에서 ORDER BY 절 직전에 수행된다. , JOIN, WHERE, GROUP BY, HAVING이 처리된 결과에 대해 분석용 함수가 적용되고 마지막으로 ORDER BY가 수행된다.따라서 분석용 함수는 SELECT절이나 ORDER BY절에만 나타날 수 있다.
Analytic-Function ( <Argument>, <Argument>, … )
OVER ( <Query-Partition-clause> <order-By-Clause> <Windowing-Clause> )
1) FIRST_VALUE : FIRST_VALUE( expr ) OVER ( analytic_clause )
정렬된 값들 중 첫 번째 값을 반환 한다.
2) COUNT : COUNT ( expr ) OVER ( analytic_clause )
조건을 만족하는 행의 수를 반환 한다.
3) SUM : SUM ( expr ) OVER ( analytic_clause )
조건에 만족하는 행의 합을 반환 한다.
4) RANK : RANK( ) OVER ( order_by_clause )
값의 그룹에서 값의 순위를 계산 한다.
5) ROW_NUMBER : ROW_NUMBER( ) OVER ( [query_partition_clause] order_by_clause )
ORDER BY 절에서 지정된 행의 순위 순서로 각 행에 고유한 순서를 1부터 할당 한다.
6) DENSE_RANK : DENSE_RANK( ) OVER ( [query_partition_clause] order_by_clause )
값의 그룹에서 값의 순위를 계산한다. RANK와는 달리 같은 순위가 둘 이상 있어도 다음 순위는1만 증가하여 반환 한다.
4. Regular Expression
Regular Expression Oracle 10g에서 새로 도입된 것이다. 기존 함수의 확장한 새로운 함수를 제공하고 있다.
1) REGEXP_LIKE : REGEXP_LIKE ( srcstr, pattern [,match_option] )
LIKE 연산자와 유사하며, 표현식 패턴을 수행하여, 일치하는 값을 반환 한다.
SQL > SELECT product_name
      FROM oe.product_information
      WHERE REGEXP_LIKE ( product_name, ‘SS[^P]’ );
설명 > 제품의 이름중에 ‘SS’다음에 ‘P’를 포함하지 않는 문자열
2) REGEXP_SUBSTR : REGEXP_SUBSTR ( srcstr, pattern [, position [, occurrence [, match_option ] ] ] )
SUBSTR 함수의 기능을 확장. 주어진 문자 열을 대상으로 정규 표현식 패턴을 수행하여, 일치하는 하위 문자열을 반환.
SQL > SELECT cust_email, REGEXP_SUBSTR( cust_email, ‘[^@]+’ ) “REGEXP_SUBSTR”
      FROM oe.customers
      WHERE nls_territory = ‘SWITZERLAND’;
설명 > 이메일에 저장된 문자열에서 ‘@’이 아닐 때까지 읽어 고객의 아이디만을 얻는다.
3)REGEXP_REPLACE
:REGEXP_REPLACE ( srcstr,pattern [,replacestr [,position [,occurrence [,match_option] ] ] ] )
주어진 문자 열을 대상으로 정규 표현식 패턴을 조사하여, 다른 문자로 대체한다.
SQL > SELECT REGEXP_REPLACE(‘Oracle is  the    information company’, ‘( ){2,}’, ‘ ‘ )
      FROM DUAL;
설명 > 문자열에 공백이 일정하지 않은 경우 두 번째 매개변수 위치에 두 문자 이상의 공백이 발생하는 경우의 의미로 ‘{2,}’로 지정하고 있다. 한 문자의 크기로 일정하게 설정 하기 위해 세번째 매개변수에 ‘ ‘와 같이 지정 하였다.

*** 참조 문헌 : 10g로 시작하는 오라클 SQL & PL/SQL - 3장 SQL 함수를 통해 멋진 질의문 만들기

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...