データベース内のテーブルから行を検索します。
Synopsis
SELECT [ALL | DISTINCT] [TOP {parameter | literal}]
select-item
[INTO host-variable-list]
FROM table-reference
[WHERE condition-expression]
[GROUP BY scalar-expression-commalist]
[HAVING condition-expression]
Where select-item may be:
[range-variable .] *
scalar-expression [[AS] column]
SELECT 文は独立したクエリとして使用することも、大きな文の一部、つまりサブクエリとして使用することもできます。
Caché は、SELECT の成功か失敗かを示した、ステータス変数 SQLCODE を返します。また、SELECT 演算は %ROWCOUNT ローカル変数を、選択された行の番号に設定します。
UNION 文で、単一もしくは複数の SELECT 文を単独のクエリに結合できます。クエリが単独の SELECT 文から構成されている場合、SELECT 文は
ORDER BY 文で完了でき、クエリが複数の SELECT 文の
UNION である場合、UNION 文は
ORDER BY 文で完了できます。
-
ALL または DISTINCT キーワード。ALL キーワードは、一致した行をすべて返すように指定します。 これが既定です。DISTINCT キーワードは、返された行がすべて一意になるように指定します。 このキーワードを使用すると、SELECT は余分な行を削除します。
-
TOP キーワード。SELECT 文が、返された仮想テーブルの最初に表示される行だけを返すように指定します。パラメータ引数を使用すると、返された行が変数で指定されます。リテラル引数は返す行のリテラル数を指定します。
以下は必要な
FROM 節です。検索される行から 1 つ以上のテーブル、ビューまたは
JOIN 式を指定します。
以下のオプション要素は、FORM 節が返す仮想テーブルで動作します。すべてオプションですが、使用する場合は正しい順序で指定する必要があります。
-
WHERE 節は、行が一致する 1 つ、または複数の条件制約を指定します。制約の詳細については
条件式 を参照してください。
-
GROUP BY 節は、カンマで区切られた列のリストを指定します。列と一致する値を使用してクエリの結果セットをサブセットに組み込み、返された行の順番を決めます。GROUP BY により、列と同様スカラ式も可能になります。
-
HAVING 節は、単独もしくは複数の条件制約を指定します。制約の詳細については、
条件式 を参照してください。 通常、GROUP BY 節で指定した各グループで動作します。
-
SELECT コマンドが Caché のデータベースからデータを検索する場合、単独または複数の select-item のコンマで区切られたリストで実行されます (select-item-commalist 引数の形式)。
select-item は、ベーステーブル (オプションで range-variable で変更されたもの) のすべての列を参照するアスタリスク (*) と、スカラ式 (オプションで AS 節で変更されたもの) のいずれかで構成されています。
select-item がアスタリスク構文を使用する場合、テーブルのすべての列の参照を指定します。オプションの range-variable とピリオド (.) は、select-item を限定して、特定のテーブルのすべての列 (Students.* など) を指定するようにします。select-item が特に限定されておらず、アスタリスクがあるだけの場合、それがリストの唯一の項目になります。
select-item がスカラ式である場合は、識別子、値、演算子を組み合わせます。指定したタイプのスカラ値の特定の結果に評価します。最も単純な select-item は列の名前で、数字のスカラ式です。
スカラ式を指定する場合、オプションの AS 節はクエリから返される列の名前を指定します。 AS それ自体は必須項目ではありませんが、構文を明確にします。
以下のセクションは、SELECT 文の要素を説明します。
これは、SELECT 文の主要な要素です。一般的には以下のようになります。
-
コンマで区切られた、列名 (フィールド) のリスト
SELECT p.name,p.sex,p.dob FROM MyTable p
-
SELECT salary + commission FROM MyTable
-
組み込みの Caché 変換関数の 1 つを持つ列のリスト
SELECT UCASE(name) FROM MyTable
-
すべての列を選択する、ワイルドカード文字 (
*)。以下はその例です。
-
余剰の行を削除する DISTINCT 節。以下はその例です。
SELECT DISTINCT city FROM MyTable
これによって、各個別の都市名に対して、1 つの行を返します。
-
集約関数は、常に単独の値を返します。集約関数の引数は、以下のいずれかになります。
-
単独の列名 クエリによって選択された行の NULL でないすべての値に対して、集約を計算します。
SELECT AVG(age) FROM MyTable
-
ワイルドカード (*) テーブルの行数を計算するために、COUNT 関数とともに使用されます。
SELECT COUNT(*) FROM MyTable
-
選択個別関数 余剰値を消去することで、集約を計算します。
SELECT COUNT(DISTINCT color) FROM MyTable
ANSI SQL は単独の SELECT 文内での列名と集約関数の組み合わせを許可しませんが、Caché は以下を許可することにより、標準を拡張します。
SELECT name, COUNT (students) FROM MyTable
-
%FOREACH を使用する集約関数。これによって、単独または複数の列の各個別の値に対して集約関数が計算されます。
SELECT AVG (salary %FOREACH (Division,Dept)) FROM MyTable
-
%AFTERHAVING を使用する集約関数。これよって、HAVING 節で指定されるサブ母集団で集約関数が計算されます。
SELECT AVG(test_score %AFTERHAVING) FROM MyTable
HAVING (test_score > AVG (test_score))
以上の文は、スコアが平均よりも高いすべての生徒に対して、テスト・スコアの平均を返します。
-
Caché ObjectScript 外部関数は、データベースの列上でオペレーティングを呼び出します。
SELECT $$REFORMAT^ABC(name)FROM MyTable
Caché 構成マネージャの (
[詳細] タブの
[SQL] 内にある) [SQL 文に外部関数を許可する] オプションが指定されている場合にのみ、SQL 文内の外部関数を実行できます。
% 文字で始まる外部関数は呼び出すことができません。
FROM table-reference-list
table-reference-list は、コンマで区切られたテーブル名やビュー名 (もしくは両方) のリストです。以下はその例です。
SELECT fields
FROM patients,states
WHERE search-condition
この例では、WHERE 節はクエリ選択から特定の行を認証するか、もしくは認証を取り消します。認証する行は、検索条件が真であるとするものです。検索条件は、AND、OR、NOT 演算子からリンク可能な、論理テスト (述語) のリストです。
SQL 比較述語
| 述語 |
演算 |
| = |
等しい |
| <> |
等しくない |
| > |
より大きい |
| < |
より小さい |
| >= |
以上 |
| <= |
以下 |
SELECT fields FROM MyTable
WHERE birthdate < '01/01/60'
Caché の %STARTSWITH 拡張子も利用できるので、部分的一致も実行できます。以下はその例です。
SELECT fields FROM MyTable
WHERE Name %STARTSWITH 'SM'
SQL は照合 (値がソートされる順番) という点から比較演算子を定義します。まったく同様の方法で照合する場合の 2 つの値は等しくなります。2 つ目の値の後に照合される場合、値は別の値よりも大きくなります。例えば、文字列値に対する既定照合は大文字と小文字を区別しません。 例えば以下のようになります。
これは、「より少ない」 と 「より大きい」 の組み合わせと同じ働きをします。以下はその例です。
SELECT fields FROM MyTable
WHERE Balance BETWEEN 100 AND 999
これは、100 から 999 の間のすべてのバランスを返します。
これにより、以下のワイルドカード文字を使用してパターン・マッチングを実行できます。
LIKE ワイルドカード文字
| 文字 |
以下と一致 |
| _ |
単独の文字 |
| % |
0 かそれ以上の文字のシーケンス |
SELECT fields FROM MyTable
WHERE city_state LIKE '%MA%'
上記の文は、'MA' 文字列を含むすべての city_states を検索します。
LIKE 比較演算子は大文字と小文字を区別します。%SQLUPPERを使用し、上記例の 'Ma' のように文字列を受け取ります。
SELECT fields FROM MyTable
WHERE %SQLUPPER(city_state) LIKE '%MA%'
LIKE ESCAPE は、LIKE 述語のエスケープ文字として任意の 1 文字の定義をサポートします。 このエスケープ文字は、直後の文字をワイルドカードやフォーマッティング文字ではなくリテラル文字として解釈するよう指示します。 以下の例では、LIKE ESCAPE を使用して '%_' の値を返しています。
SELECT * FROM MyTable
WHERE symbol_field LIKE '#%#_' ESCAPE '#'
定義されていない値を見つけます。以下はその例です。
SELECT fields FROM MyTable
WHERE name IS NOT NULL
IN には 2 つのフォーマットがあります。 1 つ目は、OR 演算子で複数の等値比較を結合する省略表現として使用します。以下はその例です。
SELECT fields FROM MyTable
WHERE state IN ('CA','NY','TX','FL','PA')
以上の文は、state が括弧のリスト内の値と等しい場合、真と評価します。 リストの要素は定数または式です。 等式テストと同様に、照合が IN 比較に適用されます。
サブクエリで IN を使用し、列の値 (あるいは他の式) がサブクエリの行の値と等しいかどうかをテストできます。 例えば以下のようになります。
SELECT fields FROM MyTable
WHERE state IN
(SELECT state FROM state_tab
HAVING population > AVG(population))
サブクエリは、SELECT リスト内に必ず 1 項目のみ持ちます。
サブクエリが空のセットを評価するか否かをテストするために、サブクエリを使用して処理します。
SELECT t1.disease FROM illness_tab t1 WHERE EXISTS
(SELECT t2.disease FROM disease_registry t2
WHERE t1.disease = t2.disease
HAVING COUNT(t2.disease) > 100)
GROUP BY 節はクエリの結果行をとり、単独または複数のデータベース列によって結果行を個別のグループに分割します。SELECT を GROUP BY 節と併せて使用するとき、GROUP BY フィールドの個別の各値に対して、1 行が検索されます。GROUP BY 節は概念的には Caché の拡張子である %FOREACH と似ていますが、%FOREACH はクエリ全体を制約することなく、サブ母集団で集約の選択を許可するのに対し、GROUP BY はクエリ全体で実行します。以下はその例です。
SELECT Department,Manager
FROM Employees
WHERE Department_Status <> 'Closed'
GROUP BY Department
このクエリは各個別の部署に対し 1 行を返します。
HAVING 節はグループで実行する WHERE 節と同じ働きをします。サブ母集団の集約と、全体の母集団の集約とを頻繁に比較します。以下はその例です。
SELECT Name,Salary,AVG(Salary),
AVG(Salary %AFTERHAVING)
FROM Employees
WHERE City = 'Boston'
HAVING Salary > AVG(Salary)
このクエリは、Boston の全従業員の名前や平均給与と、同じく Boston で給与が平均以上である従業員の給与の平均を検索します。