データベース内のテーブルから行を検索します。
Synopsis
SELECT [DISTINCT | ALL] [TOP parameter]
  select-item
  [INTO host-variable-list]
  FROM [%INORDER | %FULL] table-reference-list [[AS] alias]
  [WHERE condition-expression]
  [GROUP BY scalar-expression-list]
  [HAVING condition-expression]
  [ORDER BY item-order-list [ASC | DESC] ]

Where select-item may be:

  [alias.]*

  scalar-expression [[AS] column] [,scalar-expression [[AS] column]]...
引数
DISTINCT
ALL
オプション — DISTINCT キーワードは、返された各行が、指定されたフィールドに対して一意の値を持つように指定します。このキーワードを使用すると、SELECT は余分な行を破棄します。
ALL キーワードは、SELECT 条件を満たすすべての行を返すように指定します。これは Caché SQL の既定です。ALL キーワードは、SQL の互換性のために指定されたものです。
TOP parameter オプション — 整数あるいは整数に解釈される変数のいずれかです。表示する行数を指定します。この既定は、SELECT 条件を満たすすべての行を表示します。
select-item 検索する 1 つまたは複数の列。複数の列はコンマで区別されたリストで指定。* シンボルですべての列を検索することも可能。
INTO host-variable-list オプションselect-item 値を格納する 1 つまたは複数のホスト変数。詳細は、"INTO" 節を参照してください。
FROM table-reference-list データを検索する テーブル。複数のテーブルは、コンマ区切りのリストとして指定できます。オプションで、各テーブル名は alias として割り当てられます。2 つ以上のテーブルを指定する場合、Caché は複数のテーブルに JOIN を実行して、JOIN 処理の結果テーブルからデータを取得します。テーブルあるいはビューのあらゆる組み合わせを指定できます。クエリ実行を最適化する %INORDER キーワードや %FULL キーワードも指定できます。詳細は、"FROM" 節を参照してください。
WHERE condition-expression オプション — 検索するデータにパラメータを指定する修飾子。詳細は、"WHERE" 節を参照してください。
GROUP BY scalar-expression-commalist オプション — 検索したデータをどのように格納するかを指定する 1 つまたは複数のスカラ式のコンマ区切りリスト。 名を含む場合もあります。詳細は、"GROUP BY" 節を参照してください。
HAVING condition-expression オプション — 検索するデータにパラメータを指定する修飾子。詳細は、"HAVING" 節を参照してください。
ORDER BY item-order-list オプション — select-item、あるいは行が表示される順番を指定する項目のコンマ区切りリスト。各項目は、オプションの ASC (昇順) や DESC (降順) を持ちます。既定は昇順です。ORDER BY 節は、クエリの結果に対してのみ使用できます。サブクエリである SELECT 文 (例えば UNION 文) には使用できません。詳細は、"ORDER BY" 節を参照してください。
range-variable テーブル名の定義済みエイリアス
scalar-expression フィールド識別子
column フィールドのエイリアス
概要
SELECT 文は、Caché データベースのデータを検索します。最も単純な形式では、1 つ以上の項目を単一のテーブルから検索します。この場合、それらの項目は select-item リストで指定し、テーブルは FORM table-reference 節で指定します。
Caché は、SELECT の成功か失敗かを示した、ステータス変数 SQLCODE を返します。また、SELECT 演算は、%ROWCOUNT ローカル変数を、選択された行の番号に設定します。
SELECT 文は独立したクエリとして使用することも、大きな文の一部、つまりサブクエリとして使用することもできます。
UNION 文で、1 つまたは複数の SELECT 文を単独のクエリに結合できます。クエリが単独の SELECT 文から構成されている場合、SELECT 文は ORDER BY 文で完了でき、クエリが複数の SELECT 文の UNION である場合、UNION 文は ORDER BY 文で完了できます。
必須節
以下は、すべての SELECT 文に必要な節です。
オプションの節
以下のオプションの節は、FORM 節が返す仮想テーブルで動作します。すべてオプションですが、使用する場合は正しい順序で指定する必要があります。
TOP キーワード
TOP キーワードは、SELECT 文が、指定された行数のみを返すように指定します。返された仮想テーブルの “一番上” に表示される指定された行数を返します。パラメータ引数を使用すると、返された行が変数で指定されます。 リテラル引数は返す行のリテラル数を指定します。
以下のクエリは、データベースに格納される順番で Sample.Person から取得する最初の 20 行を返します。
SELECT TOP 20 Home_State, Name FROM Sample.Person
以下のクエリは、データベースに格納される順序で Sample.Person から取得する最初の 20 個の個別 Home_State 値を返します。前のクエリによって返された重複した Home_State 値を持つ行は、ここでスキップされます。
SELECT DISTINCT TOP 20 Home_State FROM Sample.Person
以下のクエリは、最初の 20 個の個別 Home_State 値を返します。しかし、ここでは、“最初” の行は、Sample.Person 内の行のすべての順序を ORDER BY 節に反映します。
SELECT DISTINCT TOP 20 Home_State FROM Sample.Person 
      ORDER BY Home_State
