Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103775491
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775493
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775496
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775498
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775485
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775502
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775503
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775505
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775507
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775509
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775511
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775513
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775500
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775502
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775504
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775506
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775508
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775510
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775512
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775504
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775516
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775517
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775520
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775522
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775524
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775526
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775519
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775532
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775535
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775538
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775541
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775534
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775549
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775552
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775554
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775557
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775545
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775563
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775565
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775568
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775572
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775560
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775564
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775567
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775570
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775572
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775560
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775578
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775581
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775584
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775587
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks

DB2 9 应用开发(733 考试)认证指南,第 2 部分: DB2 数据操纵(2)-sdccf-ChinaUnix博客
  • 博客访问: 103775575
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-31 23:16:43

学习基本概念

developerWorks



更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133703) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133702) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133701) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133700) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133698) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133696) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133694) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133693) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133692) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133691) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133690) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133689) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133688) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133687) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133686) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133685) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133684) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133683) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133682) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133681) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133680) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133679) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133678) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133677) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133676) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133675) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133673) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133672) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133669) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133668) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133664) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133662) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133661) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133660) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133656) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133655) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133653) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


更改和访问数据

当设计一个数据库应用程序时,数据更改是需要理解的一个关键过程。它取决于以下几个因素:

  • 数据模型和元数据(必须处理什么样的编目数据、类型、限制和检查?)
  • 业务需求(需要如何识别和修改数据库中的数据?)
  • 用户、表和列级别上的权限和安全性(特定的更改是否被允许?)
  • 访问数据的接口(如何与更改的数据进行交互?)

在应用程序的设计中,应该使用 DB2 的哪些功能?用户是不能修改系统编目数据的。编目表和视图存储关于数据的逻辑和物理定义的元数据。SYSIBM 模式中包含一些表,而这些表的视图则属于 SYSCAT 模式。通过查询编目,可以获得有用的信息。为了做出恰当的选择,需要同时考虑应用程序的数据库设计和目标环境。例如,可以选择在数据库设计中实施某些业务规则,而不是在应用程序中加入相应的逻辑。

所使用的功能以及对这些功能的使用程度会有很大的不同。需要考虑的功能包括:

  • 访问数据时使用:
    • 嵌入式 SQL,包括嵌入式 SQL for Java (SQLJ)
    • DB2 Call Level Interface (DB2 CLI)、Open Database Connectivity (ODBC) 和 JDBC
    • Microsoft 规范
    • Perl DBI
    • 查询产品

  • 控制数据值时使用:
    • 数据类型(内置或用户定义)
    • 表检查约束
    • 参照完整性约束
    • 使用 CHECK OPTION 的视图
    • 应用程序逻辑和变量类型

  • 控制数据值之间的关系时使用:
    • 参照完整性约束
    • 触发器
    • 应用程序逻辑

  • 执行程序时使用:
    • 存储过程
    • 用户定义函数
    • 触发器

将以数据为焦点的逻辑从应用程序转移到数据库的关键优势是,应用程序变得更加独立于数据。围绕着数据的逻辑集中在一个地方,即数据库。这意味着您只需更改一次数据或数据逻辑,就可以立即影响依赖于该数据的所有应用程序。

虽然后一个优点非常强大,但是必须考虑到,放入数据库中的数据逻辑会同等地影响数据的所有用户。您必须考虑施加在数据上的规则和约束是适用于数据的所有用户,还是只适用于单个应用程序的用户。

应用程序的需求也可能有助于决定在数据库中还是在应用程序中施加规则。例如,可能需要在一个特定订单的数据输入阶段处理有效性错误。通常,这种类型的数据验证应该在应用程序编程阶段进行。另外,还应该考虑应用程序所在的计算环境。您需要考虑在客户端机器上执行逻辑与在数据库服务器上运行逻辑之间的不同,在数据库服务器上运行逻辑时要使用存储过程,或者用户定义函数 (UDF),或者结合使用两者,这种方式一般来说要更强大一些。在某些情况下,正确的方法是在应用程序(也许是由于特定于应用程序的需求)和数据库(也许是由于应用程序之外的其他交互用途)中都加入规则。





