# 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文にて別名が使われているなら、その文は無効になります。

親トピック: 文