select-clause

SELECT 節は、最終的な結果表の列を指定します。 列の値は、R に対して選択リスト を適用することによって作成されます。 選択リストは、SELECT 文節に指定された名前と式のリストです。R は、副選択の前の操作の結果です。 例えば、指定した文節が SELECT、FROM、および WHERE だけの場合、R はその WHERE 文節の結果になります。

select句の構文

構文図を読むビジュアルシンタックスダイアグラムをスキップする SELECT ALLDISTINCT *,ASnew-column-nameunpacked-rowtable-nameview-namecorrelation-name.*

select句の説明

ALL
最終結果表のすべての行を保存します。 余分な重複行を取り除くことはしません。 これはデフォルトです。
DISTINCT
最終結果表の中に重複行があれば、 その中の 1 つを除き、それ以外のすべてを削除します。

2 つの行が互いに重複するのは、最初の行の それぞれの値が 2 番目の行の対応する値に等しい場合だけです。 重複行の判別にあたっては、2 つの NULL 値は等しいものと見なされます。

SELECT DISTINCT を指定した場合、暗黙的または明示的なリストの列または式は、LOB データ・タイプや XML データ・タイプの値を戻すことはできません。 リスト内の列または式が DECFLOAT データ・タイプの値を戻し、中間結果に同じ数値のビット表記が複数存在する場合、戻される値は予測不能です。 詳細は、 数値比較を参照してください。

列アクセス制御は SELECT DISTINCT の操作に影響しません。 重複行の除去は、マスク値ではなく、元の列値に基づきます。 ただし、列マスクの適用後、最終結果表内のマスク値が SELECT DISTINCT による一意性を反映しない可能性があります。

SELECT DISTINCT の結果を直接的または間接的に派生させる列に列マスクが適用される場合、SELECT DISTINCT から非 deterministic の結果が戻されることがあります。 以下の条件は、非 deterministic の結果が戻されるいくつかの例を示しています。
  • 列マスクの定義が列マスクの適用先の表にある他の列を参照している。
  • 列が組み込みスカラー関数 (COALESCE、IFNULL、NULLIF、MAX、 MIN、LOCATE、TOTALORDER など) の引数で参照されている。
  • 列が集約関数の引数で参照されている。
  • 列が式に組み込まれ、その式に非 deterministic 関数かまたは外部アクションのある関数が含まれている。

他の SQL インプリメンテーションとの互換性のため、DISTINCT の同義語として UNIQUE を指定できます。

選択リストの表記:
*
表 R の列のリストを表示しますが、IMPLICITLY HIDDEN 属性を指定して定義されている列は含まれません。 名前のリストは、SELECT 文節を含むステートメントが準備 された時点で確立されます。 したがって、* は、ステートメントが準備された後で表に追加 された列を識別しません。

IMPLICITLY HIDDEN 属性を指定して定義されている列は、選択リストで明示的に参照できます。

* は、行の許可または列マスクの定義では使用できません。

結果列の値を指定します。 式内の各 column-name は、中間結果表の列を明確に示す必要があります。

変更の開始式の結果は、以下のコンテキストを除き、配列タイプであってはなりません。変更の終わり

変更の開始
  • スクロール可能でないカーソルの定義の、UNION ALL 以外の、セット演算子が含まれていない全選択の外部選択リスト
  • 全選択の結果表の対応する列のターゲットが配列変数である場合、SELECT INTO ステートメントの外部選択リスト
  • 代入の対応するターゲットが配列変数である場合、SET assignment-statement ステートメントまたは SQL PL assignment-statement ステートメントの右側の、セット演算子が含まれていないスカラー全選択の外部選択リスト
変更の終わり
AS 新しい列名
結果列の名前を指定または変更します。 この名前は修飾してはならず、ユニークである必要もありません。 new-column-name は、128 UTF-8 バイト以下の SQL ID です。
名前 *
name の列のリストを FROM 文節によって生成される列の順序で表示しますが、暗黙的に非表示と定義されている列は含まれません。 name は、表名、ビュー名、または相関名にすることが できますが、SELECT 文節の直後に続く FROM 文節内で公開された表名、ビュー名、または相関名を指定する 必要があります。 リストの最初の名前は、表またはビューの 1 列目を識別し、 リストの 2 番目の名前は、表またはビューの 2 列目を識別 するといった形で、以下同様に続いていきます。

