ページの先頭行へ戻る
Symfoware Server V11.0.x SQLリファレンス
Symfoware

3.64 Single row SELECT文(単一行SELECT文)

機能

表の指定された行から値を取り出します。

記述形式

構文の構成

参照項番

権限

一般規則

選択リスト
  • 選択リストには、表式の結果から導出される表の列を指定します。

  • 選択リストの個数と、選択相手リストに指定されている相手指定の個数は、同じであることが必要です。選択相手リストは、選択リストに対応する検索結果の取り出し先です。

  • 選択リストに“*”を指定した場合、FROM句で指定した順に各表の各列のすべてを記述したのと同じ意味です。

  • 選択リストに“表名.*”または“相関名.*”が指定された場合、表のすべての列を記述したのと同じ意味です。“表名.”または“相関名.”は、“修飾子”と呼びます。

  • 選択リスト中に含まれる列指定は、FROM句で指定した表の列またはGROUP BY句のAS句の列名であることが必要です。

  • 選択リストに格納構造がOBJECTのBLOB型の列を複数指定することはできません。

  • 表式の結果がグループ表の場合、選択リストの列指定は、グループ化列またはGROUP BY句のAS句の列名を指定するか、集合関数指定またはグループ化関数の引数で指定することが必要です。

  • 表式の結果がグループ表でなく、選択リストに集合関数を指定する場合は、選択リストのすべてが集合関数指定であることが必要です。

  • 選択リストにAS句が指定された場合、選択リストの結果の列名はAS句に指定された列名となります。

  • 単一行SELECT文に以下の指定がある場合は、選択リストにROW_IDは指定できません。

    • 集合関数

    • DISTINCT

    • GROUP BY句

    • HAVING句

    • ビュー表の検索

  • 選択リストにROW_IDを指定した場合、相手指定にはROW_IDと対応する変数を指定することが必要です。データ型と対応する変数定義については、“表6.1 SQLのデータ型と対応するC変数定義”および“表6.3 SQLのデータ型と対応するCOBOL変数定義”を参照してください。

相手指定
  • 選択リストの結果のデータ型に対して、相手指定に指定可能なデータ型の条件を以下に示します。

    選択リストのデータ型が文字列型の場合:

    相手指定のデータ型は文字列型であることが必要です。

    選択リストのデータ型が各国語文字列型の場合:

    相手指定のデータ型は各国語文字列型であることが必要です。

    選択リストのデータ型が真数型の場合:

    相手指定のデータ型は真数型または概数型であることが必要です。

    選択リストのデータ型が概数型の場合:

    相手指定のデータ型は真数型または概数型であることが必要です。

    選択リストのデータ型が日時型の場合:

    相手指定のデータ型は文字列型であることが必要です。

    選択リストのデータ型が時間隔型の場合:

    相手指定のデータ型は文字列型または真数型であることが必要です。ただし、真数型が指定できるのは選択リストのデータ型が単一日時フィールドで指定された時間隔型の場合のみです。

    選択リストのデータ型がBLOB型の場合:

    相手指定のデータ型はBLOB型であることが必要です。

  • 相手指定の変数に値を代入する途中に誤りが起こると、データ例外(代入エラー)となります。

  • 検索結果が相手指定に設定されるときの規則は次のようになります。

    文字列型データの場合:

    検索結果のデータ長が相手指定の長さと同じ場合は、文字データがそのまま設定されます。検索結果のデータ長が相手指定の長さよりも短い場合は、空白が相手指定の右側に設定されます。検索結果のデータ長が相手指定の長さよりも長い場合は、相手指定の左側から相手指定の長さだけの文字データが設定されます。

    各国語文字列型の場合:

    文字列型の場合と同じように設定されます。

    真数型の場合:

    相手指定のデータ型に変換して設定されます。検索結果の整数部が相手指定の精度と位取りで表現できる場合は、相手指定の精度と位取りに従って設定されます。上位の桁落ちが発生する場合は例外となり、下位の位が落ちる場合は切り捨てられます。

    概数型のデータの場合:

    相手指定には、検索結果の概数値が設定されます。

    日時型のデータの場合:

    相手指定のデータ型に変換して設定されます。

    時間隔型のデータの場合:

    相手指定のデータ型に変換して設定されます。

    BLOB型のデータの場合:

    相手指定には、検索結果のバイナリ値が設定されます。

    ROW_IDの場合:

    相手指定には、行識別子が設定されます。

表式
  • 表式の結果は1行になることが必要です。結果が空の場合は、例外(データなし)、複数行の場合は、例外(基数違反)となります。単一行SELECT文の結果を以下に示します。

    • DISTINCTが指定されている場合、単一行SELECT文の結果の各行同士がまったく同じ値を持つ行がある場合、それらの複数行を1行とする処理が行われます。このとき、NULL値同士は等しいとみなされます。ALLが指定されている場合、同じ値を持つ複数行を1行とする処理は行われません。また、どらちも指定されていない場合は、ALLが指定されたのと同じになります。

    • 表式の結果が、グループ表でない場合、単一行SELECT文の結果は次のようになります。選択リストに集合関数指定がない場合、表式の結果の各行に結果指定の値式で示す演算が行われた、行の集合となります。選択リストに集合関数の指定がある場合の結果は、表式の結果を集合関数に適用した1行となります。

    • 表式の結果がグループ表の場合、単一行SELECT文の結果は次のようになります。結果の行の数はグループの数となります。各行の値は、結果指定に集合関数の指定がある場合には、グループを集合関数に適用した結果となり、列指定の場合には、グループ化列の値となり、グループ化関数の場合は、グループ化関数の値となります。なお、結果指定にGROUP BY句のAS句の列名を指定した場合は、対応するグループ化列、グループ化関数またはCASE式の値となります。

    • 表式の結果が空であれば、単一行SELECT文の結果は、空の表となります。

  • 表式の結果がNULL値の場合の扱いは以下のとおりです。

    • 相手指定に標識変数が指定されていれば、その標識変数には-1が設定されます。

    • 相手指定に標識変数が指定されていなければ、データ例外(NULL値、標識なし)となります。

  • 表式の結果がNULL値でなく、相手指定に標識変数が指定されているならば、その標識変数には次の値が入ります。

    • 相手指定のデータ型が固定長または可変長の文字列型の場合で、検索結果の長さが相手指定の文字列の最大長よりも長ければ、検索結果の文字数が設定されます。

    • 固定長または可変長の各国語文字列型の場合も、同様に設定されます。

    • そうでなければ、標識変数には0が設定されます。

