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

进修根底观点
developerWorks








函数和表达式

什么是 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 创立函数。函数可以以 FENCEDNOT-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)与选择列表中运用的列名差别。

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

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




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

原文地址:https://www.cnblogs.com/zgqjymx/p/1972871.html