Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 文 » SQL 文 (P ~ Z)

 

SELECT 文

この文は、データベースから情報を取り出すために使用します。

構文
[ WITH temporary-views ]
  SELECT [ ALL | DISTINCT ] [ row-limitation ] 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 { UPDATE [ cursor-concurrency ] | READ ONLY } ]
[ FOR XML xml-mode ]
[ 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 :
  FIRST | TOP n [ START AT m ]
select-list :
expression [ [ AS ] alias-name ], ...
| *
| window-function OVER { window-name  | window-spec } 
   [ [ AS ] alias-name ]

from-expressionFROM 句を参照してください。

group-by-expressionGROUP BY 句を参照してください。

search-condition探索条件を参照してください。

window-name識別子

window-expressionWINDOW 句を参照してください。

window-specWINDOW 句を参照してください。

window-function : 
RANK( )
| DENSE_RANK( )
| PERCENT_RANK( )
| CUME_DIST( )
| ROW_NUMBER( )
| aggregate-function
 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 文内

    • VIEW 定義の最上位レベルの SELECT 文内

    • INSERT 文内の最上位レベルの SELECT 文内

    再帰的な式は、初期のサブクエリと再帰的なサブクエリから構成されます。初期クエリは、ビューのスキーマを暗黙的に定義します。再帰的なサブクエリには、FROM 句内のビューへの参照を入れてください。それぞれの反復中に、この参照によって前の反復でビューに追加されたローだけが参照されます。参照は、外部ジョインの NULL 入力側では表示できません。再帰的な共通テーブル式は、集合関数を使用できません。また、GROUP BY、ORDER BY、DISTINCT の各句を含むことはできません。共通テーブル式を参照してください。

    リモート・テーブルでは WITH 句はサポートされません。

  • ALL 句または DISTINCT 句   All (デフォルト) は、SELECT 文の句を満たすすべてのローを返します。DISTINCT を指定すると、重複した出力ローが削除されます。多くの場合、DISTINCT を指定すると、文の実行時間が非常に長くなります。したがって、DISTINCT を使用するのは、必要な場合だけにしてください。

  • row-limitation 句   ローを制限する句を使用することによって、WHERE 句を満たすローのサブセットのみを返すことができます。TOP 値と START AT 値には、ホスト変数、整数定数、または整数変数を使用できます。TOP 値は 0 以上である必要があります。START AT 値は 0 より大きい値にする必要があります。通常、これらの句を指定する場合は、ローの順序を意味のあるものにするために ORDER BY 句も指定します。クエリが返すロー数を明示的に制限するを参照してください。

  • select-list 句   select-list は、カンマで区切られた式のリストであり、データベースから何を取り出すかを指定します。アスタリスク (*) は、FROM 句に記述された全テーブルのすべてのカラムを選択することを意味します。

    集合関数は、select-list で許可されています。サブクエリも、select-list で許可されます。それぞれのサブクエリは、カッコで囲みます。

    エイリアス名はクエリを通じて使用でき、エイリアスの式を表します。

    エイリアス名も、SELECT 文から出力された各カラムの最上部に、Interactive SQL で表示されます。オプションのエイリアス名を式の後で指定しないと、Interactive SQL は式自体を表示します。

  • INTO 句   次の 3 つの INTO 句を使用します。

    • 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;

    FROM 句を参照してください。

  • WHERE 句   この句は、FROM 句の中で指定したテーブルから選択するローを指定します。この句を FROM 句の一部である ON フレーズの代わりに使用すると、複数のテーブルをジョインできます。探索条件FROM 句を参照してください。

  • 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 関数を使用するウィンドウのすべてまたは一部を定義します。WINDOW 句を参照してください。

  • ORDER BY 句   この句はクエリの結果をソートします。ORDER BY リストの各項目には、昇順の場合 (デフォルト) は ASC、降順の場合は DESC のラベルを付けることができます。式が整数 n である場合、クエリの結果は select-listn 番目の項目でソートされます。

    特定の順序でローが返されるようにする唯一の方法は ORDER BY を使用することです。ORDER BY 句がない場合は、SQL Anywhere が最も効率のよい順序でローを返します。つまり、ローに最後にアクセスした日付やその他の要因によって、結果セットでの表示順序が異なることがあります。

    Embedded SQL の場合は、データベースから結果を取得し、その値を INTO 句でホスト変数に格納するために、SELECT 文を使用します。SELECT 文は、1 つのローだけを返さなければなりません。複数のローを対象にクエリを実行する場合は、カーソルを使います。

  • FOR UPDATE または FOR READ ONLY 句   これらの句は、クエリに対してひらかれているカーソル経由で更新を許可するかどうかを指定し、許可する場合、使用する同時実行性のセマンティックを指定します。この句は、FOR XML 句と一緒に使用できません。

    FOR UPDATE BY TIMESTAMP または FOR UPDATE BY VALUES を指定すると、データベース・サーバは keyset-driven カーソルを使用して最適な同時実行性を使用します。この場合、実行されない更新が発生する可能性があります。

    SELECT 文の FOR 句を使用しない場合、カーソルの更新可能性は、カーソルの宣言とカーソルの同時実行性を API が指定する方法によって変わります (DECLARE 文FOR 文を参照してください)。ODBC、JDBC、OLE DB では、文の更新可能性は明示的で読み込み専用です。アプリケーションが上書きしなければ、forward-only カーソルが使用されます。Open Client、Embedded SQL、ストアド・プロシージャでは、カーソルの更新可能性を指定する必要はありません。また、デフォルトは FOR UPDATE です。

    文で意図的なロックをかけるには、次のいずれかを実行します。

    • クエリで FOR UPDATE BY LOCK を指定

    • クエリの FROM 句で HOLDLOCK、WITH ( HOLDLOCK )、WITH ( UPDLOCK )、または WITH ( XLOCK ) を指定

    • CONCUR_LOCK を指定する API の読み出しでカーソルを開く

    • 更新のフェッチを示す属性でローをフェッチ

    カーソルの更新可能性とは別に、文の更新可能性も ansi_update_constraints データベース・オプションの設定、文の特徴に応じて変わります。たとえば、ORDER BY、DISTINCT、GROUP BY、HAVING、UNION、集合関数、ジョイン、非更新可能なビューなどです。

    カーソルの sensitivity の詳細については、SQL Anywhere のカーソルを参照してください。

    ODBC の同時実行性の詳細については、ODBC カーソル特性の選択の SQLSetStmtAttr の説明を参照してください。

    ansi_update_constraints データベース・オプションの詳細については、ansi_update_constraints オプション [互換性]を参照してください。

    カーソルの updatability の詳細については、更新可能な文の概要を参照してください。

  • FOR XML 句   この句は、結果セットが XML ドキュメントとして返されるように指定します。XML のフォーマットは、指定するモードによって異なります。この句は、FOR UPDATE 句または FOR READ ONLY 句と一緒には使用できません。

    RAW モードを指定すると、結果セットの各ローは XML <row> 要素として表され、各カラムは <row> 要素の属性として表されます。

    AUTO モードを指定すると、クエリの結果は、ネストされた XML 要素として返されます。select-list 内で参照される各テーブルは、XML 内で要素として表されます。要素のネスト順は、テーブルが select-list 内で参照される順序に基づいています。

    EXPLICIT モードを指定すると、生成された XML ドキュメントの形式を制御できます。EXPLICIT モードにすると、RAW モードや AUTO モードに比べて、要素の名前付けとネスト構造の指定がより柔軟にできます。FOR XML EXPLICIT の使用を参照してください。

    FOR XML 句の使用の詳細については、FOR XML 句を使用してクエリ結果を XML として取り出すを参照してください。

  • OPTION 句   この句は、クエリの処理方法についてヒントを示します。次のクエリ・ヒントがサポートされます。

    • MATERIALIZED VIEW OPTIMIZATION 句   MATERIALIZED VIEW OPTIMIZATION 句を使用して、オプティマイザがクエリを処理するときにマテリアライズド・ビューを使用する方法を指定します。指定した option-value は、このクエリでのみ materialized_view_optimization データベース・オプションを上書きします。option-value の可能な値は、materialized_view_optimization database オプションに使用できる値と同じです。materialized_view_optimization オプション [データベース]を参照してください。

    • FORCE OPTIMIZATION 句   クエリ指定に単純なクエリしか含まれない場合 (特定の行を識別する WHERE 句に等号条件を含んだ単一ブロック、単一テーブルのクエリ)、通常、処理中にコストベースの最適化はバイパスされます。ただし、コストベースの最適化を実行したい場合もあります。たとえば、クエリ処理時にマテリアライズド・ビューを考慮する場合、ビューのマッチングが発生します。ただし、ビューのマッチングが発生するのはコストベースの最適化中のみです。クエリに対してコストベースの最適化を実行しても、クエリ指定に単純なクエリのみを含める場合、FORCE OPTIMIZATION オプションを指定して、オプティマイザが確実にクエリに対してコストベースの最適化を実行できるようにします。同様に、プロシージャ内の SELECT 文に FORCE OPTIMIZATION オプションを指定すると、プロシージャに対するすべての呼び出しにオプティマイザが強制的に使用されます。この場合、文のプランはキャッシュされません。

      単純なクエリとビューのマッチングの詳細については、クエリ処理のフェーズクエリ処理のフェーズをスキップするための条件を参照してください。

    • FORCE NO OPTIMIZATION 句   FORCE NO OPTIMIZATION 句は、文でオプティマイザをバイパスする場合に指定します。データベース・オプションの設定またはスキーマやクエリの特性などが理由で、文が複雑すぎてこのような処理を実行できない場合、文は失敗し、データベース・サーバはエラーを返します。オプティマイザをバイパスできる文の詳細については、クエリ処理のフェーズをスキップするための条件を参照してください。

    • option-name = option-value   該当する文に対してのみ、パブリック・オプションやテンポラリ・オプションの設定よりも優先されるオプション設定を指定します。サポートされるオプションは次のとおりです。

備考

SELECT 文は、次の目的で使用できます。

  • データベースから結果を取得する。

  • Interactive SQL で、データベース内のデータをブラウズ、またはデータベースから外部ファイルにデータをエクスポートする。

  • プロシージャとトリガ、または Embedded SQL 内で使用する。INTO 句のある SELECT 文を使ってデータベースから結果を取り出します。このとき、SELECT 文はローを 1 つだけ返します。複数のローを対象にクエリを実行する場合は、カーソルを使います。

  • プロシージャから結果セットを返す。

注意

SELECT 文で GROUP BY 式を使う場合、select-list、HAVING 句、ORDER BY 句が参照できるのは、GROUP BY 句の中で指定した識別子だけです。例外は、select-list と HAVING 句が集合関数を持つ場合だけです。

パーミッション

指定したテーブルとビューに対する SELECT パーミッションが必要です。

関連する動作

なし

参照
標準と互換性
  • SQL/2003   コア機能。SELECT 文は複雑なため、個々の句を標準に照らしてチェックしてください。たとえば、ROLLUP キーワードは T431 の一部です。

    FOR UPDATE、FOR READ ONLY、FOR UPDATE ( column-list ) はコア機能です。

    FOR UPDATE BY [ LOCK | TIMESTAMP | VALUES ] は SQL Anywhere のベンダ拡張です。

この例は、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' );