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