次の方法で共有


SELECT - SQL コマンド

1 つ以上のテーブルからデータを取得します。

Visual FoxPro ODBC ドライバーでは、このコマンドのネイティブ Visual FoxPro 言語構文がサポートされています。 ドライバー固有の情報については、「 Driver 解説」を参照してください。

構文

  
SELECT [ALL | DISTINCT]  
   [Alias.] Select_Item [AS Column_Name]  
   [, [Alias.] Select_Item [AS Column_Name] ...]   
FROM [DatabaseName!]Table [Local_Alias]  
   [, [DatabaseName!]Table [Local_Alias] ...]   
[WHERE JoinCondition [AND JoinCondition  
...]  
   [AND | OR FilterCondition [AND | OR FilterCondition ...]]]  
[GROUP BY GroupColumn [, GroupColumn ...]]  
[HAVING FilterCondition]  
[UNION [ALL] SELECTCommand]  
[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]  

引数

次の引数で参照される subqueryは SELECT 内の SELECT であり、かっこで囲む必要があります。 WHERE 句では、同じレベル (入れ子になっていない) に最大 2 つのサブクエリを含めることができます。 (引数のセクションを参照してください)。サブクエリには、複数の結合条件を含めることができます。

[ALL |DISTINCT] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [AS Column_Name] ...]
SELECT 句は、クエリ結果に表示されるフィールド、定数、および式を指定します。

既定では、ALL はクエリ結果のすべての行を表示します。

DISTINCT では、クエリ結果から行の重複が除外されます。

DISTINCT は、SELECT 句ごとに 1 回だけ使用できます。

Alias。 は、一致する項目名を修飾します。 Select_Itemで指定した各項目は、クエリ結果の 1 列を生成します。 2 つ以上の項目の名前が同じである場合は、列が重複しないように、テーブルの別名と項目名の前にピリオドを含めます。

Select_Item クエリ結果に含める項目を指定します。 項目には、次のいずれかを指定できます。

  • FROM 句のテーブルのフィールドの名前。

  • 同じ定数値がクエリ結果のすべての行に表示されることを指定する定数。

  • ユーザー定義関数の名前を指定できる式。

SELECT を使用したユーザー定義関数

SELECT 句でユーザー定義関数を使用すると明らかな利点がありますが、次の制限も考慮する必要があります。

  • SELECT で実行される操作の速度は、このようなユーザー定義関数が実行される速度によって制限される場合があります。 ユーザー定義関数に関連する大量の操作は、C 言語またはアセンブリ言語で記述された API およびユーザー定義関数を使用して行う方が適切な場合があります。

  • SELECT から呼び出されたユーザー定義関数に値を渡す唯一の信頼できる方法は、関数が呼び出されたときに渡される引数リストです。

  • 特定のバージョンの FoxPro で正しく動作する、おそらく禁止されている操作を実験して検出した場合でも、それ以降のバージョンで引き続き動作する保証はありません。

これらの制限とは別に、SELECT 句ではユーザー定義関数を使用できます。 ただし、SELECT を使用するとパフォーマンスが低下する可能性があることに注意してください。

次のフィールド関数は、フィールドまたはフィールドを含む式である選択項目で使用できます。

  • AVG(Select_Item)-数値データの列を平均化します。

  • COUNT(Select_Item)-列内の選択項目の数をカウントします。 COUNT(*) は、クエリ出力内の行数をカウントします。

  • MIN(Select_Item)-列内の Select_Item の最小値を決定します。

  • MAX(Select_Item)-列の Select_Item の最大値を決定します。

  • SUM(Select_Item)-数値データの列を合計します。

フィールド関数を入れ子にすることはできません。

AS Column_Name
クエリ出力の列の見出しを指定します。 これは、 Select_Item が式であるか、フィールド関数を含み、列にわかりやすい名前を付ける場合に便利です。 Column_Name 式を使用できますが、テーブル フィールド名に使用できない文字 (スペースなど) を含めることはできません。

