加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

DB2常用命令及MERGE INTO语句的使用

(2013-05-15 13:10:37)
标签:

db2

merge

into

it

连接数据库: connect to <</span>表名> user <</span>用户名> using <</span>密码>

中断数据库连接: disconnect <</span>表名>

显示当前用户所有表: list tables

显示当前活动数据库: list active databases

表空间: list tablespaces

转换数据类型: SELECT EMPNO, CAST(RESUME AS VARCHAR(370)) FROM EMP_RESUME

检查DB2数据库管理程序配置: get dbm cfg

强迫所有应用断开数据库连接: force application all

备份数据库: backup db

还原数据库: restore db

catalog命令:

catalog tcpip node <</span>接点名称> remote <</span>远程数据库地址> server <</span>端口号 --把远程数据库映射到本地接点一般为50000

catalog db <</span>远程数据库名称> as <</span>接点名称> at node PUB11  --远程数据库名称到本地接点

connect to <</span>接点名称> user <</span>用户名> using <</span>密码 --连接本地接点访问远程数据库

查看表结构: describe table <</span>表名>

列出所有数据库: list db directory

CLP执行操作系统命令时在命令前加"!"作为前缀: !dir c:\

显示命令信息: ? command    显示SQLCODE的解释信息: ? SQLnnnn     显示DB2错误的解释信息: ? DB2nnnn

如何查看表的约束: select * from syscat.checks where name = <</a>表名>

查找数据库中最耗时的 SQL 语句:
SELECT stmt_text, total_exec_time, num_executions 
FROM TABLE( SNAPSHOT_DYN_SQL('DB_NAME', -1)) as dynSnapTab
ORDER BY total_exec_time desc
FETCH FIRST 1 ROW ONLY
平均执行时间最长的五条 SQL 语句:
SELECT stmt_text, 
CASE WHEN num_executions = 0
THEN 0
ELSE (total_exec_time / num_executions)
END avgExecTime,
num_executions
FROM TABLE( SNAPSHOT_DYN_SQL('DB_NAME', -1)) as dynSnapTab
ORDER BY avgExecTime desc
FETCH FIRST 5 ROWS ONLY

 

DB2 MERGE INTO 语句的使用

DB2 Merge语句的作用非常强大,它可以将一个表中的数据合并到另一个表中,在合并的同时可以进行插入、删除、更新等操作。我们还是先来看个简单的例子吧,假设你定义了一个雇员表(employe),一个经理表(manager),如下所示:

---雇员表(EMPLOYE   
CREATE TABLE EMPLOYE (   
EMPLOYEID INTEGER NOT NULL,---
员工号   
NAME VARCHAR(20) NOT NULL,---
姓名   
SALARY DOUBLE---
薪水   
);   
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES    
(1,'
张三',1000),   
(2,'
李四',2000),   
(3,'
王五',3000),   
(4,'
赵六',4000),   
(5,'
高七',5000);   
--
经理表(MANAGER   
CREATE TABLE MANAGER (   
EMPLOYEID INTEGER NOT NULL,---
经理号   
NAME VARCHAR(20) NOT NULL,---
姓名   
SALARY DOUBLE---
薪水   
);   
INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES    
(3,'
王五',5000),   
(4,'
赵六',6000); 
---
雇员表(EMPLOYE
CREATE TABLE EMPLOYE (
EMPLOYEID INTEGER NOT NULL,---
员工号
NAME VARCHAR(20) NOT NULL,---
姓名
SALARY DOUBLE---
薪水
);
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES 
(1,'
张三',1000),
(2,'
李四',2000),
(3,'
王五',3000),
(4,'
赵六',4000),
(5,'
高七',5000);
--
经理表(MANAGER
CREATE TABLE MANAGER (
EMPLOYEID INTEGER NOT NULL,---
经理号
NAME VARCHAR(20) NOT NULL,---
姓名
SALARY DOUBLE---
薪水
);
INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES 
(3,'
王五',5000),
(4,'
赵六',6000);

经过一段时间,你发现这样的数据模型,或者说表结构设计简直就是一大败笔,经理和雇员都是员工嘛,为什么要设计两个表呢?发现错误后就需要改正,所以你决定,删除经理表(MANAGER)表,将MANAGER 表中的数据合并到EMPLOYE 表中,仔细分析发现,王五在两个表中都存在(可能是干的好升官了),而刘八在EMPLOYE 表中并不存在,现在,我们要求把EMPLOYE 表中不存在的MANAGER都插入到EMPLOYE 表中,存在的更新薪水。该怎么办呢?这个问题并不难,通常,我们可以分两步,如下所示:

--更新存在的   
UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID)   
WHERE EMPLOYEID IN (   
SELECT MANAGERID FROM MANAGER   
);   
---
插入不存在的   
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY)   
SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN (   
SELECT EMPLOYEID FROM EMPLOYE   
); 
--
更新存在的
UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID)
WHERE EMPLOYEID IN (
SELECT MANAGERID FROM MANAGER
);
---
插入不存在的
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY)
SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN (
SELECT EMPLOYEID FROM EMPLOYE
);

上面的处理是可以的,但是我们还可以有更简单的方法,就是用Merge语句,如下所示:

MERGE INTO EMPLOYE AS EM   
USING MANAGER AS MA   
ON EM.EMPLOYEID=MA.MANAGERID   
WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY   
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); 
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EM.EMPLOYEID=MA.MANAGERID
WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);

在上面的处理中,我们用经理表(MANAGER)的薪水更新了雇员表(EMPLOYE)的薪水,假设现在要求,如果经理表(MANAGER)的薪水>雇员表(EMPLOYE)的薪水的时候更新,否则不更新,怎么办呢?如下:

MERGE INTO EMPLOYE AS EM   
USING MANAGER AS MA   
ON EM.EMPLOYEID=MA.MANAGERID   
WHEN MATCHED AND EM.SALARY
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); 
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EM.EMPLOYEID=MA.MANAGERID
WHEN MATCHED AND EM.SALARY
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);

不仔细的朋友可能没有看出上面两条语句的区别,哈哈,请仔细对比一下这两条语句。上面的语句中多了ELSE IGNORE语句,它的意思正如它英文的意思,其它情况忽略不处理。如果你认为理论上应该不存在EM.SALARY>MA.SALARY的数据,如果有,说明有问题,你想抛个异常,怎么办?如下:

MERGE INTO EMPLOYE AS EM   
USING MANAGER AS MA   
ON EM.EMPLOYEID=MA.MANAGERID   
WHEN MATCHED AND EM.SALARY
WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY' 
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)   
ELSE IGNORE; 
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EM.EMPLOYEID=MA.MANAGERID
WHEN MATCHED AND EM.SALARY
WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY'
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
ELSE IGNORE;

对于EM.SALARY>MA.SALARY的情况,如果你不想抛异常,而是删除EMPLOYE中的数据,怎么办?如下:

MERGE INTO EMPLOYE AS EM   
USING MANAGER AS MA   
ON EM.EMPLOYEID=MA.MANAGERID   
WHEN MATCHED AND EM.SALARY
WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE   
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)   
ELSE IGNORE; 
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EM.EMPLOYEID=MA.MANAGERID
WHEN MATCHED AND EM.SALARY
WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
ELSE IGNORE;

以上简单介绍了Merge语句的使用,它的应用不只是上面介绍的情况,其实它可以应用在很多其他语句不好处理情况,这需要你去发现,记住熟能生巧

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有