名前のリストは、SELECT 節を含むステートメントが準備された時点で確立されます。 したがって、* は、ステートメントが準備された後で表に追加 された列を識別しません。

名前 * 行の許可または列マスクの定義では使用できません。

SQL ステートメントは、暗黙的または明示的に再準備することができます。 * または 名前 * を含むステートメントに対する別の準備の影響 名前のリストが再確立されることです。 したがって、ステートメントによって戻される列の数は変わる場合があります。

SELECT の結果としての列の数は、操作形式の選択リスト (すなわち、ステートメントの準備時点で確立されたリスト) 内の式の数と同じです。この列の数は 750 を超えてはいけません。 副照会の 結果は、EXISTS 述部で使われる場合を除き、単一の列でなければなりません。

注:

FROM 節に MERGE ステートメントが含まれている場合:
SELECT リストでは、LOB データ・タイプ、ROWID データ・タイプ (あるいは LOB、または ROWID に基づく特殊タイプ)、あるいは XML データ・タイプを持つ列を、暗黙的または明示的に参照しないでください。
選択リストにおける暗黙的な非表示列:
SELECT * の結果には、IMPLICITLY HIDDEN 属性を指定して定義された列は含まれません。 暗黙的に非表示にされた列を結果に含めるためには、それらの列を選択リストに明示的に指定する必要があります。
VARBINARY データ:
指定した表が VARBINARY 列に索引を持つ場合、または VARBINARY データ・タイプに基づく特殊タイプの列に索引を持つ場合、その索引列では DESC 属性を指定できません。 指定した表を照会するには、索引をドロップするか、列のデータ・タイプを BINARY に変更して索引を再作成します。
選択リストの適用:
選択リストを R に適用した結果は、 GROUP BY または HAVING が使用されているかどうかによって異なる場合があります。 以下の 3 つのリストで、結果について説明します。
GROUP BY も HAVING も使用しない場合:
  • 選択リストには、そのリストに他の集約関数、定数、または定 数のみを扱う式が含まれている場合のみ、集約関数を含めることができます。
  • 選択リストに集約関数が含まれていない場合、選択リスト は R の各行に適用され、結果には R の行と同じ数の行が含まれます。
  • 選択リストが集約関数を含む場合、関数の引数は R から取られ、選択リ ストを適用した結果は、R に行がない場合でも 1 行となります。
  • 列マスクを使用して最終結果表の値をマスクし、選択リストが集約関数を含む場合、列マスクの定義では以下を参照してはなりません。
    • スカラー全選択
    • 集約関数
HAVING が使用され、GROUP BY は使用されない場合:
選択リスト内の式に含まれる各式または column-name は、集約関数内で指定する必要があります。 定数、または定数のみを扱う式 も選択リストに含めることができます。
列マスクを使用して最終結果表の値をマスクする場合、列マスクの定義では以下を参照してはなりません。
  • スカラー全選択
  • 集約関数
GROUP BY を使用する場合:
  • 選択リストに含まれる式は、それぞれ 1 つ以上のグループ化式を使用する必要があります。 あるいは、式または式に含まれる column-name が、それぞれ次の条件を満たしている必要があります。
    • R のグループ化列を明確に識別すること。
    • 集約関数内で指定されていること。
    • 相関参照であること。 (列名が、外部副選択の中で指定された表またはビューの列を指定する場合、列名は相関参照になります)
  • 選択リストに含まれる式がスカラー全選択の場合、スカラー全選択からグループ R への相関参照は、グループ化列を指定しているか、集約関数に含まれている必要があります。 例えば、次の照会は失敗します。これは、スカラー全選択の選択リストにある相関参照 T1.C1 || T1.C2 が、外部副選択のグループ化列とマッチングしないからです。 (グループ化式 T1.C1 || T1.C2 のマッチングはサポートされていません)
    SELECT MAX(T1.C2) AS X1, 
          (SELECT T1.C1 || T1.C2 FROM T2 GROUP BY T2.C1) AS  Y1
      FROM T1
      GROUP BY  T1.C1, T1.C1 || T1.C2;
  • AS 文節で定義された名前 で GROUP BY を使用することはできません。 ただし、ネストされた表の式で定義された名前は使用できます。 例6は、SELECT文におけるASとGROUP BYの有効な使用法を示しています。