FROM [DatabaseName!]Table [Local_Alias] [, [DatabaseName!]] テーブル [Local_Alias] ...]
クエリが取得するデータを含むテーブルを一覧表示します。 テーブルが開かれていない場合、Visual FoxPro はファイルの場所を指定できるように Open ダイアログ ボックスを表示します。 開いた後も、クエリが完了した後もテーブルは開いたままです。

DatabaseName! は、データ ソースで指定されたデータベース以外のデータベースの名前を指定します。 データベースがデータ ソースで指定されていない場合は、テーブルを含むデータベースの名前を含める必要があります。 データベース名の後とテーブル名の前に感嘆符 (!) 区切り記号を含めます。

Local_Alias では、 Table で指定されたテーブルの一時名を指定します。 ローカル エイリアスを指定する場合は、SELECT ステートメント全体でテーブル名の代わりにローカル エイリアスを使用する必要があります。 ローカル エイリアスは、Visual FoxPro 環境には影響しません。

WHERE JoinCondition [AND JoinCondition ...] [AND |OR FilterCondition [AND |OR FilterCondition ...]]
クエリ結果に特定のレコードのみを含むように Visual FoxPro に指示します。 WHERE は、複数のテーブルからデータを取得するために必要です。

JoinCondition FROM 句のテーブルをリンクするフィールドを指定します。 クエリに複数のテーブルを含める場合は、最初のテーブルの後のすべてのテーブルに結合条件を指定する必要があります。

重要

結合条件を作成するときは、次の情報を考慮してください。

  • クエリに 2 つのテーブルを含め、結合条件を指定しない場合、フィルター条件が満たされている限り、最初のテーブルのすべてのレコードが 2 番目のテーブルのすべてのレコードに結合されます。 このようなクエリでは、長い結果が生成される可能性があります。

  • Visual FoxPro は空のフィールドと一致するため、テーブルを空のフィールドと結合する場合は注意が必要です。 たとえば、CUSTOMER.ZIPとINVOICE.ZIPで結合し、CUSTOMER に 100 個の空の郵便番号が含まれており、INVOICE に 400 個の空の郵便番号が含まれている場合、クエリ出力には空のフィールドの結果として 40,000 個の追加レコードが含まれます。 クエリ出力から空のレコードを削除するには、 EMPTY( ) 関数を使用します。

  • AND 演算子を使用して、複数の結合条件を接続する必要があります。 各結合条件の形式は次のとおりです。

    FieldName1 比較 FieldName2

    FieldName1 は 1 つのテーブルのフィールドの名前、 FieldName2 は別のテーブルのフィールドの名前、 Comparison は次の表で説明する演算子の 1 つです。

演算子 比較
= 等しい
== 正確に等しい
いいね SQL LIKE
<>, !=,# 等しくない
>
>= 以上
< より小さい
<= 以下

= 演算子を文字列と共に使用する場合、SET ANSI の設定に応じて動作が異なります。 SET ANSI を OFF に設定すると、Visual FoxPro は Xbase ユーザーになじみのある方法で文字列比較を処理します。 SET ANSI が ON に設定されている場合、Visual FoxPro は文字列比較の ANSI 標準に従います。 Visual FoxPro が文字列比較 実行する方法の詳細については、SET ANSI および SET EXACT を参照してください。

FilterCondition は、クエリ結果に含めるためにレコードが満たす必要がある条件を指定します。 必要な数のフィルター条件をクエリに含め、AND 演算子または OR 演算子に接続できます。 NOT 演算子を使用して論理式の値を逆にしたり、 EMPTY( ) を使用して空のフィールドをチェックしたりすることもできます。 FilterCondition は、次の例の任意のフォームを取得できます。

例 1FieldName1 比較 FieldName2

customer.cust_id = orders.cust_id

例 2FieldName 比較式

payments.amount >= 1000

例 3FieldName 比較 ALL (Subquery)

company < ALL ;

(SELECT company FROM customer WHERE country = "USA")

