设为首页 收藏本站
查看: 2309|回复: 0

[经验分享] DB2 9 运用拓荒(733 考试)认证指南,第 2 部门: DB2 数据操作(3)

[复制链接]

尚未签到

发表于 2016-11-19 06:12:00 | 显示全部楼层 |阅读模式
进修根底观点











  函数和表达式

  什么是 DB2 SQL 函数?

  数据库函数 是一组输入数据值与一组效果值之间的一种相干。有两品种型的函数:内置(built-in)函数和用户界说(user-defined)函数。

  • 内置 SQL 函数是数据库打点器供应的。它们供应单一的效果值,被标识为 SYSIBM 情势的一部门。内置 SQL 函数的例子包孕 AVG 之类的列函数、  之类的操作符函数、DECIMAL 之类的典范榜样笼盖函数以及其他函数,比如 SUBSTR。
  • 用户界说函数(UDF)是在 SYSCAT.FUNCTIONS 中注册到数据库的函数(运用 CREATE FUNCTION 语句。UDF 决不不是 SYSIBM 情势的一部门。数据库打点器在一个名为 SYSFUN 的情势中供应了那样一组函数。


  DB2 允许用户和运用递次拓荒人员将他们自己的函数界说运用于数据库引擎中,以扩展数据库细碎的遵从。与从数据库中检索行,然后在所检索到的数据上运用那些函数的运用递次比拟,基于 UDF 的运用递次有更好的遵从。经过历程扩展数据库函数还可以让数据库在运用递次所运用的引擎中运用不异的函数,从而增强运用递次与数据库之间的协作。函数的运用有助于前进运用递次拓荒人员的耗损率,由于这样更靠近面向工具的思惟。譬喻,您可以以美元为单位存储一个产物的代价,可是又期望某个运用递次以英镑为单位引用该代价。那么可以运用一个函数来措置责罚这个效果:
SELECT UNIT_PRICE, CURRENCY('UK',UNIT_PRICE) FROM PRODUCT WHERE PRODUCT_ID = ?










回页首




  FENCED 和 NOT-FENCED 情势

  可以用 C/C  、Java 措辞或 OLE 创立函数。函数可以以 FENCED 或 NOT-FENCED 情势运转。在迁徙到 NOT-FENCED 情势之前,应该用 FENCED 情势拓荒函数。NOT-FENCED 历程更快一些,由于它运用 DB2 代劳代理内存,而 FENCED 历程在它自己的 db2udf 历程中运转。FENCED 历程运用共享内存与挪用代劳代理通讯。FENCED 函数存储在 sqllib/function 中,而 NOT-FENCED 则存储在 sqllib/unfenced 中。








回页首




  DB2 供应的 SQL 函数

  而今来看一些 SQL 函数的例子。第一个例子从一个表中选择全数书的题目和代价。若是该书的代价为 NULL,则将其代价发挥阐发为 0.00。
SELECT TITLE, COALESCE(PRICE, 0.00) AS PRICE
FROM TITLES;




  接上去的例子前去的效果是公司的称谓以及公司称谓中所含的字符数:
SELECT COMPANYNAME, LENGTH(COMPANYNAME)
FROM CUSTOMERS




  而今看看如何前去每个作者的名字(first name)最右边的 5 个字符:
SELECT RIGHT(AU_FNAME, 5)
FROM AUTHORS




  下一个例子运用 project 表,将宿主变量 AVERAGE (decimal(5,2)) 设置为名为 D11 的部门(DEPTNO)中项目标匀称人为程度(PRSTAFF)。
SELECT AVG(PRSTAFF)
INTO :AVERAGE
FROM PROJECT
WHERE DEPTNO = 'D11'




  DB2 SQL Reference 手册中还界说了很多其他的 SQL 函数。若是 DB2 没有供应得当的函数,您老是可以编写自己的 SQL 函数。








回页首




  运用群众表表达式

  群众表表达式 是一个外地临时表,可以在一条 SQL 语句中引用多次。这个临时表只能存在于界说它的 SQL 语句的生命周期内。每次群众表表达式被引用时,其效果都是不异的。临时表是在 SQL 语句顶用 WITH 子句界说的。下面是具体的语法:
WITH <COMMON NAME1> AS ( <SELECT EXPRESSION>), <COMMON NAME2>
AS (<SELECT EXPRESSION), & SELECT <COLUMN> FROM <TABLE_NAME> <WHERE_CLAUSE>




  <table_name> 是数据库中的一个表,也可以是由一个包孕 WITH 子句的 SQL 语句界说的 <Common name>。 下面是一个例子:
WITH PROD_QUANTITY  AS
(SELECT PRODUCT_ID,  SUM (QUANTITY) AS  QUANTITY
FROM CUSTOMER_ORDER_ITEM
GROUP BY PRODUCT_ID),
TOTALS  AS
(SELECT  -1 AS PRODUCT_ID, SUM(QUANTITY) AS TOTAL)
SELECT PRODUCT_ID, QUANTITY  
FROM PROD_QUANTITY
UNION
SELECT PRODUCT_ID, TOTALS
FROM TOTALS
ORDER BY 1 DESC




  在上述例子中,prod_quantity 被界说为一个群众表表达式。它与一个名为 totals 的群众表表达式一路运用。最终的 SELECT 语句将从两个群众表表达式中遏制选择。

  下面看另一个例子:
WITH
PAYLEVEL AS                                                
(SELECT EMPNO, EDLEVEL, YEAR(HIREDATE) AS HIREYEAR,           
SALARY BONUS COMM AS TOTAL_PAY                                    
FROM EMPLOYEE                                                         
WHERE EDLEVEL > 16),                                                      
PAYBYED (EDUC_LEVEL, YEAR_OF_HIRE, AVG_TOTAL_PAY) AS         
(SELECT EDLEVEL, HIREYEAR, AVG(TOTAL_PAY)                  
FROM PAYLEVEL                                            
GROUP BY EDLEVEL, HIREYEAR)
SELECT EMPNO, EDLEVEL, YEAR_OF_HIRE, TOTAL_PAY, DECIMAL(AVG_TOTAL_PAY,7,2)
FROM PAYLEVEL, PAYBYED                                             
WHERE EDLEVEL =  EDUC_LEVEL                                       
AND HIREYEAR=  YEAR_OF_HIRE                              
AND TOTAL_PAY < AVG_TOTAL_PAY                        




  这个群众表表达式包孕了 PAYLEVEL。这个效果表包孕员工编号、该员工被雇年份、该员工的总人为以及该员工的受教导程度。只需求包孕受教导程度年夜于 16 的那些员工的纪录。

  该列表还包孕一个名为 PAYBYED(“pay by education” 的缩写)的群众表表达式。它经过历程运用 PAYLEVEL 表来确定受教导程度、被雇年份和同年被雇的具有对等受教导程度的员工的匀称人为。由这个表中失掉的列的列名(譬喻 EDUC_LEVEL)与选择列表中运用的列名差别。

  末尾,我们失掉能够孕育发生所需效果的实际盘查。该盘查毗邻两个表(PAYLEVEL、PAYBYED),确定人为低于同年招聘的全数员工匀称人为的员工。注意,PAYBYED 是基于 PAYLEVEL 的,以是在整个语句中,PAYLEVEL 实际上被会晤了两次。在这两次中,策画盘查时都用到了统一组行。

  在界说一个群众表表达式之后,就可以像运用其他表一样 SQL 语句中运用它。可以恣意次地运用群众表表达式。以致可以在之前创立的群众表表达式的根本根底上,再创立一个群众表表达式。


版权声明:
原创作品,允许转载,转载时请务必以超链接情势标明文章 原始理由 、作者信息和本声明。不然将清查法律责任。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302242-1-1.html 上篇帖子: DB2常用函数详解(一):字符串函数 下篇帖子: db2查看修改端口号
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表