ここでは、このマニュアルの例の中で使う関数について簡単に説明します。 データベース関数 とは、 入力データ値と結果値の間の関係付けです。
関数には、組み込み 関数と ユーザー定義 関数があります。 DB2 ユニバーサル・データベースには、たくさんの組み込み関数と、 事前インストール済みユーザー定義関数が付属しています。
組み込み関数は SYSIBM スキーマの中にあり、 事前インストール済みユーザー定義関数は SYSFUN スキーマの中にあります。 SYSIBM と SYSFUN は予約スキーマです。
組み込み関数と事前インストール済みユーザー定義関数だけですべてのユーザー要件を満たすことは到底できません。 したがって、アプリケーション開発者は、 開発するアプリケーションに特化した関数のセットを作成することが必要になる場合があります。 これは、ユーザー定義関数によって可能になります。 ユーザー定義関数を活用するなら、 DB2 ユニバーサル・データベースの適用範囲を拡張して、 カスタマイズされた業務用関数または科学計算用関数を含めることができます。 これについては、ユーザー定義関数を参照してください。
列関数 は、 1 つの列の一群の値から単一の結果値を計算します。 列関数の例としては、下記のものがあります。 これらは列関数のほんの一部分です。 完全なリストについては、 SQL 解説書 を参照してください。
次のステートメントでは、STAFF 表から給与の最大値を選択しています。
SELECT MAX(SALARY) FROM STAFF
このステートメントは、STAFF サンプル表から 22959.20 の値を戻します。
次の例では、収入が平均収入より多く、 就業年数が平均就業年数より短い従業員の名前と給与を選択しています。
SELECT NAME, SALARY FROM STAFF WHERE SALARY > (SELECT AVG(SALARY) FROM STAFF) AND YEARS < (SELECT AVG(YEARS) FROM STAFF)
このステートメントの結果は、次のとおりです。
NAME SALARY --------- --------- Marenghi 17506.75 Daniels 19260.25 Gonzales 16858.20
この例の WHERE 文節では、 列関数が直接的な書き方 (例: WHERE SALARY > AVG(SALARY)) ではなく、 副照会 の形で書かれています。 WHERE 文節の中に列関数をコーディングすることはできません。 これは操作の順序のためです。 WHERE 文節は、SELECT 文節より前に評価されるものと考えてください。 そのため、WHERE 文節が評価される時点では、 列関数によって値の集合にアクセスすることができません。 この値の集合は、もっと後で SELECT 文節によって選択されます。
列関数の引き数の一部として DISTINCT 要素を使用するなら、 関数の適用前に値の重複をなくすことができます。 COUNT(DISTINCT WORKDEPT) とすると、 異なる部署の数が計算されます。
スカラー関数 は、 1 つの値に対してなんらかの操作を実行して、別の 1 つの値を戻します。 DB2 ユニバーサル・データベースに用意されているスカラー関数の例としては、 下記のものがあります。 これらはほんの一部分にすぎません。
スカラー関数のリストとその説明については、 SQL 解説書 を参照してください。
次のステートメントでは、 ORG 表から部署名と、その名前の長さを戻します。
SELECT DEPTNAME, LENGTH(DEPTNAME) FROM ORG
このステートメントの結果は、次のとおりです。
DEPTNAME 2 -------------- ----------- Head Office 11 New England 11 Mid Atlantic 12 South Atlantic 14 Great Lakes 11 Plains 6 Pacific 7 Mountain 8
注: LENGTH(DEPTNAME) に意味のある名前を付けるための AS 文節を使っていないため、 システムの生成した番号が第 2 欄に表示されています。
表関数 は、 表の列を戻します。 表の列は、 単純な CREATE TABLE ステートメントで作成する表そのものとよく似ています。
表関数は、 SQL ステートメントの FROM 文節でのみ使用できます。
今のところ、 DB2 ユニバーサル・データベースでサポートされている唯一の表関数は SQLCACHE_SNAPSHOT です。