どちらのケースも、結果の n 列目には、操作形式の 選択リスト内の n 番目の式を適用することによって 指定された値が含まれます。

列マスクを使用して最終結果表の列値をマスクする場合、列マスクの適用対象の列は以下のいずれかの条件を満たす必要があります。
  • 列は集約関数内で指定する必要があり、列マスクの定義では以下を参照してはなりません。
    • スカラー全選択
    • 集約関数
  • 列は、GROUP BY 節内の column-name を示している必要がありますが、GROUP BY 節内の expression で参照されていてはなりません。 さらに、列マスクの適用先の列と同じ表にあり、列マスクの定義で参照されている列は、 GROUP BY 節で column-name を使用して識別する必要があります。 これらの列は、GROUP BY 節の expression で参照されていてはなりません。
  • 列マスクを使用して最終結果表の列値をマスクし、非基本表の列が、列マスクが適用される表に対するマテリアライズ表式またはマテリアライズ・ビューの列名または式に直接または間接にマップされる場合、選択リストの非基本表の列は集約関数で指定する必要があります。
結果列に対する列マスクの効果:
列マスクが有効であると、それらが最外部の選択リストの最終結果表の値を決定します。 列マスクが列に対して有効であると、その列が最外部の選択リストに現れる場合 (暗黙的または明示的のいずれか)、列マスクがその列に適用され、最終結果表の値が生成されます。 列自体は最外部の選択リストには現れないが、出力に含まれる場合 (例えば、マテリアライズ表式またはビューに現れる場合)、マスクされた値は最終結果表で使用できるように表式またはビューの結果表に含まれます。

有効な列マスクが、WHERE 節、GROUP BY 節、HAVING 節、SELECT DISTINCT 節、および ORDER BY 節などの、ステートメント内の他の節の操作と競合することはありません。

最終結果表に戻される行は同じですが、結果行の値がマスクされている可能性があります。 したがって、マスクされた値を持つ列も sort-key 式が指定された ORDER BY 節に現れる場合、順序は元の列値に基づきます (最終結果表のマスクされた値がその順序を反映していない可能性があります)。 同様に、マスクされた値には、SELECT DISTINCT により適用される固有性が反映されない可能性があります。 マスクされた列が式に組み込まれている場合、式が評価される前に列マスクが列に適用されるため、式の結果が異なることがあります。 例えば、列 SSN の列マスクにより、マスク値に対して DISTINCT 操作が行われるため、関数 COUNT(DISTINCT SSN) の結果が変わることがあります。 ただし、照会の中の式が、列マスク定義で列値をマスクするために使用された式と同じ場合、式の結果は変化しない可能性があります。 例えば、照会内の式が 'XXX-XX-' || SUBSTR(SSN, 8, 4) で、列マスク定義で同じ式が使用されているとします。 この特定の例では、照会内の式を列 SSN で置き換えて、同じ式が 2 回評価されないようにすることができます。

最外部の選択リストに CASE 式が現れる場合、列マスクは WHEN 節の search-condition には適用されません。

列マスクの定義が最終結果表の列値をマスクする SQL ステートメントに適用される場合、列マスクのセマンティクスがそのステートメントの特定の SQL セマンティクスと競合する可能性があります。 これらの場合、ステートメントと列マスクを組み合わせると、エラーが戻されます。

有効なカラムマスクの適用に関する詳細については、ALTER TABLE 文を参照してください。