フィルター条件に ALL が含まれている場合、フィールドは、そのレコードがクエリ結果に含まれる前に、サブクエリによって生成されたすべての値の比較条件を満たす必要があります。

例 4FieldName 比較 ANY |SOME (Subquery)

company < ANY ;

(SELECT company FROM customer WHERE country = "USA")

フィルター条件に ANY または SOME が含まれている場合、フィールドはサブクエリによって生成された値の少なくとも 1 つの比較条件を満たす必要があります。

次の例では、フィールド内の値が指定された値の範囲内にあるかどうかを確認します。

例 5FieldName [NOT] BETWEEN Start_Range AND End_Range

customer.postalcode BETWEEN 90000 AND 99999

次の例では、少なくとも 1 つの行がサブクエリの条件を満たしているかどうかを確認します。 フィルター条件に EXISTS が含まれている場合、サブクエリが空のセットに評価されない限り、フィルター条件は True (.T.) に評価されます。

例 6 [NOT] EXISTS (Subquery)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

例 7FieldName [NOT] in Value_Set

customer.postalcode NOT IN ("98052","98072","98034")

フィルター条件に IN が含まれている場合、レコードがクエリ結果に含まれる前に、フィールドにいずれかの値が含まれている必要があります。

例 8FieldName [NOT] IN (Subquery)

customer.cust_id IN ;

