<pre code_snippet_id="276051" snippet_file_name="blog_20140407_7_6289192" name="code" class="html">
-----
1:将excel中的数据导入到数据库中
先将excel保存为csv格式,然后运行如下命令
import from "f:\ls2.csv" OF DEL messages "c:\msg.out" INSERT INTO user(USERID,USERCODE,USERNAME,BRID,SUSERLEVEL,LASTCHECK,PACTBEGINYM,PACTENDYM,CERTFLAG,CERTTYPE,HOMEPHONE)
上面运行的时候有点错,下面为运行出来的
----
db2 => import FROM "D:\IFS_USER.csv" OF DEL INSERT INTO IFS_USER2(USERID,U
SERNAME,BRID,SUBBANKID,ROLEID,STAID,POSITION,DEPARTMENT,MOBILEPHONE,OFFICEPHONE,
SEX,EDUCATION,UNIVERSITY,SPECIALTY,USERLEVEL,CERTFLAG,CERTTYPE,QUALITYFLAG)
SQL3109N 实用程序开始装入文件 "D:\IFS_USER.csv" 中的数据。
SQL3125W 在行 "130" 列 "5" 中的字符数据被截断,因为该数据比目标数据库列更长。
SQL3125W 在行 "151" 列 "5" 中的字符数据被截断,因为该数据比目标数据库列更长。
SQL3125W 在行 "152" 列 "5" 中的址荼唤囟希蛭檬荼饶勘晔菘饬懈ぁ?
SQL3125W 在行 "940" 列 "15" 中的字符数据被截断,因为该数据比目标数据库列更长。
如何快速删除大批量的数据表(test为数据库表)
最常用也是最多人用的语句:delete from test,但这种做法,效率比较低,花费时间太长,因为在删除数据时,要记数据库日志。
import from /dev/null of del replace into test//先清空,再导入数据(由于导入的文件为空,故相当于清空表数据),这种删除的速度较快
ALTER TABLE test activate NOT LOGGED initially WITH EMPTY TABLE ;删除表中的数据,不记日志,这种处理最快
select * from "SYSIBM"."SYSTABLES" where lower(name) ='afa_maintransdtl'
db2 “connect to afa”
db2 “get snapshot for locks on 实例名”
db2 “terminate”
然后查看相关信息,找到被锁定的表,执行以下语句:
db2 “force application(application handle) 注:application handle对应的是一个整数
6.在服务器上创建存储过程时:
应为存储过程指定特定的换行符,然后执行下面的语句:
db2 -td@ -vf fileName.sql (其中@为存储过程中指定的换行符)
runstats on table afa.yj_jywtk with distribution and detailed indexes all;
db2 "connect to 实例名"
db2 "update monitor switches using lock ON sort ON bufferpool ON uow ON table ON statement ON"
db2 "get snapshot for all on 实例名"
select procname,text from sysibm.sysprocedures;
locate('y','xyz')
查找'y'在'xyz'中的位置。
days(date('2007-03-01'))-days(date('2007-02-28'))
days 返回的是从 0001-01-01 开始计算的天数
create alias tableName for 实例名. tableName
describe table tableName
or
describe select * from table_name
restart database database_name
activate database database_name
deactivate database database_name
rename table_old to table_new
create sequence orderseq start with 1 increment by 1 no maxvalue no cycle cache24
describe indexes for table tableName show detail
db2 "export to fileName.del of del select * from tableName" //db2中把表中的数据导入到文件
db2 "import from fileName.del of del insert into tableName " //db2中把文件中的数据导入到表
select * from ifs_custshare fetch first 2 rows only
select * from (
select ROW_NUMBER() OVER(ORDER BY RIGHTFLAG DESC) AS ROWNUM,t.* from ifs_custshare t) a
where ROWNUM > 1 and ROWNUM <=3
添加列名:
SELECT ROW_NUMBER() OVER(order by TABNAME) rownum, TABNAME FROM SYSCAT.TABLES
但是这样使用会报错:
SELECT ROW_NUMBER() OVER(order by TABNAME) rownum, TABNAME FROM SYSCAT.TABLES where rownum >2 and rownum <6
SQL0206N "ROWNUM" 在使用它的上下文中无效。 SQLSTATE=42703
SELECT
CATALOG_ID, CATGROUP_ID, CATENTRY_ID, ROW_NUMBER() OVER (PARTITION
BY
CATALOG_ID, CATGROUP_ID
ORDER
BY
CATENTRY_ID
ASC
)
AS
ROWNUM
FROM
CATGPENREL
SELECT ROW_NUMBER() OVER(ORDER BY SALARY) AS 序号, NAME AS 姓名, DEPT AS 部门, SALARY AS 工资 FROM ( --姓名 部门 工资 VALUES ('张三','市场部',4000), ('赵红','技术部',2000), ('李四','市场部',5000), ('李白','技术部',5000), ('王五','市场部',NULL), ('王蓝','技术部',4000) ) AS EMPLOY(NAME,DEPT,SALARY); 查询结果如下: 序号 姓名 部门 工资 1 赵红 技术部 2000 2 张三 市场部 4000 3 王蓝 技术部 4000 4 李四 市场部 5000 5 李白 技术部 5000 6 王五 市场部 (null)
看到上面的ROW_NUMBER() OVER()了吗?很多人非常不理解,怎么两个函数能这么写呢?甚至有人怀疑上面的SQL语句是不是真的能执行。其实,ROW_NUMBER是个函数没错,它的作用从它的名字也可以看出来,就是给查询结果集编号。但是,OVER并不是一个函数,而是一个表达式,它的作用是定义一个作用域(或者可以说是结果集),OVER前面的函数只对OVER定义的结果集起作用。怎么样,不明白?没关系,我们后面还会详细介绍。
从上面的SQL我们可以看出,典型的 DB2 在线分析处理的格式包括两部分:函数部分和OVER表达式部分。那么,函数部分可以有哪些函数呢?如下:
ROW_NUMBER RANK DENSE_RANK FIRST_VALUE LAST_VALUE LAG LEAD COUNT MIN MAX AVG SUM
上面这些函数的作用,我会在后面逐步给大家介绍,大家可以根据函数名猜测一下函数的作用。
假设我想在不改变上面语句的查询结果的情况下,追加对部门员工的平均工资和全体员工的平均工资的查询,怎么办呢?用通常的SQL很难查询,但是用OLAP函数则非常简单,如下SQL所示:
SELECT ROW_NUMBER() OVER() AS 序号, ROW_NUMBER() OVER(PARTITION BY DEPT ORDER BY SALARY) AS 部门序号, NAME AS 姓名, DEPT AS 部门, SALARY AS 工资, AVG(SALARY) OVER(PARTITION BY DEPT) AS 部门平均工资, AVG(SALARY) OVER() AS 全员平均工资 FROM ( --姓名 部门 工资 VALUES ('张三','市场部',4000), ('赵红','技术部',2000), ('李四','市场部',5000), ('李白','技术部',5000), ('王五','市场部',NULL), ('王蓝','技术部',4000) ) AS EMPLOY(NAME,DEPT,SALARY)
查询结果如下: 序号 部门序号 姓名 部门 工资 部门平均工资 全员平均工资 1 1 张三 市场部 4000 4500 4000 2 2 李四 市场部 5000 4500 4000 3 3 王五 市场部 (null) 4500 4000 4 1 赵红 技术部 2000 3666 4000 5 2 王蓝 技术部 4000 3666 4000 6 3 李白 技术部 5000 3666 4000
请注意序号和部门序号之间的区别,我们在查询部门序号的时候,在OVER表达式中多了两个子句,分别是PARTITION BY 和ORDER BY。它们有什么作用呢?在介绍它们的作用之前,我们先来回顾一下OVER的作用,还记得吗?
OVER是一个表达式,它的作用是定义一个作用域(或者可以说是结果集),OVER前面的函数只对OVER定义的结果集起作用。
ORDER BY的作用大家应该非常熟悉,用来对结果集排序。PARTITION BY的作用其实也很简单,和GROUP BY 的作用相同,用来对结果集分组。
到此为止,大家应该对OLAP函数的套路有一定的了解和体会了吧。大家看一下上面SQL的结果集,发现王五的工资是null,当我们按工资排序时,null被放到最后,我们想把null放在前边该怎么办呢?使用NULLS FIRST关键字即可,默认是NULLS LAST,请看下面的SQL:
SELECT ROW_NUMBER() OVER(ORDER BY SALARY desc NULLS FIRST) AS RN, RANK() OVER(ORDER BY SALARY desc NULLS FIRST) AS RK, DENSE_RANK() OVER(ORDER BY SALARY desc NULLS FIRST) AS D_RK, NAME AS 姓名, DEPT AS 部门, SALARY AS 工资 FROM ( --姓名 部门 工资 VALUES ('张三','市场部',4000), ('赵红','技术部',2000), ('李四','市场部',5000), ('李白','技术部',5000), ('王五','市场部',NULL), ('王蓝','技术部',4000) ) AS EMPLOY(NAME,DEPT,SALARY); 查询结果如下: RN RK D_RK 姓名 部门 工资 1 1 1 王五 市场部 (null) 2 2 2 李四 市场部 5000 3 2 2 李白 技术部 5000 4 4 3 张三 市场部 4000 5 4 3 王蓝 技术部 4000 6 6 4 赵红 技术部 2000
请注意ROW_NUMBER和RANK之间的区别,RANK是等级,排名的意思,李四和李白的工资都是5000,他们并列排名第二。张三和王蓝的工资都是4000,怎么RANK函数的排名是第四,而DENSE_RANK的排名是第三呢?这正是这两个函数之间的区别。由于有两个第二名,所以RANK函数默认没有第三名。
现在又有个新问题,假设让你查询一下每个员工的工资以及工资小于他的所有员工的平均工资,该怎么办呢?怎么?没听明白问题?不要紧,请看下面的SQL:
CREATE TABLE IFS_CUSTSHARE ( CUSTID VARCHAR(23) NOT NULL , OWNERID VARCHAR(23) NOT NULL , BRID VARCHAR(23) , SUBBANKID VARCHAR(23) , RIGHTFLAG VARCHAR(6) ) SELECT NAME AS 姓名, SALARY AS 工资, SUM(SALARY) OVER(ORDER BY SALARY NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 小于本人工资的总额, SUM(SALARY) OVER(ORDER BY SALARY NULLS FIRST ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS 大于本人工资的总额, SUM(SALARY) OVER(ORDER BY SALARY NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS 工资总额1, SUM(SALARY) OVER() AS 工资总额2 FROM ( --姓名 部门 工资 VALUES ('张三','市场部',4000), ('赵红','技术部',2000), ('李四','市场部',5000), ('李白','技术部',5000), ('王五','市场部',NULL), ('王蓝','技术部',4000) ) AS EMPLOY(NAME,DEPT,SALARY);
查询结果如下: 姓名 工资 小于本人工资的总额 大于本人工资的总额 工资总额1 工资总额2 王五 (null) (null) 20000 20000 20000 赵红 2000 2000 20000 20000 20000 张三 4000 6000 18000 20000 20000 王蓝 4000 10000 14000 20000 20000 李四 5000 15000 10000 20000 20000 李白 5000 20000 5000 20000 20000
上面SQL 中的OVER部分出现了一个ROWS子句,我们先来看一下ROWS子句的结构:
RANGE BETWEEN <上限条件> AND <下限条件>
其中的<上限条件> 、<下限条件>和ROWS一模一样,如下的SQL演示它们之间的区别:
SELECT NAME AS 姓名, DEPT AS 部门, SALARY AS 工资, FIRST_VALUE(SALARY, 'IGNORE NULLS') OVER(PARTITION BY DEPT) AS 部门最低工资, LAST_VALUE(SALARY, 'RESPECT NULLS') OVER(PARTITION BY DEPT) AS 部门最高工资, SUM(SALARY) OVER(ORDER BY SALARY ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS ROWS, SUM(SALARY) OVER(ORDER BY SALARY RANGE BETWEEN 500 PRECEDING AND 500 FOLLOWING) AS RANGE FROM ( --姓名 部门 工资 VALUES ('张三','市场部',2000), ('赵红','技术部',2400), ('李四','市场部',3000), ('李白','技术部',3200), ('王五','市场部',4000), ('王蓝','技术部',5000) ) AS EMPLOY(NAME,DEPT,SALARY); 查询结果如下: 姓名 部门 工资 部门最低工资 部门最高工资 ROWS RANGE 张三 市场部 2000 2000 4000 4400 4400 赵红 技术部 2400 2400 5000 7400 4400 李四 市场部 3000 2000 4000 8600 6200 李白 技术部 3200 2400 5000 10200 6200 王五 市场部 4000 2000 4000 12200 4000 王蓝 技术部 5000 2400 5000 9000 5000
上面的SQL 还用到了FIRST_VALUE和LAST_VALUE两个函数,它们的作用也非常简单,用来求OVER 定义集合的最小值和最大值。值得注意的是这两个函数有个参数,'IGNORE NULLS' 或 'RESPECT NULLS',它们的作用正如它们的名字一样,用来忽略NULL值和考虑NULL值。
还有两个函数我们没有介绍,LAG和LEAD,这两个函数的功能非常强大,请看下面SQL:
SELECT NAME AS 姓名, SALARY AS 工资, LAG(SALARY,0) OVER(ORDER BY SALARY) AS LAG0, LAG(SALARY) OVER(ORDER BY SALARY) AS LAG1, LAG(SALARY,2) OVER(ORDER BY SALARY) AS LAG2, LAG(SALARY,3,0,'IGNORE NULLS') OVER(ORDER BY SALARY) AS LAG3, LAG(SALARY,4,-1,'RESPECT NULLS') OVER(ORDER BY SALARY) AS LAG4, LEAD(SALARY) OVER(ORDER BY SALARY) AS LEAD FROM ( --姓名 部门 工资 VALUES ('张三','市场部',2000), ('赵红','技术部',2400), ('李四','市场部',3000), ('李白','技术部',3200), ('王五','市场部',4000), ('王蓝','技术部',5000) ) AS EMPLOY(NAME,DEPT,SALARY); 查询结果如下: 姓名 工资 LAG0 LAG1 LAG2 LAG3 LAG4 LEAD 张三 2000 2000 (null) (null) 0 -1 2400 赵红 2400 2400 2000 (null) 0 -1 3000 李四 3000 3000 2400 2000 0 -1 3200 李白 3200 3200 3000 2400 2000 -1 4000 王五 4000 4000 3200 3000 2400 2000 5000 王蓝 5000 5000 4000 3200 3000 2400 (null)
我们先来看一下LAG 和 LEAD 函数的声明,如下:
LAG(表达式或字段, 偏移量, 默认值, IGNORE NULLS或RESPECT NULLS)
LAG是向下偏移,LEAD是想上偏移,大家看一下上面SQL的查询结果就一目了然了。
到此为止,有关DB2 OLAP 函数的所有知识都介绍给大家了,下面我们再次回顾一下 DB2 在线分析处理 的组成部分,如下:
函数 OVER(PARTITION BY 子句 ORDER BY 子句 ROWS或RANGE子句)
要想熟练掌握这些知识还需要一定的时间和练习,一旦你掌握了,你将拥有一项绝世武学,可以纵横DB2。