SELECT 文

構文

問合せ
[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を記述しなくてはなりません。(FOR UPDATE 節を参照してください。)

SQL言語ではカーソルに名前を与える事ができません。そのかわりにJDBC APIによりカーソルに名前を与えたり、システムがカーソルに与えた名前を取得することができます。詳細についてはDerby ディベロッパーズ ガイドカーソルへの命名および名前の利用を参照して下さい。

文の依存

SELECTは、問合せの表やビュー、それらの表へのアクセスパスにて選択されたコングロマリット(ヒープやインデックスなどの記憶の単位です。)に依存します。 CREATE INDEXでは準備されたSELECT文が無効になることはありません。 DROP INDEX文ではもし破棄される索引が文にてアクセスパスなら、準備されたSELECT文は破棄されます。 もしSELECTにビューが含まれていれば、ビューが依存するディクショナリの情報にも依存します。(CREATE VIEW 文を参照してください。)

SELECTのカーソルに対して、準備されたUPDATE WHERE CURRENTあるいはDELETE WHERE CURRENT文はSELECTに依存します。java.sql.Statement.close によりSELECTを取り除くと、UPDATE WHERE CURRENT および DELETE WHERE CURRENTは無効となります。

SELECTは問合せにあるあらゆる別名に依存します。別名を破棄することにより、もし準備されたSELECT文にて別名が使われているなら、その文は無効になります。