選択式

SELECT selection table-expression

select-expression では、結果テーブルを指定します。これは、以下の Natural SQL ステートメントで使用します。INSERT | SELECT | UPDATE

このドキュメントでは、次のトピックについて説明します。


選択

ALL
DISTINCT

scalar-expression [[AS]correlation-name],
*

selection は、選択する結果セットテーブルの列を指定します。

構文要素の説明:

構文要素 説明
ALL|DISTINCT
重複行の削除:

select-expression の結果から重複行が自動的に取り除かれることはありません。重複行を取り除く処理を要求するには、キーワード DISTINCT を指定します。

DISTINCT の代わりに ALL を使用することもできます。指定がない場合は ALL とみなされます。

scalar-expression
スカラ式:

単純な列名の代わりに、または列名とともに、スカラ演算子および計算値を与えるスカラ関数を含む一般的なスカラ式を含めることもできます(「スカラ式」も参照)。

例:

SELECT NAME, 65 - AGE 
  FROM SQL-PERSONNEL 
  ...
AS オプションキーワード AS は、列に correlation-name を導入します。
correlation-name
相関名:

結果の列に対するエイリアス名として、scalar-expressioncorrelation-name を割り当てることができます。

correlation-name は一意にする必要はありません。結果の列に correlation-name を指定しない場合、対応する column-name が使用されます(結果の列が列名から派生する場合。派生しない場合は結果テーブルは名前を持ちません)。結果の列の名前は、SELECT ステートメントの ORDER BY 節の列名などに使用できます。

*
アスタリスク表記:

結果テーブルのすべての列が選択されます。

例:

SELECT * 
  FROM SQL-PERSONNEL, SQL-AUTOMOBILES 
  ...

テーブル式

from-clause [where-clause]
[group-by-clause] [having-clause]
[order-by-clause] [fetch-first-clause]

table-expression では、どこから、どのような条件に従って行を選択するかを指定します。

以下では次のトピックについて説明します。

FROM 節

FROM table-reference,…

この節では、結果セットを作成するテーブルを指定します。

テーブル参照

table-name [[AS] correlation-name]
subquery [AS] correlation-name
joined-table

FROM 節に指定したテーブルには、選択リストに使用した列が含まれている必要があります。

単一テーブルを指定するか、サブクエリまたは "ジョイン" 処理(下記参照)による中間テーブルを生成できます。

さまざまなテーブル(つまり、DDM)を 1 つの FROM 節にアドレス指定できるだけでなく、subqueries を指定した場合は table-expression に複数の FROM 節を含めることができるため、関連する基準データベースの識別には、式全体の最初の FROM 節に指定した最初の DDM のデータベース ID(DBID)が使用されます。

table-name にはオプションで correlation-clause を割り当てることができます。subquery の場合は、correlation-clause を割り当てる必要があります。

ジョインテーブル

table-reference

INNER
LEFT [OUTER]
RIGHT [OUTER]
FULL [OUTER]

JOIN table-referenceON join-condition

(joined-table)

joined-table では、"ジョイン" 処理による中間テーブルを指定します。

"ジョイン"は、INNERLEFT OUTERRIGHT OUTER または FULL OUTERJOIN のいずれかです。何も指定しないと、INNER が有効になります。

複数の "ジョイン" 処理をネストできます。つまり、中間結果テーブルを作成するテーブル自体を "ジョイン" 処理または subquery の中間結果テーブルにすることができます。次に後者に joined-table を含めたり、その FROM 節に他の subquery を指定したりすることもできます。

ジョイン条件

INNERLEFT OUTER、および RIGHT OUTER ジョインの場合:

search-condition

FULL OUTER ジョインの場合:

full-join-expression = full-join-expression [AND ]

フルジョイン式

column-name

VALUE
COALESCE

(column-name, )

join-expression 内には、column-names および scalar-function VALUE(または同義語 COALESCE)のみを使用できます。

詳細については、column-name を参照してください。

WHERE 節

[WHERE search-condition]

WHERE 節を使用して行に対する選択条件(search-condition)を指定します。

例:

DEFINE DATA LOCAL 
01 NAME   (A20) 
01 AGE    (I2) 
END-DEFINE 
... 
SELECT * 
  INTO NAME, AGE 
  FROM SQL-PERSONNEL   
  WHERE AGE = 32 
END-SELECT 
...

詳細については、「検索条件」を参照してください。

GROUP BY 節

[GROUP BY column-reference,]

GROUP BY 節では、FROM 節に指定されたテーブルをグループに再配列します。これで、各グループ内のすべての行は GROUP BY 列に対して同じ値を持ちます。

選択リストの各 column-reference は、GROUP BY 列にするか、または aggregate-function 内に指定する必要があります。集積関数は個々のグループ(テーブル全体ではない)に適用されます。結果テーブルにはグループと同じ数の行が含まれます。

詳細については、「列参照」および「集積関数」を参照してください。

例:

DEFINE DATA LOCAL 
1 #AGE     (I2) 
1 #NUMBER  (I2) 
END-DEFINE 
... 
SELECT AGE , COUNT(*)  
  INTO #AGE, #NUMBER 
  FROM SQL-PERSONNEL 
  GROUP BY AGE 
  ...

GROUP BY 節の前に WHERE 節を指定した場合、グループ化が行われる前に WHERE 節を満たさないすべての行が削除されます。

HAVING 節

[HAVING search-condition]

HAVING 節を指定する場合、GROUP BY 節も指定する必要があります。

WHERE 節を使用して結果テーブルから行を削除する場合のように、HAVING 節では search-condition を基準にしてグループを削除します。HAVING 節のスカラ式は、グループごとに単一の値にする必要があります。

詳細については、「スカラ式」および「検索条件」を参照してください。

例:

DEFINE DATA LOCAL 
1 #NAME     (A20) 
1 #AVGAGE   (I2) 
1 #NUMBER   (I2) 
END-DEFINE 
... 
SELECT NAME, AVG(AGE), COUNT(*)  
  INTO #NAME, #AVGAGE, #NUMBER 
  FROM SQL-PERSONNEL 
  GROUP BY NAME 
  HAVING COUNT(*) > 1 
  ...

ORDER BY 節

ORDER BY

sort-key

ASC
DESC

,

INPUT SEQUENCE
ORDER OF table-designator

sort-key

column-name

integer
sort-key-expression

FETCH FIRST 節

FETCH FIRST

1
integer

ROWS
ROW

ONLY

テーブル式の例

例 1

DEFINE DATA LOCAL
01 #NAME      (A20)
01 #FIRSTNAME (A15)
01 #AGE       (I2)
...
END-DEFINE
...
SELECT NAME, FIRSTNAME, AGE
  INTO #NAME, #FIRSTNAME, #AGE
  FROM SQL-PERSONNEL
    WHERE NAME IS NOT NULL
      AND AGE > 20
...
  DISPLAY #NAME #FIRSTNAME #AGE   
END-SELECT
...
END

例 2:

DEFINE DATA LOCAL
01 #COUNT    (I4)
...
END-DEFINE
...
SELECT SINGLE COUNT(*) INTO #COUNT FROM SQL-PERSONNEL   
...