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 文 (E ~ O)

 

FROM 句

この句は、DELETE 文、SELECT 文、または UPDATE 文に関与するデータベース・テーブルまたはビューを指定するために使用します。SELECT 文内で使用される場合、FROM 句は MERGE 文または INSERT 文でも使用できます。

構文
FROM  table-expression, ...
table-expression :
  table-name
| view-name
| procedure-name
| derived-table
| lateral-derived-table
| join-expression 
| ( table-expression, ... )
| openstring-expression
| apply-expression
| contains-expression
table-name :
[ userid.]table-name
[ [ AS ] correlation-name ]
[ WITH ( hint [...] ) ]
view-name :
[ userid.]view-name [ [ AS ] correlation-name ]
[ WITH ( table-hint ) ]
procedure-name :
[ owner.]procedure-name ( [ parameter, ... ] )
[ WITH ( column-name data-type, ... ) ]
[ [ AS ] correlation-name ]
derived-table :
( select-statement ) 
[ AS ] correlation-name [ ( column-name, ... ) ]
lateral-derived-table :
LATERAL ( select-statement | table-expression )
[ AS ] correlation-name [ ( column-name, ... ) ]
join-expression :
table-expression join-operator table-expression 
[ ON join-condition ]
join-operator :
[ KEY | NATURAL ] [ join-type ] JOIN
| CROSS JOIN
join-type :
  INNER
| LEFT [ OUTER ]
| RIGHT [ OUTER ]
| FULL [ OUTER ]
hint :
table-hint | index-hint
table-hint :
READPAST
| UPDLOCK 
| XLOCK
| FASTFIRSTROW
| HOLDLOCK 
| NOLOCK 
| READCOMMITTED
| READUNCOMMITTED
| REPEATABLEREAD
| SERIALIZABLE
index-hint : 
NO INDEX 
| INDEX ( index-name [, ...] ) [ INDEX ONLY { ON | OFF } ]
| FORCE INDEX ( index-name )
openstring-expression : 
OPENSTRING ( { FILE | VALUE } string-expression ) 
WITH ( rowset-schema ) 
 [ OPTION ( scan-option ...  ) ]
 [ AS ] correlation-name
apply-expression :
table-expression { CROSS | OUTER } APPLY table-expression
contains-expression : 
{table-name  | view-name } CONTAINS ( column-name [,...], contains-query ) [ [ AS ] score-correlation-name ]
rowset-schema :
column-schema-list
| TABLE [owner.]table-name [ ( column-list ) ]
column-schema-list :
{ column-name user-or-base-type |  filler( ) } [ , ... ]
column-list :
      { column-name | filler( ) } [ , ... ]
