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 では、クエリ結果から行の重複が除外されます。

Note

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

エイリアス。 一致する項目名を指定します。 クエリで指定した各 項目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!]テーブル [Local_Alias] [, [DatabaseName!]テーブル [Local_Alias] ...]
クエリが取得するデータを含むテーブルを一覧表示します。 テーブルが開いていない場合、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

例 2フィールド名の比較式

payments.amount >= 1000

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

company < ALL ;

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

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

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

company < ANY ;

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

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

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

Start_RangeEND_RANGEの間の例 5フィールド名[NOT]

customer.postalcode BETWEEN 90000 AND 99999

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

例 6 [NOT] Exists (サブクエリ)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

例 7FieldName [NOT] in Value_Set

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

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

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

customer.cust_id IN ;

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

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

例 9FieldName [NOT] はcexpressionに似ています。

customer.country NOT LIKE "USA"

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

Groupcolumn [, groupcolumn ...] でグループ化
1つまたは複数の列の値に基づいて、クエリ内の行をグループ化します。 Groupcolumn には、次のいずれかを指定できます。

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

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

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

Filterconditionを持つ
グループがクエリ結果に含めるために満たす必要のあるフィルター条件を指定します。 HAVING は GROUP BY と共に使用する必要があり、必要な数のフィルター条件を AND または OR 演算子で連結できます。 論理式の値を逆にするために NOT を使用することもできます。

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

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

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

ALL は、UNION によって結合された結果から重複する行を削除しないようにします。

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

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

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

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

  • 最後の SELECT だけが ORDER BY 句を持つことができます。これは、出力列を数値で参照する必要があります。 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)  

Note

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

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

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

  • かっこ内の SELECT ステートメントは、最初に処理されます。 このステートメントでは、orders テーブル内のすべての顧客番号を選択します。

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

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

    Note

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

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

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

  • 結果テーブル内の列の位置を示す数値式です。 (一番左の列は number 1 です)。

ASC は、order 項目に従ってクエリの結果の昇順を指定し、ORDER BY の既定値です。

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

ORDER BY で order を指定しない場合、クエリ結果は順序なしとして表示されます。

注釈

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

Note

[フィルターの設定] で指定された現在のフィルター条件を考慮しません。

ドライバーの解説

アプリケーションから odbc SQL ステートメントをデータソースに送信すると、visual foxpro odbc ドライバーは、コマンドに odbc エスケープシーケンスが含まれていない限り、コマンドを変換せずに visual foxpro select コマンドに変換します。 ODBC エスケープシーケンスで囲まれた項目は、Visual FoxPro 構文に変換されます。 ODBC エスケープシーケンスの使用方法の詳細については、『 MICROSOFT Odbc プログラマーズリファレンス』の「 Time 関数と Date 関数」および「 odbc でのエスケープシーケンス」を参照してください。

参照

CREATE TABLE-SQL
SQL の挿入
ANSI の設定
正確に設定