SELECT句

SELECT句は、各入力行を問合せ結果に表示される新しいレコードに変換します。SELECT句は、select star形式と射影形式の2つの形式で指定されます。

select star形式
select star形式では、SELECT句に単一の星記号(*)が含まれます。この場合、SELECT句はno-opです。単に行の入力順序を返します。
投影形式
射影形式では、SELECT句に式のリストが含まれます。各式はオプションで名前に関連付けられます。この場合、リストされている式と関連付けられている名前は、それぞれフィールド式とフィールド名として参照されます。

構文

select_clause ::= SELECT [DISTINCT] select_list

select_list ::= [hints] 
   (STAR | (expression AS id ("," expression AS id)*))

セマンティクス

射影形式では、SELECT句によって入力行ごとに新しいレコードが作成されます。この場合、SELECT句で作成されるレコードには、フィールド式ごとに1つのフィールドがあり、フィールドはフィールド式と同じ順序で配置されます。各フィールドの値は、対応するフィールド式で計算される値で、その名前はASキーワードによって指定された名前です。また、明示的に(ASキーワードを使用して)フィールド名が指定されていない場合は、問合せのコンパイル中に内部的に生成されます。有効なレコードを作成するには、フィールド名を一意にする必要があります。さらに、各フィールドの値は1つの項目のみである必要があります。このために、次の2つの暗黙的な変換が採用されています。
  1. フィールド式の結果が空の場合、作成したレコードの対応するフィールドの値としてNULLが使用されます。
  2. コンパイラは、フィールド式が複数の項目を返すことができると判断した場合、条件付き配列コンストラクタを使用してフィールド式をラップします。配列とマップのコンストラクタの項を参照してください。実行時に、配列は、フィールド式が実際には複数の項目を返す場合にのみ作成されます。その場合、返された項目は作成された配列に挿入され、作成されたレコードの対応するフィールドの値として使用されます。

前述のセマンティクスは、SELECT句によって生成されるすべてのレコードのフィールド数とフィールド名が同じであることを意味しています。その結果、問合せの結果セットのすべてのレコードを含むコンパイル時に、レコード・タイプを作成できます。このレコード・タイプは、作成された各レコードに関連付けられているタイプであり、アプリケーションでプログラム的に使用できます。

SELECT句にはオプションのDISTINCTキーワードを含めることができます。SELECT句にDISTINCTキーワードが含まれる場合、選択した重複行のセットごとにコピーが1つのみ返されます。重複行とは、SELECTリストに一致する値がある行です。問合せでは、SELECTリストに指定されたすべての列の値の組合せを使用して一意性が評価されます。例6-40を参照してください。値間の等価性は、"="演算子のセマンティクスを使用してチェックされます。値比較演算子の項を参照してください。

SELECT式がグループ化式である場合、SELECTリストの式は、グループ化式(GROUP BY句内(ある場合))、集計関数、またはグループ化式や集計関数に加えて作成された式である必要があります。

ノート:

SELECT句には1つ以上のヒントが含まれることもあり、問合せプロセッサで問合せに使用する索引を選択するのに役立ちます。最適な適用可能索引の選択の項を参照してください。

例6-35 SELECT句

SELECT * FROM users

例6-36 SELECT句

年齢が30歳を超えるユーザーのIDと姓を選択します。この問合せを作成する4つの異なる方法を示して、表の最上位レベルの列にアクセスできる異なる方法を示します。

SELECT id, lastName FROM users WHERE age > 30
SELECT users.id, lastName FROM users WHERE users.age > 30
SELECT $u.id, lastName FROM users $u WHERE $u.age > 30
SELECT u.id, lastName FROM users u WHERE users.age > 30

例6-37 SELECT句

年齢が30歳を超えるユーザーのIDと姓を選択し、IDでソートされた結果を返します。IDがユーザー表の主キーであるため、この場合はソートが可能です。

SELECT id, lastName FROM users WHERE age > 30 ORDER BY id

例6-38 SELECT句

ユーザーの個別の年齢のリストを選択します。

SELECT DISTINCT age FROM users
出力:
{"age":25}
{"age":43}
{"age":22}

例6-39 SELECT句

ユーザーのothernamesのリストを選択します。SELECTコマンドの出力が比較され、重複が最終出力から削除されることに注意してください。

SELECT otherNames FROM Users
出力:
{"otherNames":null}
{"otherNames":null}
{"otherNames":[{"first":"Johny","last":"BeGood"}]}
SELECT DISTINCT otherNames FROM Users
出力:
{"otherNames":null}
{"otherNames":[{"first":"Johny","last":"BeGood"}]}

例6-40 SELECT句

ユーザーのfirstnameおよびothernamesのリストを選択します。問合せでは、SELECTリストに指定されたすべての列の値の組合せを使用して一意性が評価されることに注意してください。

SELECT firstName, otherNames FROM Users
出力:
{"firstName":"Peter","otherNames":null}
{"firstName":"Mary","otherNames":null}
{"firstName":"John","otherNames":[{"first":"Johny","last":"BeGood"}]}
SELECT DISTINCT firstName, otherNames FROM Users
出力:
{"firstName":"Peter","otherNames":null}
{"firstName":"Mary","otherNames":null}
{"firstName":"John","otherNames":[{"first":"Johny","last":"BeGood"}]}