回页首


在关系数据库中,必须使用 SQL 来访问所需的数据。不过,可以选择将 SQL 集成到应用程序中所采用的方式。您可以从以下接口以及它们所支持的语言中做出选择:

  • 嵌入式 SQL
  • C/C++
  • COBOL
  • FORTRAN
  • Java® 语言(通过 SQLJ 或 JDBC)
  • REXX
  • DB2 CLI 和 ODBC
  • Microsoft 规范,包括 ADO.NET 和 OLE DB
  • Visual Basic、Visual C++ 和 .NET 语言
  • Perl DBI
  • Perl
  • PHP
  • 诸如 Lotus Approach、IBM Query Management Facility、Microsoft Access 或 Microsoft Excel 之类的查询产品

在运行任何可执行 SQL 语句之前,程序必须建立到目标数据库服务器的连接。该连接标识运行程序的用户的授权 ID 和程序所使用的数据库服务器的名称。通常,应用程序进程一次只能连接到一个数据库。这个服务器被称作当前服务器。不过,在多站点更新环境中,应用程序可以连接到多个数据库服务器。在这种情况下,只有一个服务器能作为当前服务器。

程序在建立与一个数据库服务器的连接时,可以显式地使用一条连接语句,也可以隐式地连接到缺省的数据库服务器。Java 应用程序还可以通过一个 Connection 实例建立连接。





回页首


可以使用 SELECT 语句从一个或多个表中查询数据。为了访问所查询的数据,您需要适当的权限。查询返回的数据被称为结果集

SELECT 语句只指定结果集所需获取的数据应满足的标准。它并不指定 DB2 返回数据的方式。DB2 优化器会根据来自系统编目表的当前数据库统计信息,以及需要考虑使用的计划类型,构建一个访问计划,从而决定采用何种方式返回数据。

现在来看一些 SELECT 语句的样例。下面的语句从 store 和 product 表中选择所有商店名和产品名:

SELECT A.STORE_NAME, B.PRODUCT_NAME FROM STORE A, PRODUCT B

Store_namestore 表中的一列。Product_nameproduct 表中的一列。

现在看看另一个例子。在 employee 表中,我们将选择最高薪水少于所有其他部门平均薪水的部门的部门编号(WORKDEPT)和部门最高薪水(SALARY):

SELECT WORKDEPT, MAX(SALARY)
FROM EMPLOYEE EMP_COR
GROUP BY WORKDEPT 
HAVING MAX(SALARY) < (SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)





回页首


MQT 的定义基于查询的结果。MQT 可以显著提高查询的性能。本教程将介绍 MQT、总结表(summary table)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

MQT 是基于查询的结果定义的一个表。MQT 中包含的数据来自 MQT 定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于 IBM DB2 for Linux, UNIX, and Windows 的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上会将查询结果存储为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。MQT 可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么查询就可以被重写以便利用 MQT。MQT 可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

这种 MQT 中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。系统维护的 MQT,不管是 REFRESH DEFERRED 类型的还是 REFRESH IMMEDIATE 类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即插入、更新或删除操作)来更新。

下面的小节将展示一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求来自查询内引用的每个表至少有一个惟一键要出现在 select 列表中,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还要在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就会处于检查暂挂(check pending)状态,在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句指定,必须根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句指定对整个表进行完整性检查。

CONNECT TO SAMPLE
...
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO)
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO)

CREATE TABLE EMP AS (SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO, D.DEPTNO,
 SUBSTR(D.DEPTNAME, 1, 12) AS DEPARTMENT, D.MGRNO FROM EMPLOYEE E, DEPARTMENT D
  WHERE E.WORKDEPT = D.DEPTNO)
   DATA INITIALLY DEFERRED REFRESH IMMEDIATE

SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL
阅读(133652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~