データベースから情報を取得します。
[ WITH temporary-views ] SELECT [ ALL | DISTINCT ] [ row-limitation-option-1 ] select-list [ INTO { hostvar-list | variable-list | table-name } ] [ INTO LOCAL TEMPORARY TABLE { table-name } ] [ FROM from-expression ] [ WHERE search-condition ] [ GROUP BY group-by-expression ] [ HAVING search-condition ] [ WINDOW window-expression ] [ ORDER BY { expression | integer } [ ASC | DESC ], ... ] [ FOR READ ONLY | for-update-clause ] [ FOR XML xml-mode ] [ row-limitation-option-2 ] [ OPTION( query-hint, ... ) ]
temporary-views :
regular-view, ...
| RECURSIVE { regular-view | recursive-view }, ...
regular-view : view-name [ ( column-name, ... ) ] AS ( subquery )
recursive-view : view-name ( column-name, ... ) AS ( initial-subquery UNION ALL recursive-subquery )
row-limitation-option-1 : FIRST | TOP { ALL | limit-expression } [ START AT startat-expression ]
row-limitation-option-2 : LIMIT { [ offset-expression, ] limit-expression | limit-expression OFFSET offset-expression }
limit-expression : simple-expression
startat-expression : simple-expression
offset-expression : simple-expression
simple-expression : integer | variable | ( simple-expression ) | ( simple-expression { + | - | * } simple-expression )
select-list : expression [ [ AS ] alias-name ], ... | * | window-function OVER { window-name | window-spec } [ [ AS ] alias-name ] | sequence-expression
sequence-expression sequence-name [ CURRVAL | NEXTVAL ] FROM table-name
sequence-expression :式を参照してください。
from-expression :FROM 句を参照してください。
group-by-expression :GROUP BY 句を参照してください。
search-condition :探索条件を参照してください。
window-name : identifier
window-expression :WINDOW 句を参照してください。
window-spec :WINDOW 句を参照してください。
window-function : RANK( ) | DENSE_RANK( ) | PERCENT_RANK( ) | CUME_DIST( ) | ROW_NUMBER( ) | aggregate-function
for-update-clause FOR UPDATE | FOR UPDATE cursor-concurrency | FOR UPDATE OF [ ( column-name, ... ) ]
cursor-concurrency : BY { VALUES | TIMESTAMP | LOCK }
xml-mode : RAW [ , ELEMENTS ] | AUTO [ , ELEMENTS ] | EXPLICIT
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | option-name=option-value
option-name : identifier
option-value : hostvar (許可されたインジケーター) | string | identifier | number
WITH 句または WITH RECURSIVE 句 1 つ以上の共通テーブル式を定義します。共通テーブル式はテンポラリビューでもあり、文の残りの部分に使用されます。これらの式は、非再帰的か自己再帰的のいずれかに指定できます。再帰的な共通テーブル式は、RECURSIVE キーワードが指定されている場合にのみ、単独で表示されるか、非再帰的なテーブル式と混合で表示されます。相互再帰的な共通テーブル式は、サポートされていません。
SELECT クエリブロックが次のいずれかの場所に表示されている場合のみ、この句を使用できます。
ビュー定義の最上位レベルの SELECT クエリブロックを含む最上位レベルの SELECT クエリブロック内
INSERT クエリブロック内の最上位レベルの SELECT 文内
任意のタイプの SQL 文で派生テーブルを定義しているネストされた SELECT クエリブロック内
再帰的な式は、初期のサブクエリと再帰的なサブクエリから構成されます。初期クエリは、ビューのスキーマを暗黙的に定義します。再帰的なサブクエリには、FROM 句内のビューへの参照を入れてください。それぞれの反復中に、この参照によって前の反復でビューに追加されたローだけが参照されます。参照は、外部ジョインの NULL 入力側では表示できません。再帰的な共通テーブル式は、集合関数を使用できません。また、GROUP BY、ORDER BY、DISTINCT の各句を含むことはできません。
リモートテーブルでは WITH 句はサポートされません。WITH 句は、INTERSECT、UNION、EXCEPT クエリブロック内でも使用されることがあります。
ALL 句または DISTINCT 句 All (デフォルト) は、SELECT 文の句を満たすすべてのローを返します。DISTINCT を指定すると、重複した出力ローが削除されます。多くの場合、DISTINCT を指定すると、文の実行時間が非常に長くなります。したがって、DISTINCT を使用するのは、必要な場合だけにしてください。
row-limitation 句 row-limitation 句を使用することによって、WHERE 句を満たすローのサブセットのみを返すことができます。row-limitation 句は、一度に 1 つのみ指定できます。これらの句を指定する場合は、ローの順序を意味のあるものにするために ORDER BY 句も指定する必要があります。
row-limitation-option-1 TOP 引数と START AT 引数には、ホスト変数、整数定数、または整数変数を使用した簡単な算術演算を指定できます。TOP 引数は 0 以上にします。START AT 引数は 0 より大きい値にします。
startat-expression が指定されていない場合、デフォルトは 1 です。TOP の引数が ALL の場合、startat-expression で始まるすべてのローが返されます。TOP limit-expression START AT startat-expression
句は、LIMIT ( startat-expression -1 ), limit-expression
、または LIMIT limit-expression OFFSET ( startat-expression -1 )
と同等です。
row-limitation-option-2 LIMIT 引数と OFFSET 引数には、ホスト変数、整数定数、または整数変数を使用した簡単な算術演算を指定できます。LIMIT 引数は 0 以上の値、OFFSET 引数は 0 以上の値に評価される必要があります。offset-expression が指定されていない場合は、デフォルトの 0 になります。
ロー制限句 LIMIT offset-expression, limit-expression
は LIMIT limit-expression OFFSET offset-expression
と同等です。どちらの構成も TOP limit-expression START AT ( offset-expression + 1 )
と同等です。
LIMIT キーワードはデフォルトでは無効になっています。LIMIT キーワードを有効にするには、reserved_keywords オプションを使用します。
select-list 句 select-list は、カンマで区切られた式のリストであり、データベースから何を取り出すかを指定します。アスタリスク (*) は、FROM 句に記述された全テーブルのすべてのカラムを選択することを意味します。
集合関数は、select-list で許可されています。サブクエリも、select-list で許可されます。それぞれのサブクエリは、カッコで囲みます。
エイリアス名はクエリを通じて使用でき、エイリアスの式を表します。
エイリアス名も、SELECT 文から出力された各カラムの最上部に、Interactive SQL で表示されます。オプションのエイリアス名を式の後で指定しないと、Interactive SQL は式を表示します。
INTO hostvar-list 句 この句は Embedded SQL でだけ使用されます。これは SELECT 文の結果が移動する場所を指定します。select-list 内のそれぞれの項目に対して、1 つのホスト変数項目が必要です。select-list 項目は、順番にホスト変数の中に置かれます。インジケーターホスト変数も各ホスト変数と一緒に使用でき、プログラムは select-list 項目が NULL であったかどうかを通知できます。
クエリの結果、選択されたローが存在しない場合、変数は更新されず、ローが見つからないことを示す警告が表示されます。
INTO variable-list 句 この句はプロシージャーとトリガーの中でだけ使用されます。これは SELECT 文の結果が移動する場所を指定します。select-list 内のそれぞれの項目に対して、1 つの変数が必要です。select-list 項目は、順番に変数の中に置かれます。
INTO table-name 句 この句は、テーブルの作成とデータの挿入に使用します。
永久テーブルを作成するには、クエリが次のいずれかの条件を満たしている必要があります。
select-list に複数の項目が含まれ、INTO ターゲットが単一の table-name 識別子である。
select-list に * が含まれ、INTO ターゲットが owner.table として指定されている。
1 つのカラムを持つ永久テーブルを作成するには、テーブル名を owner.table として指定します。
この文では、テーブルを作成する副作用として実行前に COMMIT が行われます。この文を実行するには RESOURCE 権限が必要です。新規テーブルにパーミッションは付与されません。この文は、CREATE TABLE とそれに続く INSERT...SELECT の省略形です。
この句を使用して作成されるテーブルには、プライマリキーは定義されていません。ALTER TABLE を使用してプライマリキーを追加できます。プライマリキーは、テーブルに UPDATE または DELETE を適用する前に追加してください。そうしないと、これらのオペレーションによって、影響を受けるローのトランザクションログにすべてのカラム値が記録されます。
INTO LOCAL TEMPORARY TABLE この句は、ローカルテンポラリテーブルを作成し、クエリの結果を移植するために使用します。この句を使用する場合、テンポラリテーブル名の先頭に # を付ける必要はありません。
FROM 句 table-expression の中で指定されるテーブルとビューからローを取り出します。FROM 句を指定しない SELECT 文を使って、テーブルから取り出せなかった式の値を表示できます。たとえば、この 2 つの文は同じです。また、グローバル変数 @@version の値を表示します。
SELECT @@version; SELECT @@version FROM DUMMY; |
WHERE 句 この句は、FROM 句の中で指定したテーブルから選択するローを指定します。この句を FROM 句の一部である ON フレーズの代わりに使用すると、複数のテーブルをジョインできます。
GROUP BY 句 カラム、エイリアス名、または関数によってグループ分けできます。クエリの結果には、指定したカラム、エイリアス、または関数の中の個別の値の各セットに対し 1 つのローが入ります。DISTINCT や、UNION、INTERSECT、EXCEPT などの集合操作と同じように、GROUP BY 句は NULL 値を各ドメインの他の値と同様に扱います。つまり、グループ化属性に複数の NULL 値が存在すると 1 つのグループが形成されます。集合関数をこれらのグループに適用して、意味のある結果を取得することができます。
GROUP BY を使う場合、select-list、HAVING 句、ORDER BY 句が参照できるのは、GROUP BY 句の中で指定した識別子だけです。ただし、select-list と HAVING 句は集合関数を持つことができます。
HAVING 句 この句は、個々のロー値ではなくグループ値に基づいてローを選択します。HAVING 句を使用できるのは、文に GROUP BY 句があるか、select-list が集合関数のみから成る場合だけです。HAVING 句で参照されるカラム名は、GROUP BY 句に含まれるか、または HAVING 句の集合関数のパラメーターとして使用されます。
WINDOW 句 この句は、AVG や RANK などの Window 関数を使用するウィンドウのすべてまたは一部を定義します。
ORDER BY 句 この句はクエリの結果をソートします。ORDER BY リストの各項目には、昇順の場合 (デフォルト) は ASC、降順の場合は DESC のラベルを付けることができます。式が整数 n である場合、クエリの結果は select-list の n 番目の項目でソートされます。
特定の順序でローが返されるようにする唯一の方法は ORDER BY を使用することです。ORDER BY 句がない場合は、SQL Anywhere が最も効率のよい順序でローを返します。つまり、ローに最後にアクセスした日付やその他の要因によって、結果セットでの表示順序が異なることがあります。
Embedded SQL の場合は、データベースから結果を取得し、その値を INTO 句でホスト変数に格納するために、SELECT 文を使用します。SELECT 文は、1 つのローだけを返さなければなりません。複数のローを対象にクエリを実行する場合は、カーソルを使います。
FOR UPDATE または FOR READ ONLY 句 これらの句は、クエリに対して開かれているカーソル経由で更新を許可するかどうかを指定し、許可する場合、使用する同時実行性のセマンティックを指定します。この句は、FOR XML 句と一緒に使用できません。
SELECT 文の FOR 句を使用しない場合、カーソルの更新可能性は、カーソルの宣言とカーソルの同時実行性を API が指定する方法によって変わります。ODBC、JDBC、OLE DB、ADO.NET、Embedded SQL では、文の更新可能性は明示的になり、アプリケーションが上書きしなければ、読み込み専用カーソルが使用されます。Open Client とストアドプロシージャーでは、カーソルの更新可能性を指定する必要はありません。また、デフォルトは FOR UPDATE です。
Open Client とストアドプロシージャーでは、カーソルの更新可能性と文の更新可能性は ansi_update_constraints データベースオプションの設定、文の特徴に応じて変わります。たとえば、ORDER BY、DISTINCT、GROUP BY、HAVING、UNION、集合関数、ジョイン、非更新可能なビューなどです。ストアドプロシージャーでは、ORDER BY 句なしの単一テーブルのクエリの場合、または ansi_update_constraints オプションが Off に設定されている場合、カーソルのデフォルトは FOR UPDATE です。ansi_update_constraints オプションが Cursors または Strict に設定されている場合、ORDER BY 句を含むクエリ上のカーソルのデフォルトは READ ONLY です。ただし、FOR UPDATE 句を使用して、カーソルを更新可能と明示的に示すこともできます。ORDER BY 句またはジョインを使用してカーソルに対する更新を可能にするにはコストがかかるため、2 つ以上のテーブルのジョインを含むクエリに対するカーソルは READ ONLY であり、ansi_update_constraints データベースオプションが Off でないかぎり、更新可能にすることはできません。
FOR READ ONLY として宣言されたカーソルは、UPDATE (位置付け) 文、DELETE (位置付け) 文、または PUT 文には使用できません。FOR READ ONLY は Embedded SQL のデフォルトです。
FOR UPDATE 句は、明示的にカーソルを更新可能にします。FOR UPDATE を単独で使用しても、そのこと自体では、文の結果セットのローに対する同時実行性の制御には影響を及ぼしません。このことを行うには、FOR UPDATE BY LOCK または FOR UPDATE BY [ VALUES | TIMESTAMP ] のいずれかを指定します。
FOR UPDATE BY LOCK 句 データベースサーバーは、結果セットのフェッチされたローに対する意図的ローロックを取得します。このロックは長期間のロックであり、トランザクションがコミットまたはロールバックされるまで保持されます。
FOR UPDATE BY { VALUES | TIMESTAMP } FOR UPDATE BY TIMESTAMP または FOR UPDATE BY VALUES を指定すると、データベースサーバーはキーセット駆動型の (value-sensitive) カーソルを使用して最適な同時実行性を使用します。このような状況では、アプリケーションが (別の文を使用して) カーソルの範囲外のローを変更した場合、または別の接続でローが変更されたことを示す警告やエラーがサーバーによって生成されてもアプリケーションがそれを無視する場合、更新内容が消失する可能性があります。
文で意図的なロックをかけるには、次のいずれかを実行します。
クエリで FOR UPDATE BY LOCK を指定
クエリの FROM 句で HOLDLOCK、WITH ( HOLDLOCK )、WITH ( UPDLOCK )、または WITH ( XLOCK ) を指定
CONCUR_LOCK を指定する API の読み出しでカーソルを開く
更新のフェッチを示す属性でローをフェッチ
FOR UPDATE OF 句は、UPDATE (位置付け) 文、DELETE (位置付け) 文、または PUT 文で変更可能なカラムに明示的に名前を付けます。この句は、他の FOR UPDATE 句、FOR READ ONLY 句、または FOR XML 句と一緒には使用できません。
FOR XML 句 この句は、結果セットが XML ドキュメントとして返されるように指定します。XML のフォーマットは、指定するモードによって異なります。この句は、FOR UPDATE 句または FOR READ ONLY 句と一緒には使用できません。FOR XML で宣言したカーソルは暗黙的に READ ONLY になります。
RAW モードを指定すると、結果セットの各ローは XML <row> 要素として表され、各カラムは <row> 要素の属性として表されます。
AUTO モードを指定すると、クエリの結果は、ネストされた XML 要素として返されます。select-list 内で参照される各テーブルは、XML 内で要素として表されます。要素のネスト順は、テーブルが select-list 内で参照される順序に基づいています。
EXPLICIT モードを指定すると、生成された XML ドキュメントの形式を制御できます。EXPLICIT モードにすると、RAW モードや AUTO モードに比べて、要素の名前付けとネスト構造の指定がより柔軟にできます。
OPTION 句 この句は、クエリの処理方法についてヒントを示します。次のクエリヒントがサポートされます。
MATERIALIZED VIEW OPTIMIZATION 句 MATERIALIZED VIEW OPTIMIZATION 句を使用して、オプティマイザーがクエリを処理するときにマテリアライズドビューを使用する方法を指定します。指定した option-value は、このクエリでのみ materialized_view_optimization データベースオプションを上書きします。option-value の可能な値は、materialized_view_optimization database オプションに使用できる値と同じです。
FORCE OPTIMIZATION 句 クエリ指定に単純なクエリしか含まれない場合 (特定の行を識別する WHERE 句に等号条件を含んだ単一ブロック、単一テーブルのクエリ)、通常、処理中にコストベースの最適化はバイパスされます。場合によっては、コストベースの最適化を実行する必要があることがあります。たとえば、クエリ処理時にマテリアライズドビューを考慮する場合、ビューのマッチングが発生します。ただし、ビューの一致が発生するのはコストベースの最適化中のみです。クエリに対してコストベースの最適化を実行しても、クエリ指定に単純なクエリのみを含める場合、FORCE OPTIMIZATION オプションを指定して、オプティマイザーが確実にクエリに対してコストベースの最適化を実行できるようにします。
同様に、プロシージャー内の SELECT 文に FORCE OPTIMIZATION オプションを指定すると、プロシージャーに対するすべての呼び出しにオプティマイザーが強制的に使用されます。この場合、文のプランはキャッシュされません。
FORCE NO OPTIMIZATION 句 FORCE NO OPTIMIZATION 句は、文でオプティマイザーをバイパスする場合に指定します。文が複雑すぎて (データベースオプションの設定またはスキーマやクエリの特徴などにより) このような処理が実行できない場合、文は失敗し、データベースサーバーはエラーを返します。
option-name = option-value オプション設定を指定します。指定する設定は、現在の文にのみ適用され、ODBC 実行可能アプリケーションによる設定など、パブリックオプションまたはテンポラリオプションの設定よりも優先されます。サポートされるオプションは次のとおりです。
クエリで isolation_level オプションを指定すると、そのクエリで指定した値が、現在のクエリの他のどの独立性レベル設定 (データベースの isolation_level オプションの設定やカーソルの設定など) よりも優先されます。
sequence-expression シーケンスジェネレーターから現在の値 (CURRVAL) または次の値 (NEXTVAL) を選択できます。
SELECT 文は、次の目的で使用できます。
データベースから結果を取得する。
Interactive SQL で、データベース内のデータをブラウズ、またはデータベースから外部ファイルにデータをエクスポートする。
プロシージャーとトリガー、または Embedded SQL 内で使用する。INTO 句のある SELECT 文を使ってデータベースから結果を取り出します。このとき、SELECT 文はローを 1 つだけ返します。複数のローを対象にクエリを実行する場合は、カーソルを使います。
プロシージャーから結果セットを返す。
指定したテーブルとビューに対する SELECT パーミッションが必要です。
シーケンスジェネレーターから CURRVAL 値または NEXTVAL 値を選択するには、DBA 権限が必要です。または、シーケンスの所有者であるか、シーケンスジェネレーターを使用するためのパーミッションが付与されている必要があります。
なし
SQL/2008 コア機能。SELECT 文は複雑なため、個々の句を標準に照らしてチェックしてください。たとえば、GROUP BY 句で指定できる ROLLUP キーワードは、オプションの SQL/2008 言語機能 T431 の一部です。SQL Anywhere でサポートされている、オプションの SQL/2008 言語機能の一部を次に示します。
WINDOW 句と WINDOW 集合関数は、オプションの SQL/2008 言語機能 T611 および T612 を構成します。
シーケンス式は、機能 T176 の一部です。
共通テーブル式は、オプションの SQL/2008 言語機能 T121 です。ネストされたクエリ式に含まれる共通テーブル式は、機能 T122 です。WITH RECURSIVE は、オプションの SQL/2008 言語機能 T131 です。ネストされたクエリに含まれている場合は、機能 T132 を構成します。
UNION、EXCEPT、または INTERSECT を含むクエリ式とともに ORDER BY 句を指定する機能は、オプションの機能 F850 です。サブクエリで ORDER BY を指定する機能は、機能 F851 です。
SQL 標準では、FOR UPDATE と FOR READ ONLY はカーソル宣言の一部です。
SQL Anywhere では、SELECT 文の SQL/2008 定義に対する多くの拡張がサポートされています。その一部を次に示します。
オプションの cursor-concurrency 句 (FOR UPDATE BY { LOCK | VALUES | TIMESTAMP}) はベンダー拡張です。
FOR XML 句、OPTION 句、INTO 句はベンダー拡張です。
row-limitation 句はベンダー拡張です。SQL/2008 標準では、row-limitation は、オプションの言語機能 F856 である FETCH FIRST 構文を使用してサポートされます。機能 F856 の構文は SQL Anywhere ではサポートされていません。
ORDER BY n を指定する機能はベンダー拡張です。
SQL/2008 では、INSENSITIVE カーソル以外のすべてのカーソルがデフォルトで更新可能になっています。Embedded SQL プログラムでデフォルトで使用される読み込み専用カーソルはベンダー拡張です。
Transact-SQL SQL Anywhere と Adaptive Server Enterprise での SELECT 文のサポートには大きな違いがあります。SELECT 文のいくつかの機能は、Adaptive Server Enterprise ではサポートされていません。
これらの違いを次に示します。
Sybase ASE では、SQL Anywhere の cursor-concurrency 句はサポートされていません。フェッチされたローのロックを取得するには、HOLDLOCK テーブルヒントを使用します。
Adaptive Server Enterprise では、再帰クエリも共通テーブル式もサポートされていません。
Adaptive Server Enterprise と SQL Anywhere では、Transact-SQL 外部ジョインに関して違いがあります。
Transact-SQL では、Watcom SQL SET 文ではなく、SELECT 文を使用して値を変数に割り当てます。
次のクエリは、Employees テーブルの全従業員数を返します。
SELECT COUNT(*) FROM Employees; |
次のクエリは、すべての顧客とその顧客からの注文の総額をリストします。
SELECT CompanyName, CAST( SUM( SalesOrderItems.Quantity * Products.UnitPrice ) AS INTEGER ) VALUE FROM Customers JOIN SalesOrders JOIN SalesOrderItems JOIN Products GROUP BY CompanyName ORDER BY VALUE DESC; |
次の文は、Embedded SQL SELECT 文を示します。Employees テーブル内の従業員数が選択され、:size ホスト変数に格納されます。
SELECT COUNT(*) INTO :size FROM Employees; |
次の文は、結果セットの最初のローを迅速に返すように最適化されています。
SELECT Name FROM Products GROUP BY Name HAVING COUNT( * ) > 1 AND MAX( UnitPrice ) > 10 OPTION( optimization_goal = 'first-row' ); |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |