構文 問合せ
[ORDER BY 節]
[FOR UPDATE 節]
WITH {RR|RS|CS|UR}
SELECT文は問合せと、省略可能なORDER BY 節とFOR UPDATE 節から構成されます。
SELECT文は、問合せの最初の単語が一般的にSELECTなので、この名前が与えられています。(問合せは選択式以外にも、VALUES式、UNION、INTERSECT、EXCEPT式である場合があります。)
ORDER BY 節により、ResultSetの並び順が明示されます。FOR UPDATE 節により、結果のカーソルを更新可能にすることができます。SELECT文にはFOR EACH ONLY 節を置くことができます。FOR EACH ONLY 節とFOR READ ONLY節は同じものです。
SELECT文にてWITH {RR|RS|CS|UR}という書き方で分離レベルを指定することができます。
例
-- SAL+BONUS+COMMと名前を並べて、TOTAL_PAYという名前をつけ、
-- その名前で並び替える。
SELECT FIRSTNME, SALARY+BONUS+COMM AS TOTAL_PAY
FROM EMPLOYEE
ORDER BY TOTAL_PAY
-- FOR UPDATE節を指定することで、
-- PROJECTという表にある、開始日時(PRSTDATE)、終了日時(PRENDATE)という列を更新する、
-- 更新可能なカーソルを作成する
SELECT PROJNO, PRSTDATE, PRENDATE
FROM PROJECT
FOR UPDATE OF PRSTDATE, PRENDATE
-- この文に限り分離レベルをRRにする。
SELECT *
FROM Flights
WHERE flight_id BETWEEN 'AA1111' AND 'AA1112'
WITH RR
SELECT文はResultSetを返します。
カーソルはResultSetにある行へのポインタです。Javaのアプリケーションでは、ResultSetsには対応したSQLのカーソルがあります。カーソルは更新可能とすることができます。したがって、問合せが後に述べる更新可能の条件に適合するのであれば、ResultSetを通して行の更新や削除が可能です。FOR UPDATE 節により、SQLのコンパイル時にSELECT文が更新可能なカーソルの要件に適合するかを確かめる事や、あるいは列を更新可能なもののみに限定する事ができます。
ORDER BY節によりSELECTの結果を並び替えることができます。ORDER BY節がない場合、結果は無作為な並び順です。
更新可能なカーソルおよびResultSetの要件
更新可能なカーソルは、単表への単純なSELECT文によるものでなければなりません。
更新可能なResultSetを得るためのSELECT文は、更新可能なカーソルと同じ制限を受けます。更新可能なカーソルとするためには、:
- SELECT文にはORDER BY節があってはなりません。
- 問合せは選択式でなければなりません。
- 選択式には以下があってはなりません。
- DISTINCT
- 集約
- GROUP BY 節
- HAVING 節
- ORDER BY 節
- 問合せのFROM節には以下があってはなりません。
- 二つ目以降の表
- 表以外の名前
- 選択式s
- 副問い合わせ
既定でカーソルは読み取り専用です。更新可能なカーソルを得るためには、上記の要件を満たすことに加えて、ResultSetの同時並行モードをResultSet.CONCUR_UPDATABLEとするか、SELECT文のFOR節にFOR UPDATEを記述しなくてはなりません。(を参照してください。)
SQL言語ではカーソルに名前を与える事ができません。そのかわりにJDBC APIによりカーソルに名前を与えたり、システムがカーソルに与えた名前を取得することができます。詳細についてはのカーソルへの命名および名前の利用を参照して下さい。
文の依存
SELECTは、問合せの表やビュー、それらの表へのアクセスパスにて選択されたコングロマリット(ヒープやインデックスなどの記憶の単位です。)に依存します。
CREATE INDEXでは準備されたSELECT文が無効になることはありません。
DROP INDEX文ではもし破棄される索引が文にてアクセスパスなら、準備されたSELECT文は破棄されます。
もしSELECTにビューが含まれていれば、ビューが依存するディクショナリの情報にも依存します。(を参照してください。)
SELECTのカーソルに対して、準備されたUPDATE WHERE CURRENTあるいはDELETE WHERE CURRENT文はSELECTに依存します。java.sql.Statement.close によりSELECTを取り除くと、UPDATE WHERE CURRENT および DELETE WHERE CURRENTは無効となります。
SELECTは問合せにあるあらゆる別名に依存します。別名を破棄することにより、もし準備されたSELECT文にて別名が使われているなら、その文は無効になります。