SELECT 文節
SELECT 文節は、最終的な結果表の列を指定します。
.-ALL------. >>-SELECT--+----------+-----------------------------------------> '-DISTINCT-' >--+-*-------------------------------------------+------------->< | .-,---------------------------------------. | | V | | '---+-expression--+---------------------+-+-+-' | | .-AS-. | | | '-+----+--column-name-' | +-table-name.*------------------------+ +-view-name.*-------------------------+ '-correlation-name.*------------------'
列の値は、R に 選択リスト を適用することによって生成されます。 選択リストは SELECT 文節に指定する名前または式です。R は、副選択でのその前の演算結果です。 例えば、 SELECT、 FROM、 および WHERE の文節だけを指定した場合、R は WHERE 文節の結果です。
- ALL
- 最終的な結果表のすべての行を選択します。重複行の除去は行いません。これはデフォルトです。
- DISTINCT
- 最終的な結果表にある重複行の組から、1 行だけを残して他の行をすべて除去します。
2 つの行が互いに重複したものとして扱われるのは、一方の行にあるそれぞれの値が、もう一方の行の対応する値にすべて等しい場合だけです。
(重複行を判別する場合、NULL 値どうしは等しいものとされます。)
除去する値を判別するために、照合順序も使用されます。
選択リスト に DATALINK または XML 列、あるいは XML データ・タイプの値を戻す式が入っている場合、DISTINCT は使用できません。
列アクセス制御は SELECT DISTINCT の操作に影響しません。重複行の除去は、マスク値ではなく、元の列値に基づきます。ただし、列マスクの適用後、最終結果表内のマスク値が SELECT DISTINCT による一意性を反映しない可能性があります。
SELECT DISTINCT の結果を直接的または間接的に派生させる列に列マスクが適用される場合、SELECT DISTINCT から非 deterministic の結果が戻されることがあります。以下の条件は、非 deterministic の結果が戻されるいくつかの例を示しています。- 列マスクの定義が列マスクの適用先の表にある他の列を参照している。
- 列が組み込みスカラー関数 (COALESCE、IFNULL、NULLIF、MAX、 MIN、LOCATE など) の引数で参照されている。
- 列が集約関数の引数で参照されている。
- 列が式に組み込まれ、その式に非 deterministic 関数かまたは外部アクションのある関数が含まれている。