进修根底观点
函数和表达式
什么是 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 语句中运用它。可以恣意次地运用群众表表达式。以致可以在之前创立的群众表表达式的根本根底上,再创立一个群众表表达式。
版权声明:
原创作品,允许转载,转载时请务必以超链接情势标明文章 原始理由 、作者信息和本声明。不然将清查法律责任。