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 が使用されている場合
- 選択リストで使用される式 X (集約関数ではない) には、
以下を指定した GROUP BY 節が必要です。
- 各式または列名が R の列を明確に識別する grouping-expression (group-by-clauseを参照) または
- 個別の grouping-expression として X で参照される R の各列
- 選択リストは R のそれぞれのグループに対して適用され、
その結果には、R にあるグループと同数の行が入ります。
選択リストが R の 1 つのグループに適用されるとき、
そのグループは、選択リストの集約関数の引数のソースになります。
GROUP BY または HAVING のどちらも使用されていない場合
- 選択リストに集約関数が入っていないか、
または選択リスト内の各 column-name が集約関数の中に指定されているか、
あるいは相関列参照であるかのいずれかでなければなりません。
- 選択リストが集約関数を備えていない場合、選択リストは R のそれぞれの行に対して適用され、
その結果には R にある行と同数の行が示されます。
- 選択リストが集約関数のリストである場合、関数の引数は R から与えられ、
選択リストを適用した結果は 1 行となります。
どちらの場合も、結果の 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
結果列の名前
- AS 節が指定されている場合、
結果列の名前は、AS 節に指定された名前になります。
- AS 節の指定がなく、相関節に列リストが指定されている場合、結果列の名前は、相関列リスト内の対応する名前になります。
- AS 節も列リストも相関節に指定されておらず、結果列が単一の列からのみ派生している (関数も演算子も関係していない) 場合、結果列名はその列の非修飾名になります。
- AS 節も列リストも相関節に指定されておらず、結果列が単一の SQL 変数または SQL パラメーターからのみ派生している (関数も演算子も関係していない) 場合、結果列名はその SQL 変数または SQL パラメーターの非修飾名になります。
- AS 節も列リストも相関節に指定されておらず、結果列が間接参照操作を使用して派生している場合、結果列名は間接参照操作のターゲット列の非修飾名になります。
- それ以外の結果列には、名前が付けられません。
システムは、これらの列に対して一時的な数字を (文字ストリングとして) 割り当てます。
結果列のデータ・タイプ
SELECT の結果の各列は、その列の派生元の式のデータ・タイプとなります。
式 |
結果列のデータ・タイプ |
数値列の名前 |
列のデータ・タイプと同じ。DECIMAL 列の場合は精度と位取りも同じ。
DECFLOAT 列の場合は精度が同じ。 |
定数 |
定数のデータ・タイプと同じ。 |
任意の数値変数の名前 |
変数のデータ・タイプと同じで、DECIMAL 変数については精度と位取りも同じ。
DECFLOAT 変数については精度が同じ。 |
ストリング列の名前 |
列のデータ・タイプと同じで、長さ属性も同じ。 |
ストリング変数の名前 |
変数のデータ・タイプと同じ (同じ長さ属性);
変数のデータ・タイプが SQL データ・タイプと同じではない場合 (例えば、
C において NUL 文字で終了するストリング)、結果列は可変長ストリングになります。 |
日付/時刻の列の名前 |
列のデータ・タイプと同じ。 |
ユーザー定義タイプ列の名前 |
列のデータ・タイプと同じ。 |
参照タイプ列の名前 |
列のデータ・タイプと同じ。 |