(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")

このフィールドには、クエリ結果にレコードが含まれる前に、サブクエリによって返される値のいずれかが含まれている必要があります。

例 9FieldName [NOT] LIKE cExpression

customer.country NOT LIKE "USA"

このフィルター条件は、 cExpressionに一致する各フィールドを検索します。 パーセント記号 (%) およびアンダースコア ( _ ) ワイルドカード文字は、 cExpressionの一部として使用できます。 アンダースコアは、文字列内の 1 つの不明な文字を表します。

GROUP BY GroupColumn [, GroupColumn ...]
1 つ以上の列の値に基づいて、クエリ内の行をグループ化します。 GroupColumn には、次のいずれかを指定できます。

  • 通常のテーブル フィールドの名前。

  • SQL フィールド関数を含むフィールド。

  • 結果テーブル内の列の場所を示す数値式。 (左端の列番号は 1 です)。

HAVING FilterCondition
クエリ結果に含めるためにグループが満たす必要があるフィルター条件を指定します。 HAVING は GROUP BY と共に使用する必要があり、AND 演算子または OR 演算子によって接続されたフィルター条件をいくつでも含めることができます。 NOT を使用して、論理式の値を逆にすることもできます。

FilterCondition にサブクエリを含めることはできません。

GROUP BY 句のない HAVING 句は、WHERE 句と同様に動作します。 HAVING 句では、ローカルエイリアスとフィールド関数を使用できます。 HAVING 句にフィールド関数が含まれている場合は、WHERE 句を使用してパフォーマンスを向上させます。

[UNION [ALL] SELECTCommand]
1 つの SELECT の最終的な結果と、別の SELECT の最終的な結果を組み合わせます。 既定では、UNION は結合された結果をチェックし、重複する行を排除します。 複数の UNION 句を結合するには、かっこを使用します。

ALL を指定すると、UNION で結合された結果から重複する行が削除されなくなります。

UNION 句は、次の規則に従います。

  • UNION を使用してサブクエリを結合することはできません。

  • どちらの SELECT コマンドも、クエリ出力で同じ数の列を持つ必要があります。

  • 1 つの SELECT のクエリ結果の各列は、他の SELECT の対応する列と同じデータ型と幅を持つ必要があります。

  • 出力列を数値で参照する必要がある ORDER BY 句を含めることができるのは、最後の SELECT だけです。 ORDER BY 句が含まれている場合は、結果全体に影響します。

UNION 句を使用して、外部結合をシミュレートすることもできます。

クエリで 2 つのテーブルを結合すると、結合フィールドの値が一致するレコードのみが出力に含まれます。 親テーブルのレコードに対応するレコードが子テーブルにない場合、親テーブルのレコードは出力に含まれません。 外部結合を使用すると、親テーブルのすべてのレコードを子テーブル内の一致するレコードと共に出力に含めることができます。 Visual FoxPro で外部結合を作成するには、次の例のように、入れ子になった SELECT コマンドを使用する必要があります。

SELECT customer.company, orders.order_id, orders.emp_id ;  
FROM customer, orders ;  
WHERE customer.cust_id = orders.cust_id ;  
UNION ;  
SELECT customer.company, 0, 0 ;  
FROM customer ;  
WHERE customer.cust_id NOT IN ;  
(SELECT orders.cust_id FROM orders)  

各セミコロンの直前にスペースが含まれていることを確認します。 そ例外の場合はエラーが表示されます。

UNION 句の前のコマンドのセクションは、値が一致する両方のテーブルからレコードを選択します。 請求書が関連付けられていない顧客企業は含まれません。 UNION 句の後のコマンドのセクションでは、orders テーブルに一致するレコードがない顧客テーブル内のレコードが選択されます。

コマンドの 2 番目のセクションについては、次の点に注意してください。

  • かっこ内の SELECT ステートメントが最初に処理されます。 このステートメントにより、受注テーブル内のすべての顧客番号の選択が作成されます。

  • WHERE 句は、受注テーブルに含まれていない顧客テーブル内のすべての顧客番号を検索します。 このコマンドの最初のセクションでは、注文テーブルに顧客番号を持つすべての会社が提供されたため、顧客テーブル内のすべての会社がクエリ結果に含まれるようになりました。

  • UNION に含まれるテーブルの構造は同じである必要があるため、2 番目の SELECT ステートメントには、最初の SELECT ステートメントの orders.order_idorders.emp_id を表す 2 つのプレースホルダーがあります。

    プレースホルダーは、それらが表すフィールドと同じ型である必要があります。 フィールドが日付型の場合、プレースホルダーは { / / }にする必要があります。 フィールドが文字フィールドの場合、プレースホルダーは空の文字列 ("") である必要があります。

ORDER BY Order_Item [ASC |DESC] [, Order_Item [ASC |DESC] ...]
1 つ以上の列のデータに基づいてクエリ結果を並べ替えます。 各 Order_Item は、クエリ結果の列に対応する必要があり、次のいずれかになります。

  • FROM テーブル内のフィールド。メイン SELECT 句の選択項目でもあります (サブクエリ内ではありません)。

  • 結果テーブル内の列の場所を示す数値式。 (左端の列は数値 1 です)。

ASC は、注文アイテムまたはアイテムに従ってクエリ結果の昇順を指定し、ORDER BY の既定値です。

DESC は、クエリ結果の降順を指定します。

ORDER BY で注文を指定しない場合、クエリ結果は順序付けされずに表示されます。

解説

SELECT は、他の Visual FoxPro コマンドと同様に Visual FoxPro に組み込まれている SQL コマンドです。 SELECT を使用してクエリを実行すると、Visual FoxPro はクエリを解釈し、指定されたデータをテーブルから取得します。 SELECT クエリは、コマンド プロンプト ウィンドウまたは Visual FoxPro プログラム (他の Visual FoxPro コマンドと同様) から作成できます。

SELECT では、SET FILTER で指定されている現在のフィルター条件は考慮されません。

ドライバーの備考

アプリケーションが ODBC SQL ステートメント SELECT をデータ ソースに送信すると、Visual FoxPro ODBC ドライバーは、コマンドに ODBC エスケープ シーケンスが含まれている場合を除き、変換なしでコマンドを Visual FoxPro SELECT コマンドに変換します。 ODBC エスケープ シーケンスで囲まれた項目は、Visual FoxPro 構文に変換されます。 ODBC エスケープ シーケンスの使用の詳細については、「 Time および Date Functions」を参照してください Microsoft ODBC プログラマーリファレンス ODBC の Escape シーケンスを参照してください。

参照

CREATE TABLE - SQL
INSERT - SQL
SET ANSI
正確な設定