DB2 Version 10.1 for Linux, UNIX, and Windows

select-clause

SELECT 節は、最終的な結果表の列を指定します。

構文図を読む構文図をスキップする
           .-ALL------.   
>>-SELECT--+----------+----------------------------------------->
           '-DISTINCT-'   

>--+-*-----------------------------------------------+---------><
   | .-,-------------------------------------------. |   
   | V                                             | |   
   '---+-expression--+-------------------------+-+-+-'   
       |             | .-AS-.                  | |       
       |             '-+----+--new-column-name-' |       
       '-exposed-name.*--------------------------'       

列値は、選択リストを最終的な結果表 R に適用することによって作成されます。選択リストとは、SELECT 節に指定された名前または式であり、R は副選択のうち直前の操作の結果です。例えば、指定されている節が SELECT、FROM、および WHERE だけの場合、R は WHERE 節の結果になります。
ALL
最終結果表の行すべてをそのまま保持し、冗長な重複を削除しません。 これはデフォルトです。
DISTINCT
最終結果表の中に重複行があれば、 その中の 1 つを除き、それ以外のすべてを削除します。 DISTINCT を使用した場合、結果表のストリング列を LOB タイプ、LOB を基にした特殊タイプ、または構造化タイプにすることはできません。DISTINCT は、1 つの副選択で複数回使用することができます。 これには、SELECT DISTINCT、選択リストまたは HAVING 節の集約関数での DISTINCT の使用、 および副選択の副照会などがあります。

2 つの行が互いに重複していると言えるのは、最初の行の各値が 2 番目の行の対応する値に等しい場合だけです。 重複を判別する場合、双方が NULL 値であれば等しいものと見なされ、同じ数値であれば 10 進浮動小数点表記が異なっていても等しいものと見なされます。 例えば、-0 は +0 と等しく、2.0 は 2.00 と等しいです。 10 進浮動小数点特殊値もそれぞれ等しいものと見なされます。 -NAN は -NAN と等しく、-SNAN は -SNAN と等しく、-INFINITY は -INFINITY と等しく、INFINITY は INFINITY と等しく、SNAN は SNAN と等しく、NAN は NAN と等しいです。

列のデータ・タイプが 10 進浮動小数点で、同じ数値の複数の表記が列に存在する場合、SELECT DISTINCT に対して戻される特定の値は、列内の表記のうち任意のいずれかになります。詳しくは、数値比較を参照してください。

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

選択リストの表記法

*
R の列を識別する名前のリストを表します。 ただし、IMPLICITLY HIDDEN として定義されている列は除外されます。 リスト内の最初の名前は R の最初の列、2 番目の名前は R の 2 番目の列、 というようになります。

名前のリストは、その SELECT 節の入ったプログラムのバインド時に確立されます。 したがって、* (アスタリスク) では 表参照の入ったステートメントのバインド後に表に追加された列は識別されません。

expression
結果列の値を指定します。 有効な SQL 言語エレメントである任意の式にできますが、 普通は列名を入れます。 選択リストで使用される各列名は、R の列を明確に識別するものでなければなりません。式の結果タイプを、行タイプにすることはできません (SQLSTATE 428H2)
new-column-name または AS new-column-name
結果列の名前を指定または変更します。 この名前は修飾してはならず、ユニークである必要もありません。 列名の後の使用方法は、次のように限定されています。
  • AS 節に指定された new-column-name は、その名前がユニークであれば、ORDER BY 節で使用することができます。
  • 選択リストの AS 節に指定された new-column-name を、副選択の他の節 (WHERE 節、GROUP BY 節、または HAVING 節) で使用することはできません。
  • AS 節に指定された new-column-name を、UPDATE 節で使用することはできません。
  • AS 節に指定された new-column-name は、ネストした表式、共通表式、および CREATE VIEW の全選択の外部で認識されます。
exposed-name.*
結果表の列を指定する名前のリストを表します。 この名前は exposed-name によって示されます。ただし、IMPLICITLY HIDDEN として定義されている列は除外されますexposed-name は、表名、ビュー名、ニックネーム、 または相関名のいずれかにすることができ、FROM 節で指定された表、ビュー、 またはニックネームを指定するものでなければなりません。 リスト内の最初の名前は表、ビュー、あるいはニックネームの最初の列、 2 番目の名前は表、ビュー、またはニックネームの 2 番目の列を識別する、 というようになります。

名前のリストは、その SELECT 節の入ったステートメントのバインド時に確立されます。 したがって、ステートメントのバインド後に表に追加された列は、 * によって識別されません。

SELECT の結果の列の数は、命令形式の選択リスト (つまり、 ステートメントの準備時に設定されたリスト) の式の数と同じであり、 500 (4K ページ・サイズの場合) または 1012 (8K、16K、 32K ページ・サイズの場合) を超えることはできません。

ストリング列に関する制限

選択リストに可変長文字ストリングを使用した場合の制限については、文字ストリングを参照してください。

選択リストの適用

選択リストを R に適用した結果は、 GROUP BY または HAVING が使用されているかどうかによって異なる場合があります。 その結果について、次の 2 つのリストで説明します。

GROUP BY または HAVING が使用されている場合

GROUP BY または HAVING のどちらも使用されていない場合

どちらの場合も、結果の n 番目の列には、 命令形式の選択リストにある n 番目の式を適用することによって指定された値が入ります。

結果列の NULL 属性

結果列は、以下から得られた場合には、NULL 値を使用できません。
  • NULL 値が許されない列
  • 定数
  • COUNT または COUNT_BIG 関数
  • 標識変数を持たないホスト変数
  • NULL を使用できるオペランドが含まれていないスカラー関数または式
  • NOT NULL データ・タイプ制約で定義される緩やかに型付けされた特殊タイプである結果タイプを持つ式
結果列が以下から得られた場合は、NULL 値を使用できます。
  • COUNT または COUNT_BIG 以外の集約関数
  • NULL 値が可能な列
  • NULL を使用できるオペランドが含まれているスカラー関数または式
  • 等しい値を引数とする NULLIF 関数
  • 標識変数、 SQL パラメーター、SQL 変数、またはグローバル変数を持つホスト変数
  • 選択リスト内の対応項目の少なくとも 1 つが NULL 可能な場合のセット演算の結果
  • 演算式から得られた演算式またはビューの列で、 そのデータベースが dft_sqlmathwarn を Yes に設定して構成されているもの
  • スカラー副選択
  • 間接参照操作
  • A GROUPING SETS grouping-expression

結果列の名前

結果列のデータ・タイプ

SELECT の結果の各列は、その列の派生元の式のデータ・タイプとなります。

結果列のデータ・タイプ
数値列の名前 列のデータ・タイプと同じ。DECIMAL 列の場合は精度と位取りも同じ。 DECFLOAT 列の場合は精度が同じ。
定数 定数のデータ・タイプと同じ。
任意の数値変数の名前 変数のデータ・タイプと同じで、DECIMAL 変数については精度と位取りも同じ。 DECFLOAT 変数については精度が同じ。
ストリング列の名前 列のデータ・タイプと同じで、長さ属性も同じ。
ストリング変数の名前 変数のデータ・タイプと同じ (同じ長さ属性); 変数のデータ・タイプが SQL データ・タイプと同じではない場合 (例えば、 C において NUL 文字で終了するストリング)、結果列は可変長ストリングになります。
日付/時刻の列の名前 列のデータ・タイプと同じ。
ユーザー定義タイプ列の名前 列のデータ・タイプと同じ。
参照タイプ列の名前 列のデータ・タイプと同じ。