SELECT - SQL コマンド

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

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

構文

  
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] ...]]  

引数

Note

次の引数で参照される サブクエリは、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 で実行される操作の速度は、このようなユーザー定義関数が実行される速度によって制限される場合があります。 ユーザー定義関数に関連する大量の操作は、API と C 言語またはアセンブリ言語で記述されたユーザー定義関数を使用して行う方が適切な場合があります。

  • 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] ...]
クエリが取得するデータを含むテーブルをListsします。 開いているテーブルがない場合は、ファイルの場所を指定できるように、Visual FoxPro に [ 開く ] ダイアログ ボックスが表示されます。 開いた後も、クエリが完了した後もテーブルは開いたままになります。

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 つです。

演算子 比較
= 等しい
== 完全に等しい
LIKE 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

例 3フィールド名の比較 ALL (サブクエリ)

company < ALL ;

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

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

例 4フィールド名の比較 ANY |SOME (サブクエリ)

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 (サブクエリ)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

例 7フィールド名 [NOT] IN Value_Set

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

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

例 8FieldName [NOT] IN (サブクエリ)

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 ステートメントは、最初に処理されます。 このステートメントでは、orders テーブル内のすべての顧客番号の選択が作成されます。

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

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

    注意

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

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

  • (サブクエリではなく) メイン SELECT 句の選択項目でもある FROM テーブル内のフィールド。

  • 結果テーブル内の列の場所を示す数値式。 (左端の列は数値 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 エスケープ シーケンスの使用方法の詳細については、「 時刻関数と日付関数 」を参照してください。 「Microsoft ODBC プログラマー リファレンス」の「 ODBC でのエスケープ シーケンス」を参照してください。

参照

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