PARALLEL
  • PARALLELは、“並列指定”と呼びます。

  • 並列指定を指定した場合、表を並列に検索します。


実行オプション指定
  • 実行オプション指定は、占有モードまたは最大件数を指定します。

占有モード指定
  • 占有モード指定は、問合せ指定を指定した場合に、問合せ指定のデータベース資源の占有の方法を指定します。

  • 占有モードを指定したSQL文が読み込んだデータベース資源は、占有モード指定により、以下のようにデータベース資源を占有します。なお、更新する行は占有モード指定にかかわらず、非共有モードでトランザクションの終了までデータベース資源を占有します。

    占有モード指定

    占有の方法

    EXCLUSIVE LOCK

    非共有モードでトランザクション終了までデータベース資源を占有します。

    SHARE LOCK

    共有モードでトランザクション終了までデータベース資源を占有します。

    FREE LOCK

    共有モードでSQL文終了までデータベース資源を占有します。ただし、DSO定義でPRECEDENCE(1)が指定されたSEQUENTIAL構造の表にアクセスする場合には、データベース資源を占有しません。

    NO LOCK

    データベース資源を占有しません。

  • 占有モードを指定したSQL文によって読み込まれた資源は、SET TRANSACTION文で指定された内容にかかわらず、以下のようになります。

    占有モード指定

    読込み水準

    EXCLUSIVE LOCK

    他のトランザクションによって占有されていない行を読み込みます。当該SQL文で読み込んだ行は、トランザクション終了まで他のトランザクションに更新されることはないため、一度読み込んだ行は他のトランザクションによって更新されないことが保証されます。

    SHARE LOCK

    他のトランザクションによって占有されていないか、または共有モードで資源を占有されている行を読み込みます。当該SQL文で読み込んだ行は、トランザクション終了まで他のトランザクションに更新されることはないため、一度読み込んだ行は他のトランザクションによって更新されないことが保証されます。

    FREE LOCK

    他のトランザクションによって占有されていないか、または共有モードで資源を占有されている行を読み込みます。ただし、DSO定義でPRECEDENCE(1)が指定されたSEQUENTIAL構造の表にアクセスする場合には、他のトランザクションでの占有の有無に関わらず、SQL文実行時にコミット済みの行のデータを読み込みます。いずれの場合も、当該SQL文で読み込んだ行は、他のトランザクションに更新されることがあるため、同一トランザクションで再検索すると最新の結果を検索することができます。

    NO LOCK

    他のトランザクションでどのような占有をされた資源でも参照することが可能なため、同一トランザクションで再検索すると最新の結果を検索することができます。

  • 占有モードの単位は、R_LOCKがYESの場合は行単位となります。R_LOCKがNOの場合は、ページ単位またはDSI単位の占有になります。

  • 動作環境パラメタにDSO_LOCKを指定したり、環境変数でRDBDSOを指定した場合、占有モードを指定したSQL文は実行できません。

最大件数指定
  • 最大件数指定は、検索結果として取り出す件数を限定します。最大件数指定を指定すると、それ以上の行は返されません。

  • 最大件数指定に指定された値が0以下の場合、検索結果として取り出す件数は0件となります。

  • 最大件数指定に指定された値がNULLの場合、検索結果として取り出す件数は限定されず、すべての行が返されます。

  • 値指定にUSERは指定できません。

  • 指定値に指定できる値は、-2147483648から2147483647までの整数値です。

  • 値指定に2以上の値を指定し、結果が複数行の場合は、例外(基数違反)となります。

  • 値指定に変数指定または項目参照を指定した場合、データ型はINTEGER型またはSMALLINT型が指定可能です。

  • 値指定に動的パラメタ指定が指定された場合のDESCRIBE情報は、INTEGER型になります。

その他の構文要素

その他の構文要素の説明は、“3.26 DECLARE CURSOR(カーソル宣言)”を参照してください。

使用例

例1

在庫数の合計および一番多い個数を求めます。その際、在庫数の合計はホスト変数H1に、また一番多い個数はホスト変数H2に格納します。

SELECT SUM(在庫量),MAX(在庫量) INTO :H1,:H2 FROM T1

例2

スキーマ“S1”の表“T1”を1件検索します。この時、非共有モードで行を占有して、他のトランザクションからの参照または更新を抑止します。

SELECT C1,C2 INTO :OUTVAL1,:OUTVAL2
    FROM S1.T1 WHERE C3 = :INVAL1
    WITH OPTION LOCK_MODE(EXCLUSIVE LOCK)