Select-item
これは、SELECT 文の必須要素です。それぞれの SELECT 文は select-item と FROM 節を持つ必要があります。通常、select-item は、FROM 節で指定されたテーブル内のフィールドを参照します。
select-item には、以下のものを指定できます。
AS キーワード
select-item を指定する場合、オプションの AS キーワードを使用して、select-item に対するクエリによって返される列名を指定することができます。
select-item AS alias
AS 節を省略した場合、Caché SQL は、“Expression_1” または “Aggregate_3” などの一意の列名を提供します。ここの番号は、クエリによって返される、フィールドの列番号を示します。AS キーワードは、リスト内の各 select-item の直後に続きます。AS キーワードそれ自体は必須項目ではありませんが、構文を明確にします。
AS 節で提供される名前は、有効な "識別子" である必要があります。
以下の例では、テーブル列 “Home_State” は、“US_State_Abbrev” という名前に変更されます。
SELECT Name, Home_State AS US_State_Abbrev 
FROM Sample.Person
以下の例では、AVG 関数で作成された集約フィールド列は、“AvgAge” という名前を付けられます。既定の名前は “Aggregate_3” (列 3 の集約フィールド) です。
SELECT Name, Age, AVG(Age) AS AvgAge FROM Sample.Person
以下の例は、AS キーワードがここで省略されていることを除き、前と同じです。このキーワードの使用は推奨されますが、必須ではありません。
SELECT Name, Age, AVG(Age) AvgAge FROM Sample.Person
FROM 節
FROM table-reference-list 節は、コンマで区切られた 1 つまたは複数のテーブル名やビュー名 (もしくは両方) を指定する必須の節です。
テーブル名は、alias (オプションの AS キーワードの有無に関わらず) を受け取ることができます。フィールド名を指定する場合に、そのテーブルを示すために使用できます。詳細は、"FROM" を参照してください。
以下の 3 つの SELECT 文は、2 つの個別のテーブルに対する行カウントと、両方のテーブルを指定する SELECT に対する行カウントを示しています。後者の例は、より大きなテーブル、デカルト積になります。この場合、1 番目のテーブルのそれぞれの行が、2 番目のテーブルのそれぞれの行に一致します。これは、Cross Join と言う処理です。
SELECT COUNT(*)
FROM Sample.Company
SELECT COUNT(*)
FROM Sample.Vendor
SELECT COUNT(*)
FROM Sample.Company, Sample.Vendor
多くの場合、cross join の広範囲なデータ重複は望ましくありません。その他の join タイプをお勧めします。Join は、FROM 節または WHERE 節のいずれかで指定されます。詳細は、"JOIN" を参照してください。
Join 処理がコンマ区切りの table-reference リストで実行される順序は、FROM 節内のオプションの %INORDER キーワードおよび %FULL キーワードを使用することにより最適化できます。詳細は、"FROM" 節のリファレンス・ページを参照してください。
AS キーワード
table-reference を指定する場合、オプションの AS キーワードを使用して、そのテーブルまたはビュー名のエイリアスを指定できます。
table-reference AS alias
これは、以下に示すように、一般的には、ソース・テーブルで select-item のフィールドを指定するために使用されます。
SELECT TOP 50 t1.*, t2.Name 
      FROM Sample.Person AS t1, Sample.Company AS t2
AS 節で提供される名前は、有効な "識別子" である必要があります。
AS キーワードは、希望するエイリアスを持つ FROM 節内の各テーブル名の直後に続きます。
AS キーワードそれ自体は必須項目ではありませんが、構文を明確にします。以下の例は、AS キーワードがここで省略されていることを除き、前と同じです。このキーワードの使用は推奨されますが、必須ではありません。
SELECT TOP 50 t1.*, t2.Name 
      FROM Sample.Person t1, Sample.Company t2
