DB2 FAQ

2008. 11. 8. 17:45Database

출처 : http://blog.daum.net/baby4rang/11664789

 

A.1 버전 문제가 아니라 command를 잘못치셨어요. 아래에서 어떤 분이 말씀하신대로 sql0104에러는 명령문을 잘못쳤을 때 나온답니다. 다음과 같이 입력하시면 됩니다..ALTER TABLE STORE ALTER column SND_FN SET DATA TYPE VARCHAR (11).즉, alter column 이라고 입력하셔야 되는데 column이 빠졌네요.

잠깐!
ALTER TABLE tablename ALTER COLUMN [column-alteration]

[column-alteration]
column-name SET DATA TYPE VARCHAR(integer)
CHARACTER VARYING
CHAR VARYING

1. Fixpak3 (3/98)에 도입됨.

2. 기존의 VARCHAR 컬럼의 길이를 증가함.

3. integer 값은 4000까지 사용함.

4. 컬럼의 변경은 모든 컬럼의 총 Byte수가 Page Size의 최대 Record Size를 초과해서는 안됨. (SQLSTATE 54010)

5. 만약 컬럼이 Unique Constraint 또는 Index에 사용되는 경우, 새로운 Size는 Unique Constraint 또는 Index의 컬럼들의 길이의 합계가 1024 Byte를 초과 해서는 안됨. (SQLSTATE 54008)
참고로, DB2 UDB for OS/390은 254 Byte, DB2 for OS/400은 2000 Byte,
   Oracle 7.3은 255 Byte, SQL Server 7은 900 Byte, Sybase 10은 256 Byte,
   Informix 7.2는 120 Byte를 초과해서는 안됨

A.2 DATE 타입은 년, 월, 일 세부분 값으로 정의됩니다.. -> 1991-10-27
따라서 insert into test (BirthDay) values ( 1972-05-10 ) 하시면 됩니다...


A.3
DB2에는 except, except all 라는 기능이 있습니다. EXCEPT 연산자는 TABLE2가 아니라 TABLE1에 있는 모든 행을 포함하고 모든 중복 행을 제거함으로써 결과 테이블을 끌어냅니다. EXCEPT와 ALL을 같이 사용하면(EXCEPT ALL), 중복 행은 제거되지 않습니다

Except : A에는 있고 B에는 없는 것. 중복된 것이 제거됩니다.
Except All : Except와 동일하나 중복된 것이 포함됩니다.

SELECT ID, NAME FROM STAFF WHERE SALARY > 21000
EXCEPT
SELECT ID, NAME FROM STAFF WHERE JOB='Mgr' AND YEARS < 8

이렇게 하면 $21,000 이상의 급여를 받으나 관리자가 아니고
8년 이상 근무한 모든 직원의 이름을
리턴합니다.


A.4
full outer join을 하면 퍼포먼스에 많은 영향을 주어서 잘 사용하지는 않지만 사용하시려면, select A.col1, A.col2, B.col3, B.col4, C.col5, C.Col6 from A full outer join B on A.col1 = B.col1 full outer join C on A.col2= C.col5 물론 조인 순서라든가 조인 컬럼등에 대해 명확하게 명시 하셔야 겠죠


A.5
db2 "select * from 테이블명 where 날짜컬럼명 > current date - 30 day 위가 같이 해보시기 바랍니다.


A.6
컬럼의 Not NULL 옵션의 경우는 나중에 수정이 불가능 합니다.
테이블을 만드시면서

CREATE TABLE PERS (ID SMALLINT NOT NULL,
      NAME VARCHAR(9),
      DEPT SMALLINT WITH DEFAULT 10)

와 같이 정의해 주시면 됩니다.


A.7
아래와 같이 하시면 됩니다..
select count(*) cnt,
case when SUBSTR(PEOPNO, 7, 1) = '1'
Then 'MAN'
when SUBSTR(PEOPNO, 7, 1) = '2'
Then 'WOMAN'
end MW
from 테이블명
group by
case
when SUBSTR(PEOPNO, 7, 1) = '1'
Then 'MAN'
when SUBSTR(PEOPNO, 7, 1) = '2'
Then 'WOMAN'
end


A.8
1. MS-SQL에서 사용하시던 syntax를 바로 사용하실 순 없습니다. 동일한 결과를 얻기 위해서는 다음과 같은 구문을 사용하십시오. select * from Some Table ......... fetch first 10 rows only

2. [시작]-[프로그램]-[IBM DB2]-[정보] 밑에 정보센터에 가시면 온라인 메뉴얼과 각종 서적들을 보실 수 있습니다.

3. 테이블 생성 이후 제어 센터에서 '변경'으로 컬럼명을 바꾸실 수 없습니다.

4. DB2는 v7 부터 사용자에게 테이블에서 각 행에 대해 고유 숫자 값을 생성하도록 합니다. 예를 들어, ID 컬럼은 고유한 기본 키 값 생성에 사용될 수 있습니다. 사용자는 다른 RDBMS 벤 더에서 DB2로 ID 컬럼을 사용하는 응용프로그램을 이동시킬 수도 있습니다. DB2 UDB v6 에서는 identity column을 만드는 것이 불가능합니다. row 수를 알고 싶으시면 count function을 사용하시면 됩니다.
ex) db2 select count(*) from table_name

잠깐!
FETCH SIZE

1. 리턴되는 데이타의 양에 제한을 둠.

2. 좀더 효과적인 액세스 방법을 사용함으로써, 성능을 향상시킴.

3. FETCH FIRST k ROWS ONLY - Fixpak3 (3/98)에 도입됨.
- 추출할 Row의 최대값을 설정.
- k Row이상의 수는 추출되지 않슴.
- OPTIMIZE FOR n ROWS가 없는 경우, Result Table의 모든 Row가 추출 되는 것으로 가정됨. 만약 지정하는 경우, 추출한 Row의 수가 n을 초과하지 않을 것이라고 가정함. n은 Blocked Cursor의 성능을 향상시키기 위해 Communication Buffer Size의 적당한 값을 결정함. 그러나 이절은 Fetch될 Row의 수를 제한하지는 않으며, OPTIMIZER FOR n ROWS는 n Row의 수 이상을 추출 하지 않는 다면, 성능을 향상시킬 수 있고, n Row의 수 이상을 추출한다면, 성능을 저하시킴.
- k값이 크고, n Row 다음에 대해서는 느려질수 있다 하지만 처음 n Row를 빠르게 가져오고자 하는 경우, 두 값을 지정함. Communication Buffer는 n과 k보다 더 작은 값을 기준으로 생성됨. 4. (예)
SELECT EMPNAME, SALARY FROM EMPLOYEE
ORDER BY SALARY DESC
FETCH FIRST 100 ROWS ONLY
OPTIMIZE FOR 20 ROWS

[출처] db2 간단 FAQ|작성자 좋은생각