結果列の NULL 属性:
結果列が以下のいずれかによって導き出されたものであれば、結果列に NULL 値を入れることができます。
  • COUNT または COUNT_BIG 以外の集約関数
  • NULL 値を使える列
  • 外部選択リスト内の算術式から導き出されたビューの列
  • 外部選択リスト内の算術式
  • NULL 値を使える算術式
  • NULL 値を使えるスカラー関数またはストリング式
  • 指示子変数、SQL パラメータまたは変数、グローバル変数、または Java™ の場合、Java の NULL 値を表現できる型を持つホスト変数または式
  • セット演算子において、選択リスト内の対応する項目の中で NULL 可能な項目が少なくとも 1 つはある場合の結果
結果列の名前:
以下の場合、結果列は、名前付き列であるとみなされます。
  • AS 節が指定されている場合、 結果列の名前は、AS 節に指定された名前になります。
  • 相関文節の中で AS 文節を指定せず、列リストを指定する場合、 結果列の名前は相関列リストにある対応する名前になります。
  • 相関文節の中で AS 文節も列リストも指定せず、結果列が単一の列 (関数または演算子を使用しない) のみから導き出される場合、結果列の名前はその列の非修飾名です。
  • 相関文節の中で AS 文節も列リストも指定せず、結果列が単一の SQL 変数、グローバル変数、または SQL パラメーター (関数または演算子を使用しない) のみから導き出される場合、結果列の名前はその SQL 変数、グローバル変数、または SQL パラメーターの非修飾名です。

他のすべての場合、結果列は無名列です。

結果列、SQL 変数、およびグローバル変数の名前は、DESCRIBE ステートメントの実行時に SQL 記述子域 (SQLDA) に 配置されます。 これにより、SPUFI、 Db2 command line processorQMF などのインタラクティブなSQLプロセッサが結果を表示する際に、列名を使用できるようになります。 SQLDA 内の名前には、AS 文節によって指定された名前が含まれます。

結果列のデータ・タイプ:
SELECT の結果の各列は、その列の派生元の式のデータ・タイプとなります。 次の表に、結果列のデータ・タイプを示します。
表 1. 結果列のデータ・タイプ
結果列のデータ・タイプ
数値列の名前 その列のデータ・タイプと同じで、 10 進列と同一の精度と位取りを持つ。
整定数 INTEGER.
10 進定数または浮動小数点定数 その定数と同じデータ・タイプで、10 進定数と同じ精度と位取りを持つ。 浮動小数点定数の場合のデータ・タイプは DOUBLE PRECISION。
10 進浮動小数点定数 DECFLOAT(34)
数値ホスト変数の名前 変数のデータ・タイプと同じで、10 進変数の場合と同一の精度と位取りを持つ。 ホスト変数のデータ・タイプが SQL データ・タイプでない場合、 結果は 10 進数。例: COBOL の DISPLAY SIGN LEADING SEPARATE。
算術式またはストリング式 結果のデータ型と同じで、小数点以下の桁数は式で説明されているものと同じ精度と桁数です。
任意の関数 関数の結果のデータ・タイプ。 組み込み関数の場合、結果のデータ型を判別するには、組み込み関数および Db2 に付属する関数を参照してください。 ユーザー定義関数の場合、結果のデータ・タイプは、 関数に関する CREATE FUNCTION ステートメントで定義された結果のデータ・タイプ。
ストリング列の名前 その列と同じデータ・タイプで、長さ属性も同じ。
ストリング・ホスト変数の名前 その変数と同じデータ・タイプで、長さ属性も変数の長さと同じ。 ホスト変数のデータ・タイプが SQL データ・タイプではない場合 の結果は、可変長文字ストリング。例: C の NUL 終了ストリング。
長さ n の文字ストリング定数 VARCHAR(n)
長さ n のバイナリー・ストリング定数 VARBINARY(n )
長さ n のグラフィック・ストリング定数 VARGRAPHIC(n)
日時列の名前 その列のデータ・タイプと同じ。
ROWID 列の名前 行 ID。
特殊タイプ列の名前 その列の特殊タイプと同じデータ・タイプで、もしあれば、 長さ属性、精度属性、および位取り属性も同じ。

結果カラムの CCSID に関する情報は、 結果データタイプのルールを参照してください。