高度専門データベース技術

ＳＱＬ99

補足資料

（株）アイテック

情報技術教育研究部

2012 年 2 月１４日

（はじめに）
この補足資料は，SQL99（ISO/IEC9075-2，JIS X3005-2）の必須機能（Core SQL）のうち，SQL92に対し機能拡張が行われた部分で，「高度専門データベース技術」（以下，「DB技術」という）に記載のないものについて記述する。なお，説明の都合上，必須機能以外の機能についても触れているが，それらは参考程度に見てもらいたい。
SQL99の機能は，大きく，必須機能とそれ以外のオプショナルな機能とに分かれている。
必須機能は，準拠する SQL のすべてが備えるべき最小限の機能であり，スキーマ定義，スキーマ操作，整合性制約，権限，データ操作，カーソル定義，問合せ式，結合表，問合せ指定，トランザクションサポートなどからなる。
SQL99では，SQLをオブジェクト指向へ拡張し，データ型，問合せ式，述語，表定義，トリガ，トランザクションなどの機能拡張が行われたが，これらは必須機能以外のオプショナルな機能とされている（「DB技術」の「12.1.3 SQL99」参照）。

１．必須機能の機能拡張部分「JIS X3005-2:2010（ISO/IEC9075-2:2008）」の表36「必須機能の機能分類及び定義」によれば，必須機能のうちSQL92に対する機能拡張部分は次のとおりである。なお，次の(1)，(2)の機能は，主要な商用RDBMSやオープン系のRDBMSがサポートしている。(3)，(4)については，一部のオープン系RDBMSや商用RDBMSがサポートしている程度である。
(1) ORDER BY列は選択リスト中にある必要がない（E121-02:ORDER BY columns need not be inselect list）(2) ORDER BY句の値式（E121-03:Value expression in ORDER BY clause）。
なお，ソート指定の整数は，SQL99で廃止になった。
(3) WITH HOLDカーソル(E121-17: WITH HOLD cursors)
後述の２.(1)③参照(4) 外部キー中の名前は任意の順序で指定できる（E141-10:Names in a foreign key can be
specified in any order）。

２．カーソル定義（DECLARE CURSOR）(1) カーソル定義の構文
JIS X3005-2:2010（ISO/IEC9075-2:2008）のカーソル定義の構文は次のようになるが，
SENSITIVE，ASENSITIVE，NOSCROLL，[WITH HOLD｜WITHOUT HOLD]，[WITH
RETURN|WITHOUT RETURN]，ソート指定の値式は，SQL99で追加・変更された部分である。このうち，WITH HOLD及びソート指定の値式以外は，オプショナルな機能である。

Copyright by Youichi Nishikawa, ITEC,Inc. 20121

DB 技術SQL99 補足資料

■カーソル定義::＝DECLARE カーソル名 [SENSITIVE｜INSENSITIVE｜ASENSITIVE][SCROLL｜NOSCROLL]CURSOR[WITH HOLD｜WITHOUT HOLD][WITH RETURN｜WITHOUT RETURN]
FOR<カーソル指定><カーソル指定>::＝<問合せ式>[FOR {READ ONLY｜UPDATE [OF 列コンマリスト]}]<問合せ式>::＝[<WITH 句>]<問合せ式本体>[ORDER BY ソート指定コンマリスト] [<FETCH FIRST 句>]
ソート指定::＝ 値式 ［ASC｜DESC］※<問合せ式本体>は，従来の非結合問合せ式（結合表を含まず）に相当する。
①[SENSITIVE｜INSENSITIVE｜ASENSITIVE]…オプショナルな機能・SENSITIVE を指定すると，元の表の更新結果を見ることができる。
・INSENSITIVE を指定すると，元の表の更新結果を見ることができない。
「DB 技術」の「3.1.5 データ操作」(2)①「(a) INSENSITIVE と SCROLL」を参照のこと。
・ASENSITIVE を指定すると，元の表の更新結果を見ることができるかどうかは実装に依存する。省略値は，ASENSITIVE である。
②

[SCROLL｜NOSCROLL]…オプショナルな機能

・SCROLL を指定すると，すべてのタイプの FETCH が使用可能になる。
・省略値は NOSCROLL で，FETCHNEXT のみが可となる。

「DB 技術」の「3.1.5 データ操作」(2)①(a)参照のこと。
③[WITH HOLD｜WITHOUT HOLD]…WITH HOLD は必須機能

・WITH HOLD を指定すると，トランザクションがコミットを発行してもカーソルを閉じず，その位置を保持し続ける。ただし，ロールバックが発行されたときはカーソルを閉じる（H20 年春 DB 本試験午後Ⅰ問 4 参照）。
・省略値は，WITHOUT HOLD である。
④