scan-option :
BYTE ORDER MARK { ON | OFF }
| COMMENTS INTRODUCED BY comment-prefix
| DELIMITED BY string      
| ENCODING encoding
| ESCAPE CHARACTER character
| ESCAPES { ON | OFF }
| FORMAT { TEXT | BCP }
| HEXADECIMAL { ON | OFF }
| QUOTE string
| QUOTES { ON | OFF }
| ROW DELIMITED BY string
| SKIP integer
| STRIP { ON | OFF | LTRIM | RTRIM | BOTH } 
contains-query : string
パラメータ
  • table-name   ベース・テーブルまたはテンポラリ・テーブル。ユーザ ID を指定すると、他のユーザが所有するテーブルを修正できます。ユーザ ID を指定しないと、現在のユーザの所属グループが所有するテーブルがデフォルトで検索されます。グループが所有するテーブルの参照を参照してください。

  • view-name   クエリに含めるビューを指定します。テーブルの場合と同様に、ユーザ ID を指定して、他のユーザが所有するビューを修飾できます。ユーザ ID を指定しないと、現在のユーザの所属グループが所有するビューがデフォルトで検索されます。

    構文ではビューに対してテーブル・ヒントを指定できますが、このようなヒントの効果はありません。

  • procedure-name   結果セットを返すストアド・プロシージャです。この句は SELECT 文の FROM 句にのみ適用されます。プロシージャにパラメータを指定しない場合でも、プロシージャ名の後のカッコは必要です。ストアド・プロシージャが複数の結果セットを返す場合、最初の結果セットだけが使用されます。

    WITH 句を指定すると、プロシージャの結果セットにカラム名のエイリアスを指定できます。WITH 句を指定する場合、カラム数はプロシージャの結果セットのカラム数と一致し、データ型はプロシージャの結果セットのデータ型と互換性がある必要があります。WITH 句を指定しない場合、カラム名と型はプロシージャ定義で設定された名前と型です。次のクエリは、WITH 句の使用方法を示します。

    SELECT sp.ident, sp.quantity, Products.name
    FROM ShowCustomerProducts( 149 ) WITH ( ident INT, description CHAR(20), quantity INT ) sp
       JOIN Products
    ON sp.ident = Products.ID;

  • derived-table   FROM 句の中で、テーブル名またはビュー名の代わりに SELECT 文を指定できます。このように使用する SELECT 文を派生テーブルと呼び、エイリアスを指定する必要があります。たとえば、次の文には、派生テーブル MyDerivedTable が含まれています。この派生テーブルは、Products テーブル内の製品を UnitPrice でランキングしています。
    SELECT TOP 3 *
           FROM ( SELECT Description, 
                         Quantity, 
                         UnitPrice,
                         RANK() OVER ( ORDER BY UnitPrice ASC ) 
                     AS Rank 
                     FROM Products ) AS MyDerivedTable
    ORDER BY Rank;

    派生テーブルの詳細については、派生テーブルのクエリを参照してください。

  • lateral-derived-table   親の文のオブジェクトへの参照 (外部参照) が含まれている場合がある、派生テーブル、ストアド・プロシージャ、またはジョインしたテーブル。FROM 句の外部参照を使用する場合は、ラテラル派生テーブルを使用します。

    外部参照を使用できるのは、FROM 句のラテラル派生テーブルの前のテーブルに対してだけです。たとえば、select-list の項目に外部参照は使用できません。

    テーブルと外部参照は、カンマで区切ります。たとえば、次のクエリは有効です。

    SELECT *
     FROM A, LATERAL( B LEFT OUTER JOIN C ON ( A.x = B.x ) ) LDT;
    SELECT *
     FROM A, LATERAL( SELECT * FROM B WHERE A.x = B.x ) LDT;
    SELECT *
     FROM A, LATERAL( procedure-name( A.x ) ) LDT;

    LATERAL ( table-expression) の指定は、LATERAL ( SELECT * FROM table-expression ) の指定と同等です。

  • openstring-expression   OPENSTRING 句は、ファイルまたは BLOB 内を問い合わせ、これらのソースの内容をロー・セットとして処理するときに指定します。テーブルやビューなどの定義された構造を問い合わせているわけではないため、この句を指定するときは、ファイルまたは BLOB のスキーマ情報も指定して結果セットを生成します。この句は SELECT 文の FROM 句に適用されます。UPDATE 文または DELETE 文ではサポートされません。

    ROWID 関数は、OPENSTRING 式で生成されたテーブルの結果セットでサポートされます。

    次に、OPENSTRING 句のサブ句とパラメータ、およびこれらを使用してファイルと BLOB 内のデータを定義し、問い合わせる方法を示します。

    • FILE 句と VALUE 句   FILE 句は、問い合わせるファイルを指定するときに使用します。VALUE 句は、問い合わせる BLOB 式を指定するときに使用します。BLOB 式のデータ型は、LONG BINARY と見なされます。VALUE 句の値として、READ_CLIENT_FILE 関数を指定できます。

      FILE キーワードと VALUE キーワードをどちらも指定しないと、VALUE が指定されたと見なされます。

    • WITH 句   この句は、問い合わせられるデータのローセット・スキーマ (カラム名とデータ型) を指定するときに使用します。カラムは直接指定できます (たとえば、WITH ( Surname CHAR(30), GivenName CHAR(30) ))。また、TABLE サブ句を使用して、スキーマ情報の取得元に使用するテーブルを参照できます (たとえば、WITH TABLE dba.Employees ( Surname, GivenName ))。指定するテーブルの所有者であるか、または SELECT パーミッションが必要です。

      カラムを指定する場合は、入力データ内でスキップするカラムに filler( ) を指定できます (たとえば、WITH ( filler( ), Surname CHAR(30), GivenName CHAR(30) ))。filler( ) の使用の詳細については、LOAD TABLE 文を参照してください。

    • OPTION 句   OPTION 句は、エスケープ文字、デリミタ、エンコードなど、入力ファイルに使用する解析オプションを指定するときに使用します。サポートされるオプションは、入力ファイルの解析を制御する LOAD TABLE 文のオプションで構成されます。LOAD TABLE 文を参照してください。

  • scan-option   各スキャン・オプションの詳細については、LOAD TABLE 文の load-option の説明を参照してください。

  • apply-expression   この句は、左の table-expression のローごとに、右の table-expression を評価するジョイン条件を指定するときに使用します。たとえば、適用式を使用して、テーブル式のローごとに関数、プロシージャ、または派生テーブルを評価できます。適用式から生成されるジョインを参照してください。

  • contains-expression   テーブル名の後に付ける CONTAINS 句は、テーブルをフィルタして、contains-query で指定した全文クエリに一致するローのみを返すときに使用します。この句を指定すると、score-correlation-name を使用して参照できるスコア・カラムとともに、テーブルの一致するローがすべて返されます。score-correlation-name を指定しない場合は、デフォルトの相関名 contains によってスコア・カラムを参照できます。

    オプションの相関名引数を除き、CONTAINS 句は CONTAINS 探索条件の引数と同じ引数を取ります。CONTAINS 探索条件を参照してください。

    CONTAINS 句にリストされるカラムには、テキスト・インデックスが必要です。テキスト・インデックスを参照してください。

  • correlation-name   correlation-name は、FROM 句の中でテーブルまたはビューに代替名を指定するときに使用します。この代替名は、文のどこからでも参照できます。たとえば、emp と dep はそれぞれ、Employees テーブルと Departments テーブルの相関名です。
    SELECT Surname, GivenName, DepartmentName
       FROM Employees emp, Departments dep,
       WHERE emp.DepartmentID=dep.DepartmentID;

  • WITH table-hint 句   WITH table-hint 句を使用すると、このテーブルでのみ使用できる動作と、この文でのみ使用できる動作を指定できます。この句を使用すると、独立性レベルを変更せずに、またデータベースまたは接続のオプションを設定せずに、動作を変更できます。テーブル・ヒントは、ベース・テーブル、テンポラリ・テーブル、およびマテリアライズド・ビューに使用できます。

    警告

    WITH table-hint 句は高度な機能です。必要な場合にかぎり、経験を有するデータベース管理者のみが使用してください。また、この設定はすべての状況で適用されるとはかぎりません。

  • 独立性レベル関連のテーブル・ヒント   独立性レベルのテーブル・ヒントは、テーブルのクエリを実行するときに独立性レベルの動作を指定する場合に使用します。また、指定したテーブルと現在のクエリにのみ使用するロック方法を指定します。スナップショットの独立性レベルをテーブル・ヒントとして指定することはできません。

    サポートされている独立性レベル関連のテーブル・ヒントの一覧を示します。

    テーブル・ヒント 説明
    HOLDLOCK 独立性レベル 3 と同等の動作を設定します。このテーブル・ヒントは SERIALIZABLE と同義です。
    NOLOCK 独立性レベル 0 と同等の動作を設定します。このテーブル・ヒントは READUNCOMMITTED と同義です。
    READCOMMITTED 独立性レベル 1 と同等な動作を設定します。
    READPAST 書き込みロックがかけられたローをブロックするのではなく、無視するようにデータベース・サーバに指示します。このテーブル・ヒントは独立性レベル 1 でのみ使用できます。READPAST ヒントは、FROM 句の中の相関名がベース・テーブルまたは共有されたグローバル・テンポラリ・テーブルを参照する場合のみ考慮されます。それ以外の場合 (ビュー、プロキシ・テーブル、およびテーブル関数)、READPAST ヒントは無視されます。ベース・テーブルの相関名にヒントを指定すると、ビュー内のクエリから READPAST を使用する場合があります。READPAST テーブル・ヒントを使用すると、サーバ内でロックと述部評価が相互に影響し合うため、異常事態が発生する可能性があります。また、DELETE 文、INSERT 文、または UPDATE 文のターゲットとなるテーブルに READPAST ヒントは使用できません。
    READUNCOMMITTED 独立性レベル 0 と同等の動作を設定します。このテーブル・ヒントは NOLOCK と同義です。
    REPEATABLEREAD 独立性レベル 2 と同等な動作を設定します。
    SERIALIZABLE 独立性レベル 3 と同等の動作を設定します。このテーブル・ヒントは HOLDLOCK と同義です。
    UPDLOCK ヒントが指定されたテーブルの文によって処理されるローを意図的ロックを使用してロックすることを指定します。影響を受けるローは、トランザクションの終わりまでロックされたままになります。UPDLOCK はすべての独立性レベルで機能し、意図的ロックを使用します。意図的ロックを参照してください。
    XLOCK ヒントが指定されたテーブルの文によって処理されるローを排他的にロックすることを指定します。影響を受けるローは、トランザクションの終わりまでロックされたままになります。XLOCK はすべての独立性レベルで機能し、書き込みロックを使用します。書き込みロックを参照してください。

    独立性レベルの詳細については、独立性レベルと一貫性を参照してください。

    Mobile Link 同期で READPAST を使用

    Mobile Link 同期に参加しているデータベースにクエリを書き込んでいる場合、同期スクリプトに READPAST テーブル・ヒントを使用しないことをおすすめします。

    詳細については、次の項を参照してください。

    アプリケーションの更新回数が多すぎてダウンロードのパフォーマンスに影響が出ているために READPAST を考慮する場合、代替策としてスナップショット・アイソレーションを使用する方法があります。Mobile Link 独立性レベルを参照してください。

  • 最適化テーブル・ヒント (FASTFIRSTROW)   FASTFIRSTROW テーブル・ヒントを使用すると、optimization_goal オプションを First-row に設定することなく、クエリの最適化ゴールを設定できます。FASTFIRSTROW を使用すると、SQL Anywhere は、クエリ結果の最初のローをフェッチする時間を短縮するためのアクセス・プランを選択します。optimization_goal オプション [データベース]を参照してください。

  • WITH ( index-hint ) 句   WITH ( index-hint ) 句を使用すると、クエリ・オプティマイザ・プラン選択アルゴリズムを無効にできます。また、インデックスを使用してテーブルにアクセスする方法をオプティマイザに正確に指示できます。インデックス・ヒントは、ベース・テーブル、テンポラリ・テーブル、およびマテリアライズド・ビューに使用できます。

  • NO INDEX   この句は、強制的にテーブルを逐次スキャンするときに使用します (インデックスは不使用)。逐次スキャンは非常にコストが高くなる場合があることに注意してください。

  • INDEX ( index-name [,... ] )   この句は、オプティマイザがクエリを処理するために使用する必要のあるインデックスを、最大 4 つまで指定するときに使用します。指定したインデックスが 1 つでも使用できなかった場合はエラーが返されます。

  • INDEX ONLY { ON | OFF }   この句は、データのインデックス専用取得を実行するかどうかを制御するときに使用します。INDEX ONLY ON を使用して INDEX ( index-name... ) 句を指定すると、データベース・サーバは、指定されたインデックスを使用してインデックス専用取得を実行しようとします。インデックス専用取得の処理で、指定したインデックスが 1 つでも使用できなかった場合は、エラーが返されます (たとえば、インデックスがない場合、または既存のインデックスがクエリを処理できない場合)。

    INDEX ONLY OFF を指定すると、インデックス専用取得は行われません。

  • FORCE INDEX ( index-name )   この句は、クエリを満たすテーブルのローを検索するために、オプティマイザが使用する必要のあるインデックスを指定するときに使用します。FORCE INDEX ( index-name ) 構文は互換性のために用意されています。また、複数インデックスの指定はサポートされません。

    警告

    インデックス・ヒントはクエリ・オプティマイザの意思決定論理を上書きするため、経験のあるユーザのみ使用してください。インデックス・ヒントを使用すると、次善のアクセス・プランが使用され、パフォーマンスが低下することがあります。

