DB2基本問題總結
² 連接數據庫
db2 => connect to bidb_dev user UID using PASSWORD
C:/ db2 connect to bidb_dev user UID using PASSWORD
要隱藏密碼,就:
C:/ db2 connect to bidb_dev user UID 回車
密碼 回車
² 數據查詢:
1、select * from tableName;
2、表關連:
內連接,外連接
外連接有3種,左關聯,右關聯,完全連接
左關聯,
Select T1.*
FROM CORINFO.RV_ISTRSSTS T1
LEFT OUTER JOIN SESSION.TAB_CUTCOD T2 ON T1.CUT_COD = T2.CUT_COD LEFT OUTER JOIN CORDIM.CM_CRYRAT T3 ON T1.CR_CCY = T3.CRY_NUM AND T1.EYDT = T3.EYDT
LEFT OUTER JOIN SESSION.TAB_BRNCOD T4 ON T1.BRN_NBR = T4.DEP_NBR
完全連接:
Select T1.*
FROM CORINFO.RV_ISTRSSTS T1
FULL OUTER JOIN SESSION.TAB_CUTCOD T2 ON T1.CUT_COD = T2.CUT_COD
3、把表內關連放進where語句,和條件是一樣的
3、在列裏的條件選擇:
select (CASE WHEN T1.EYDT >= v_BeginLastYear
AND T1.EYDT <= v_NowLastYear
AND T1.CR_CCY <> '21'
AND T1.CR_CCY <> '32'
THEN T1.CR_AMT*T3.CON_USD ELSE 0 END) from Tab_Nname ;
Case when 可以嵌套,相當於Oracle 裏的Decode, SqlServer裏也有 Case When用法一樣;他是在數據被查詢出來後,進行計算;
4、只查詢幾行:
有時候需要,只返回一行,或者只需要返回10行,這樣做:
select * from TabName FETCH FIRST 12 ROWS ONLY ; 這樣就會只返回前12行
5、排名:
查詢類似排名,得問題:
SELECT ROW_NUMBER() OVER() AS "排名" from TAB_NAME;
6、爲空字段的處理:
爲空的字段是不能比較的,下面的寫法是錯誤的:
Select * from Tab_name where c1 = NULL;
要用: Select * from Tab_name where c1 is NULL;
如果,要爲空則等於一個默認值的話,可以這樣:
Select case when Cl is NULL then 250 end from TAB_name;
有一個現成的函數供使用:
COALESCE(T1.MOD_NBR,0) 他的含義是,如果T1.MOD_NBR,不爲空,則結果是T1.MOD_NBR,否則爲0;這對於用Sum()函數求和是非常有用的;否則會因爲有一條數據爲空,只是返回的結果,都爲空;因爲任何數 + 空,都是空;
還可以寫成Value(T1.MOD_NBR,0) , 也就是說COALESCE(T1.MOD_NBR,0) = Value(T1.MOD_NBR,0)
但據我個人經驗,這種處理,效率很低,儘量不要用;
² 數據增刪改:
UPDATE TAB_CUTCOD
SET CAL_FLG = 'Y'
WHERE CUT_COD = ‘0’;
INSERT INTO TAB_PRDSGM VALUES('000',-1,0), ('001',20,1), ('002',-3,2);
Delete from TAB_CUTCOD where condition
好像這樣也行:
Delete TAB_CUTCOD where condition
² 表的相關操作:
建表語句:
drop table AdBaseInfo;
Create table AdBaseInfo
(
ADID CHAR(16) NOT NULL,
ACT_SQNO CHAR(5) NOT NULL,
Rctime timestamp default currenttime,
primary key (ADID)
)
IN INDADV
INDEX IN IDX_INDADV
PARTITIONING KEY(ADID); -- 什麼是PARTITION 在講效率問題時講;
comment on table AdBaseInfo is '基本信息表';
comment on column AdBaseInfo.ADID is '標識';
其他選項:
NOT LOGGED – 不記錄日誌,也不能會滾;
刪除表:
Drop Table TableName;
清空表:
DB2,沒有像Oracle等數據庫的Trancat 語句,但可以用C語言寫一個函數,新建一個文件,用空文件,覆蓋掉原有文件,就起到了同樣的效果;
查找存儲過程的源碼:
describe table sysibm.sysPROCEDUREs
select * from sysibm.sysPROCEDUREs where PROCSCHEMA = 'RB_CRM'
² 其他傻瓜問題FAQ:
1、執行文件命令:
例如建表語句,批處理等命令,寫進一個文件,寫好了後,統一執行
2、錯誤編碼的查詢:
數據經常會報錯,但錯誤,之多,你也搞不清楚是什麼錯,這個時候就會用到錯誤碼,
DB2的錯誤碼有2種表達方式:SQLSTATE 和 SQLCODE,他們編碼不同,他們是一一對應的,查詢具體錯誤碼的含義:
例如:SQLSTATE,是 12345 ,SQLCODE是 987
SQLSTATE : C:/> DB2 ? 23505
SQLCODE = -803, C:/> Db2 ? SQL0803 -- 注意前邊加上 SQL,並且補0
9.取當前時間?
SELECT CURRENTTIMESTAMP FROM SYSIBM.SYSDUMMY1
select * from SCHEMA
select emp_no concat emp_nam from db2admin.bsempms;
13、truancate 表:alter table table_name active not logged initially with empty table
14、查看錶空間的使用狀況: list tablespace containers for 你的表空間號 show detail
list tablespace containers for 1 show detail
16、列舉機器的數據源:db2 list user ODBC data sources
17、連接遠程數據庫:
db2 catalog TCPIP NODE runnode remote 99.1.57.23 server 50000
db2 catalog db calldb as calldb2 at node runnode
connect to calldb2 user .. using ..
RUNSTATS ON TABLE <table-name>
ON ALL COLUMNS WITH DISTRIBUTION AND
DETAILED INDEXES ALL
ALLOW READ ACCESS