WHERE 節
WHERE 節は、クエリ選択から特定の行を適格とするか、もしくは不適格とします。適格な行とは、condition-expression が真である行です。condition-expression は、AND、OR、および NOT 演算子によってリンク可能な論理テスト (述語) のリストです。
SQL の述語は以下のカテゴリーに分類されます。
詳細は、"WHERE" 節のリファレンス・ページを参照してください。
GROUP BY 節
GROUP BY 節はクエリの結果行をとり、単独または複数のデータベース列によって結果行を個別のグループに分割します。SELECT を GROUP BY 節と併せて使用するとき、GROUP BY フィールドの個別の各値に対して、1 行が検索されます。GROUP BY 節は概念的には Caché の拡張子である %FOREACH と似ていますが、%FOREACH はクエリ全体を制約することなく、サブ母集団で集約の選択を許可するのに対し、GROUP BY はクエリ全体で実行します。以下はその例です。
SELECT Home_State, COUNT(Home_State) AS Population
 FROM Sample.Person
  GROUP BY Home_State
このクエリは、各個別の Home_State に対し 1 行を返します。
詳細は、"GROUP BY" 節のリファレンス・ページを参照してください。
HAVING 節
HAVING 節はグループで実行する WHERE 節と同じ働きをします。一般的に、GROUP BY 節または %AFTERHAVING キーワードとの組み合わせで使用します。HAVING 節は、クエリ選択から特定の行を適格とするか、もしくは不適格とします。適格な行とは、condition-expression が真である行です。condition-expression は、AND、OR、および NOT 演算子によってリンク可能な論理テスト (述語) のリストです。詳細は、"HAVING" 節のリファレンス・ページを参照してください。
ORDER BY 節
ORDER BY 節は、select-item、あるいは行が表示される順番を指定する項目のコンマ区切りリストが後続する、ORDER BY キーワードで構成されます。各項目は、オプションの ASC (昇順) や DESC (降順) を持ちます。既定は昇順です。ORDER BY 節は、クエリの結果に対してのみ使用できます。サブクエリである SELECT 文 (例えば UNION 文) には使用できません。詳細は、"ORDER BY" 節のリファレンス・ページを参照してください。
以下の例は、データベースのすべての行に選択されたフィールドを返し、年齢の昇順でこれらの行を並べます。
SELECT Home_State, Name, Age 
FROM Sample.Person
ORDER BY Age
以下の 4 つの例は、SELECT 節の異なる組み合わせを使用して、同様のクエリを実行します。これらの節は、正しい順序で指定する必要があります。4 つの例ではすべて、3 つのフィールドが Sample.Person テーブルから選択されています。Name、Home_State、およびAge、および 2 つのフィールド (AvgAge と AvgMiddleAge) が計算されます。
HAVING/ORDER BY
以下の例では、AvgAge 計算フィールドは、Sample.Person 内のすべてのレコードで計算されます。HAVING 節は、Sample.Person 内のすべてのレコードで 40 を超える平均年齢を計算して、AvgMiddleAge 計算フィールドを設定します。したがって、各行は AvgAge および AvgMiddleAge と同じ値を持ちます。ORDER BY 節は、Home_State フィールド値によって、行の表示をアルファベット順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 HAVING Age > 40
 ORDER BY Home_State
WHERE/HAVING/ORDER BY
以下の例では、WHERE 節は、指定された北東の 7 つの州に選択肢を限定します。AvgAge 計算フィールドは、これらの Home_States のレコードで計算されます。HAVING 節は、指定された Home_States 内のレコードで 40 を超える平均年齢を計算して、AvgMiddleAge 計算フィールドを設定します。したがって、各行は AvgAge および AvgMiddleAge と同じ値を持ちます。ORDER BY 節は、Home_State フィールド値によって、行の表示をアルファベット順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY')
 HAVING Age > 40
 ORDER BY Home_State
GROUP BY/HAVING/ORDER BY
GROUP BY 節は、AvgAge 計算フィールドが、各 Home_State グループに対して個別に計算されるようにします。また、GROUP BY 節は、各 Home_State で使用される最初のレコードに対する出力表示を制限します。HAVING 節は、各 Home_State グループ内で 40 を超える平均年齢を計算して、AvgMiddleAge 計算フィールドを設定します。ORDER BY 節は、Home_State フィールド値によって、行の表示をアルファベット順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 GROUP BY Home_State
 HAVING Age > 40
 ORDER BY Home_State
WHERE/GROUP BY/HAVING/ORDER BY
WHERE 節は、指定された北東の 7 つの州に選択肢を限定します。GROUP BY 節は、AvgAge 計算フィールドが、7 つの各 Home_State グループに対して個別に計算されるようにします。また、GROUP BY 節は、指定された Home_State で使用される最初のレコードに対する出力表示を制限します。HAVING 節は、7 つの各 Home_State 内で 40 を超える平均年齢を計算して、AvgMiddleAge 計算フィールドを設定します。ORDER BY 節は、Home_State フィールド値によって、行の表示をアルファベット順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY')
 GROUP BY Home_State
 HAVING Age > 40
 ORDER BY Home_State
関連項目