備考

SELECT 文、UPDATE 文、DELETE 文には、文が使用するテーブルを指定するテーブル・リストが必要です。

ビューと派生テーブル

FROM 句の説明はテーブルについてのものですが、特に注意書きがなければビューと派生テーブルにも適用します。

FROM 句は、指定した全テーブルのすべてのカラムで構成される結果セットを作成します。最初に、コンポーネント・テーブルのすべてのローの組み合わせが結果セットの中に入ります。次に、JOIN 条件か WHERE 条件、またはその両方の分だけ、通常は組み合わせの数が減ります。

CROSS JOIN には ON フレーズを使用できません。

構文 2 の場合、FILE 句と VALUE 句をどちらも指定しないと、VALUE が指定されたと見なされます。つまり、string-expression が問い合わせる値であると見なされます。

パーミッション

openstring-expression の FILE 句には DBA 権限または READFILE 権限が必要です。

openstring-expression の TABLE 句では、指定されたテーブルをユーザが所有しているか、または指定されたテーブルの SELECT パーミッションがユーザに必要です。

関連する動作

なし

参照
標準と互換性
  • SQL/2003   コア機能。ただし、次は除きます。FROM 句は複雑なため、個々の句を標準に照らしてチェックしてください。

    • KEY JOIN はベンダ拡張です。

    • FULL OUTER JOIN と NATURAL JOIN は、コア SQL に含まれていない SQL/基本機能です。

    • READPAST テーブル・ヒントは、ベンダ拡張です。

    • LATERAL ( table-expression ) は、ベンダ拡張です。LATERAL ( select-statement ) は機能 T491 として ANSI SQL 規格に含まれることに注意してください。

    • 派生テーブルは、機能 F591 です。

    • FROM 句のプロシージャ (テーブル関数) は、機能 T326 です。

    • 共通テーブル式は、機能 T121 です。

    • 再帰テーブル式は、機能 T131 です。