[WITH RETURN｜WITHOUT RETURN]…オプショナルな機能

・WITH RETURN付きのカーソル宣言は，結果集合カーソルと呼ばれ，プロシージャ（SQL-invoked procedure）の中でWITH RETURN付きでカーソルが宣言されると，呼び出し側に結果集合（一つのテーブル）を返すまで，カーソルは閉じられない。
・省略値は，WITHOUT RETURNである。

2

Copyright by Youichi Nishikawa, ITEC,Inc. 2012

⑤

ソート指定の値式…必須機能・従来は，ソート指定::＝{列|整数} [ASC｜DESC] となっていたが，SQL99では，整数が廃止され，列の部分に値式が指定できるようになった。ソート指定の値式の例は後述する。
(2) ORDER BY列は選択リスト中にある必要がない
従来は，ORDER BY句で指定する列名は必ず問合せ指定の選択リストにも指定しなければならなかったが，SQL99では，ORDER BY句で指定する列名は，必ずしも問合せ指定の選択リストに指定する必要はなくなった。
ORDER BY 句で指定する列名を選択リストに指定しない場合①

この場合には，「FOR 問合せ式」の問合せ式本体に，次のような制限が付く。
・問合せ式本体に指定できるのは，問合せ指定（SELECT 文）だけである。UNION やEXCEPT，INTERSECT は使用できない。
・この問合せ指定には，GROUP BY 句を含んではならず（グループ表は不可），問合せ指定の選択リストには，DISTINCT も集合関数も指定してはならない。
・ORDER BY 句で指定する列名を選択リストに指定しない場合の例を次に示す。
店舗（店舗コード，店舗名，住所，代表電話）
DECLARE CR CURSORFORSELECT 店舗名,住所,代表電話
FROM
店舗
ORDER BY 店舗コード※SQL99の構文では，ORDER BY句で指定した店舗コードが，SELECT文の選択リストに指定されていなくても構わない。

②

ORDER BY 句で指定する列名を必ず選択リストにも指定する場合
従来通り，ORDER BY 句で指定する列名を必ず問合せ指定の選択リストにも指定する場合には，問合せ式本体に上記①のような制限はない。

Copyright by Youichi Nishikawa, ITEC,Inc. 20123

DB 技術SQL99 補足資料

(3) ソート指定の値式の例
ソート指定の値式の例を次に示すが，最初の①の例は，従来の構文（AS句）を用いた場合であり，②の例がSQL99の構文（ソート指定の値式）を用いた場合である。②の例は，①の例をSQL99の構文で書き直したものである。
①

従来の構文を用いた場合…SUM（合計金額）にAS句を指定
DECLARE CR CURSORFOR SELECT 月,顧客.顧客番号,顧客名,SUM（売上金額）AS 利用合計
FROM
売上,顧客WHERE
売上.年＝’2004’ AND 売上.顧客番号＝顧客.顧客番号
GROUP BY 月,顧客.顧客番号,顧客名
HAVING
SUM（売上金額）>= 1000000
ORDER BY 月 ASC, 利用合計 DESC
※月ごと顧客ごとに売上金額を集計し，月の昇順，利用合計（AS句）の降順に取り出す。

②

SQL99の構文を用いた場合…ソート指定の値式
DECLARE CR CURSORFORSELECT
月，顧客.顧客番号,顧客名,SUM（合計金額）
FROM
売上，顧客
WHERE
売上.年＝’2003’ AND 売上.顧客番号＝顧客.顧客番号
GROUP BY 月，顧客.顧客番号, 顧客名
HAVING SUM（合計金額）>= 1000000
ORDER BY 月 ASC, SUM（合計金額）DESC※AS句を指定しないで，直接，ソート指定に値式のSUM（合計金額）を指定し，降順に並び替えた場合

4

Copyright by Youichi Nishikawa, ITEC,Inc. 2012

３．外部キー中の名前は任意の順序で指定できる
参照制約定義の構文は，次のようになっている。
参照制約定義 ::＝ FOREIGN KEY (列コンマリスト)

参照指定

従来は，この列コンマリストの並び順は，参照指定の REFERENCES 句で参照される表（以下，被参照表という）の主キーまたは候補キーの列の並び順と一致していなければならなかったが，SQL99 では，この列コンマリストの並び順は，被参照表の主キー又は候補キーの並び順と必ずしも一致しなくてもよいことになった。

「高度専門データベース技術

SQL99

補足資料」
2012,2,14

執筆者：西川洋一
制作：（株）アイテック

Copyright by Youichi Nishikawa, ITEC,Inc. 2012

5

情報技術教育研究部