dbms compare

Edit

출처 : http://blog.naver.com/uxtrazom

1. Data type

Oracle

Datatype 설 명
VARCHAR2(size) size 만큼 2000개까지 문자열 데이터 저장. 가변형.
CHAR(size) size 만큼 255개 문자까지 문자열 데이터 저장. 고정형.
NUMBER 실수형 데이터 저장 NUMBER(p,s)
NUMBER(p,s) 숫자데이터를 저장. p는 최대자리수, s는 소수점 이하 자리수
DATE BC 4712년 1월 1일부터 AD 4712년 12월 31일까지의 날짜를저장
* 기본 날짜 형식은 'DD-MON-YY' 임
LONG 2GB의 문자까지 문자열 데이터를 저장.
비고사항 * CHAR과 VARCHAR2의 사용
- 데이터의 update가 잦은 칼럼은 char형은 씀.
- 한 칼럼에서 고정된 길이의 데이터를 입력할 경우는 char형, 가변형길이의 데이터를 입력할 경우는 varchar를 사용.

MS-SQL

Datatype 설 명
VARCHAR2(size) 가변길이 문자열. 자신의 실제길이로 저장됨.
CHAR(size) 고정 문자열, 최대값은 8000
NCHAR(n) 고정길이 유니코드 문자셋 저장. CHAR는 1바이트를 사용함에비해, NCHAR는 2바이트를 사용. 최대 4000.
NVARCHAR(n) 가변길이 유니코드 문자셋.
TEXT(n) 최대 2GB까지의 고정길이 문자열 저장
NTEXT(n) 큰 가변 길이 문자 데이터 저장. TEXT는 1바이트, NTEXT는 2바이트사용.
INT 정수값 표현. 4바이트.
SMALLINT 정수값 표현. 2바이트(-32768~32767
TINYINT 음이 아닌 정수값 표현. 1바이트(0~255)
DECIMAL(p,[s]) 고정 소수점 값.
NUMBER(p,[s]) DECIMAL과 동의어.
REAL 부동소수점 값
FLOAT[(p)] 부동소수점 값
MONEY 화폐값을 표현 하는 데 사용. 8바이트
SMALLMONEY MONEY와 같지만, 4바이트 사용.
DATETIME 4바이트의 정수값으로 저장되는 DATE와 TIME을 저장.
SMALLDATETIME 2바이트의 정수값으로 저장되는 DATE와 TIME을 저장

Informix

Datatype 설 명
VARCHAR(a,b) 가변길이 문자열. 자신의 실제길이로 저장됨. Max 255
CHAR(size) 고정 문자열, 최대값은 32767 byte
TEXT 최대 2GB까지의 고정길이 문자열 저장 blobspace공간을 만들어저장하는 것이 IO향상됨
Byte 최대 2Gb까지의 바이너리 데이터 저장blobspace공간을 만들어별도로 저장
INT 정수값 표현. 4바이트.
SMALLINT 정수값 표현. 2바이트(-32768~32767
SERIAL 서버에 의해 자동적으로 1씩 증가 내부적 int와 동일
DECIMAL(p,[s]) 고정 소수점 값. ? 숫자형은 모두 decimal로 하는 것이 좋다.엔진에서 decimal로 처리
REAL 부동소수점 값
FLOAT 16자리 부동소수점 값
SMALLFLOTE 8자리 부동 소수점
MONEY 화폐값을 표현 하는 데 사용. Decimal 형태로 저장되며 $와 소수점뒤에 두자리 표시 DBMONY='';export DBMONEY
DATETIME INTERVAL 4바이트의 정수값으로 저장되는 DATE와 TIME을 저장.
DATE 2바이트의 정수값으로 저장되는 DATE만 저장 DBDATE=y4md/;exportDBDATE

SQL3 type

Informix 9.x, oracle 8.x이상 버젼에서 비정형 데이더를저장, 검색하기 위한 확장형 타입과 ORDBMS의 특징인 object type을지원한다.

2. 데이터 저장 공간

3. 테이블 정보 보기 및 sql query tool

Oracle - sqlplus를 이용해서 server에 connection

SELECT * FROM tab;
DESC table_name

MS-SQL

Informix - dbaccess를 이용해서 볼 수 있음.

4. SQL 문 이용 가이드

4.1 NULL

비고 : oracle,Informix 동일

NVL 함수 이용.

NVL(hiredate, '01-JAN-95')
NVL(job, 'FRESH MAN')
NVL(comm, 1000)

권장 사항 : nvl함수를 자주 쓰는 것은 성능에 걸림돌이 될 수 있음.따라서 컬럼에 공백이 들어가지 않도록 하는 것이 성능향상에좋다.table을 생성할 때 default값을 주어 nvl 함수대신 default값을가지고 구분할 수 있도록 한다.

4.2 합성문자

비고 : oracle,Informix 동일

SELECT ename||ename
FROM emp;
SELECT job||' is job of '||ename FROM emp;

4.3 조건절 사용

Oracle

Informix

4.4 함수

Oracle

구문

문자함수

SELECT ename, job, deptno FROM emp WHERE lower(job) ='clerk';

숫자함수

날짜함수

select ename,(sysdate-hiredate)/7 weeks from emp where deptno =20
oder by week;

전환함수

select ename, to_char(hiredate, 'fmDD "of" Month YYYY') start_date from emp
where hiredate like '%87';
-- soctt 19 of April 1987 <- 결과값

그룹함수

그룹함수의 종류

Informix

구분 함수명 구문 설명 Ver.
날자함수 DATE DATE(char1) 비날자형 값을 날자로 변환 ALL
DAY DAY(d1) 날자형값중 일을 구함 ALL
MONTH MONTH(d1) 날자형값중 월을 구함 ALL
WEEKDAY WEEKDAY(d1) 날자형값중 요일을 구함 ALL
YEAR YEAR(d1) 날자형값중 년을 구함 ALL
EXTEND EXTEND(d1 날자형값을 지정한 길이로 조정함 ALL
MDY 비날자형 값을 날자로 변환 ALL
산술함수 ABS ABS(n) n의 절대값 구함 ALL
MOD MOD(m,n) m을 n으로 나눈 나머지 구함 ALL
POW POW(m) 값의 n제곱 구함 ALL
ROOT ROOT(m) 제곱근 구함 ALL
ROUND ROUND(m,n) m의 값을 n자리수 위치 기준으로 반올림 ALL
SQRT ALL
TRUNC TRUNC(m,n) m의 값을 n자리수 위치 기준으로 반올림 ALL
로그함수 EXP ALL
LOGN ALL
LOG10 ALL
삼각함수 SIN SIN 함수 ALL
COS COS 함수 ALL
TAN TAN 함수 ALL
ASIN ALL
ACOS ALL
ATAN ALL
ATAN2 ALL
String 함수 LENGTH LENGTH(char1) Charter 길이 구하기 ALL
TRIM TRIM(char1) 공백 자르기 ALL
집계함수 COUNT COUNT(*) 건수 구하기 ALL
AVG AVG(m) 평균 구하기 ALL
MIN MIN(n) 최소값 구하기 ALL
MAX MAX(m) 최대값 구하기 ALL
SUM SUM(n) 합 구하기 ALL
RANGE RANGE(m) 최대값과 최소값 차 구하기 ALL
STDEV STDEV(n) 표준편차 구하기 ALL
VARIANCE VARIANCE(m) 분산 구하기 ALL
기타함수 DBINFO DBINFO(KEYWORD) ALL
TODAY 오늘날자 ALL
CURRENT 현재 날자+ 시분초 ALL
USER 사용자 이름 ALL
SITENAME HOST명 구하기 ALL
DBSERVERNAME INFORMIXSERVER 명 구하기 ALL
NVL NVL(m,n) m값을 검사 NULL 이면 n값을 Return 7.3Y
DECODE DECODE(c1,a1,A1,b1,B1,c1,C1,D1) Multi-Case 문 7.3Y
CASE SELECT 문에서 CASE 비교 7.3Y
INITCAP INITCAP(char1) 첫글자 대문자 7.3Y
UPPER UPPER(char1) 대문자로 ALL
LOWER LOWER(char1) 소문자로 ALL
REPLACE REPLACE(char1,search_string[,replacement_string]) search_string 의 각 문자를 대응하는 replacement_string 으로치환 . replacement_string이 미지정이면 serach_string 을 제거 7.3Y
SUBSTR SUNSTR(char,m[n] char의 m번째 문자부터 n개의 문자를 취한다 . 7.3Y
LPAD LPAD(char1,n,[char2]) Char1의 왼쪽에 Char2를 덧붇여 전체가 n문자로 되도록한다 .Char2가 미지정이면 blank 적용 7.3Y
RPAD RPAD(char1,n,[char2]) Char1의 오른쪽에 Char2를 덧붇여 전체가 n문자로 되도록한다 .Char2가 미지정이면 blank 적용 7.3Y
SPL로 제공되는 함수 CEIL n 보다 크거나 같은 최소 정수
NEXT_DAY

4.5 Having절의 사용

Having 절에 조건을 줌으로서 그룹을 제한할 수 있다.

예) job이 vp로 시작하지 않는 사람들을 job별로 급여의 합계를구한다음 급여합계가 5000이상인 job과 그 합계를 구하라.

Select job,sum(sal) payroll from emp
Where job not like 'VP%' Group by job having sum(sal) >5000;

4.6 JOIN

Join을 쓰는 목적은 Cartesian product를 막고 정규화 된 테이블 간데이터를 가져올 때.

오라클

  1. equi join
    • join시 table alias를 주어서 쓰는 것이속도 향상에 좋음.
  2. non-equijoin
  3. self join
    • 같은 테이블에 대해 두개의 가명을줌.
  4. outer join : 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해
    • outer join의 연산자는 (+)를 붙임..모자라는 곳에 붙임..in 명령어 사용 못함.

SQL은 inner,outer join이라고명령을 써준다.

4.7 SubQuery

SELECT select_list
FROM tables
WHERE expr operator (SELECT select_list FROM table);

오라클은 where 조건절 및 from절에도 subquery ( inline View )를실행할 수 있지만 informix는 inline view가 지원되지 않는다.

4.8 HINT 사용

Informix

-- 1.
select --+ index(esalary_index) name,salary from emp e
where e.dno=1 and e.salary >50000;

-- 2.
select {+ avoid_full(e), index(esalary_indx) } name, salary
where e.dno = 1 and e.salary >50000;

-- 3.
select --+ ORDEREDname,title,dept
from dept,job,emp where title = 'aaa'and emp.dno = dept.dno;

-- 4.
select --+ first_rows name,age from employee e,department
where e.dept_no = d.dept_no;

4.9 ROWID

Select rowid,ename from emp;

4.10 ROWNUM

오라클

예) 사원중 급여를 적게 받는 사람 순서대로 다섯명을 나타내라.

select ename,sal from ( select ename, sal from emp group by sal,ename)
where rownum <= 5;

subquery에서는 order by를 쓸 수없으므로 같은 역할을 하는 group by를 이용

Informix

자체적인 함수가 제공되지 않는다.하지만 Informix ius 9.x버전부터 지원되는 UDF (user definefunction)을 만들어 활용할 수 있음.

SQL : top n [percent]구문

select top 4 with ties employeeID, LastName, HireDate
from Employees order by hiredate desc

4.11 테이블 생성

ansi 표준으로 만드는 것이 좋음.

Oracle: subquery를 이용한 테이블 생성방법

create table emp_20 AS select empno,emame,hiredate,job
from emp where deptno = 20; -- 데이터 까지 복제..

Informix :

테이블을 DataBase가 저장된 space외에 다른 space에 생성할 수 있을뿐만 아니라 컬럼까지도 다른 space에 저장할 수 있다.

create table aaa ( a int, b char(10) in space2);

성능 향상 법 : 모든 DBMS에서 테이블을 생성시 테이블 저장량을예측하여, extend size 및 저장할 곳을 적절히 분산하여 생성해야 한다.또한 index 저장 할 곳도 각 DBMS성격에 맞게 구축해야 한다.

테이블이 대용량일 경우는 분할 하여 저장하는 것이 좋다.

분할 방법 :

  1. round robin방법 : 컬럼이 insert시 dbs1,dbs2,dbs3에 순차적으로저장
create table rtable ( col_1 int,cal_2 char(20) )
fragment by round robin in dbs1,dbs2,dbs3
extent size 10000 next size 3000;
  1. expression 방법 : 조건을 주어 조건에 맞는 space에 저장
create table rtable ( col_1 int,cal_2 char(20) )
fragment by expression
col_1 <=100 and col_1 >=1 in dbs1
col_1 <=200 and col_1 > 100 in dbs2
remainder in dbs3 ;
  1. hash 방법 : DBMS의 function을 이용해 space에 저장
create table rtable ( col_1 int,cal_2 char(20) )
fragment by expression
mod(col_1,3) = 0 in dbs1
mod(col_1,3) = 1 in dbs2
mod(col_1,3) = 2 in dbs3 ;

4.12 인덱스 생성 조건

4.13 시스템 권한

Oracle

권한부여

CREATE USER user_name IDENTIFIED BY password;
ALTER USER user_name IDENTIFIED BY password;
GRANT privilege [,privilege,....] TO user_name [, user....];

Role

CREATE ROLE role_name;
grant create table,create view to man;
grant man to kim

권한 회수

Informix

SQL

4.14 load, unload

UNLOAD

UNLOAD TO 파일명 SELECT 문
-- 예)
unload to 'new_cust' select * from customer where customer_num > 120;

LOAD

LOAD FROM 파일명 INSERT문
-- 예)
load from 'new_cust' insert into customer;
121|a|b|c|d|
122|aa|bb|cc|dd|

Children