次は、有効な FROM 句です。

...
FROM Employees
...
...
FROM Employees NATURAL JOIN Departments
...
...
FROM Customers
KEY JOIN SalesOrders
KEY JOIN SalesOrderItems
KEY JOIN Products
...
...
FROM Employees CONTAINS ( Street, ' Way ' )
...

次のクエリは、クエリ内での派生テーブルの使い方を示します。

SELECT Surname, GivenName, number_of_orders
FROM Customers JOIN
     ( SELECT CustomerID, COUNT(*)
       FROM SalesOrders
        GROUP BY CustomerID )
     AS sales_order_counts( CustomerID,
                             number_of_orders )
ON ( Customers.ID = sales_order_counts.CustomerID )
WHERE number_of_orders > 3;

次のクエリは、ストアド・プロシージャの結果セットからローを選択する方法を示します。

SELECT t.ID, t.QuantityOrdered AS q, p.name
FROM ShowCustomerProducts( 149 ) t JOIN Products p
ON t.ID = p.ID;

次の例は、ファイルを問い合わせる OPENSTRING 句を使用して、クエリを実行する方法を示します。CREATE TABLE 文は、2 つのカラム column1 と columns2 を持つテーブル testtable を作成します。UNLOAD 文は、RowGenerator テーブルからローをアンロードして、ファイル testfile.dat を作成します。SELECT 文では FROM 句の中で OPENSTRING 句を指定し、testtable テーブルと RowGenerator テーブルの両方のスキーマ情報を使用して testfile.dat を問い合わせます。このクエリは値が 49 のローを 1 つ返します。

CREATE TABLE testtable( column1 CHAR(10), column2 INT );
UNLOAD SELECT * FROM RowGenerator TO 'testfile.dat'; 
SELECT A.column2 
  FROM OPENSTRING( FILE 'testfile.dat' ) 
  WITH ( TABLE testtable( column2 ) ) A, RowGenerator B
  WHERE A.column2 = B.row_num
  AND A.column2 < 50
  AND B.row_num > 48;

次の例は、文字列値を問い合わせる OPENSTRING 句を使用して、クエリを実行する方法を示します。SELECT 文では FROM 句の中で OPENSTRING 句を使用し、WITH 句で与えられるスキーマ情報を使用して文字列値を問い合わせます。クエリは、3 つのローを持つ 2 つのカラムを返します。

SELECT *
  FROM OPENSTRING( VALUE '1,"First"$2,"Second"$3,"Third"')
  WITH (c1 INT, c2 VARCHAR(30))
  OPTION ( DELIMITED BY ',' ROW DELIMITED BY '$')
  AS VALS