SELECT - SQL 命令
從一或多個數據表擷取數據。
Visual FoxPro ODBC Driver 支援此命令的原生 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] ...]]
引數
注意
在下列自變數中參考的子查詢是 SELECT 內的 SELECT,且必須以括弧括住。 在 WHERE 子句中,您最多可以有兩個相同層級的子查詢(未巢狀)。 (請參閱自變數的該區段。子查詢可以包含多個聯結條件。
[ALL |DISTINCT] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [AS Column_Name] ...]
SELECT 子句會指定查詢結果中顯示的欄位、常數和表示式。
根據預設,ALL 會顯示查詢結果中的所有數據列。
DISTINCT 會從查詢結果中排除任何數據列的重複專案。
注意
每個 SELECT 子句只能使用 DISTINCT 一次。
別名。 限定相符的項目名稱。 您使用 Select_Item指定的每個項目都會產生查詢結果的一個資料行。 如果兩個或多個專案具有相同的名稱,請包含數據表別名和項目名稱之前的句點,以防止重複數據行。
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子句中數據表的欄位。 如果您在查詢中包含一個以上的數據表,則應該在第一個數據表之後為每個數據表指定聯結條件。
重要
當您建立聯結條件時,請考慮下列資訊:
如果您在查詢中包含兩個數據表,但未指定聯結條件,只要符合篩選條件,第一個數據表中的每個記錄都會聯結至第二個數據表中的每個記錄。 這類查詢可能會產生冗長的結果。
使用空白欄位聯結數據表時請小心,因為 Visual FoxPro 符合空白欄位。 例如,如果您在CUSTOMER.ZIP和INVOICE.ZIP聯結,且 CUSTOMER 包含 100 個空白郵遞區區,且 INVOICE 包含 400 個空白郵遞區區,則查詢輸出會包含 40,000 筆額外的記錄,而空白字段所產生的記錄則為 40,000 筆。 使用 EMPTY( ) 函式,從查詢輸出中排除空的記錄。
您必須使用 AND 運算符來連接多個聯結條件。 每個聯結條件都有下列形式:
FieldName1 比較 FieldName2
FieldName1 是一個數據表中的功能變數名稱, FieldName2 是另一個數據表的功能變數名稱,而 Comparison 是下表所述的其中一個運算符。
Operator | 比較 |
---|---|
= | 等於 |
== | 完全相等 |
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 可以採用下列範例中的任何窗體:
範例 1 FieldName1 比較 FieldName2
customer.cust_id = orders.cust_id
範例 2 FieldName 比較表達式
payments.amount >= 1000
範例 3 FieldName 比較 ALL (子查詢)
company < ALL ;
(SELECT company FROM customer WHERE country = "USA")
當篩選條件包含 ALL 時,字段必須符合子查詢產生之所有值的比較條件,其記錄才會包含在查詢結果中。
範例 4 FieldName 比較 ANY |SOME (子查詢)
company < ANY ;
(SELECT company FROM customer WHERE country = "USA")
當篩選條件包含 ANY 或 SOME 時,欄位必須符合子查詢所產生的至少一個值的比較條件。
下列範例會檢查欄位中的值是否在指定的值範圍內:
範例 5 FieldName [NOT] BETWEEN Start_Range 和 End_Range
customer.postalcode BETWEEN 90000 AND 99999
下列範例會檢查是否至少有一個數據列符合子查詢中的準則。 當篩選條件包含 EXISTS 時,除非子查詢評估為空白集合,否則篩選條件會評估為 True (.T.)。
範例 6 [NOT] EXISTS (子查詢)
EXISTS ;
(SELECT * FROM orders WHERE customer.postalcode =
orders.postalcode)
範例 7 FieldName [NOT] IN Value_Set
customer.postalcode NOT IN ("98052","98072","98034")
當篩選條件包含 IN 時,字段必須包含其中一個值,其記錄才會包含在查詢結果中。
範例 8 FieldName [NOT] IN (子查詢)
customer.cust_id IN ;
(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")
在此,欄位必須包含子查詢傳回的其中一個值,然後才會將其記錄包含在查詢結果中。
範例 9 FieldName [NOT] LIKE cExpression
customer.country NOT LIKE "USA"
此篩選條件會搜尋符合 cExpression 的每個欄位。 您可以使用百分比符號 • 和底線 (_ ) 通配符作為 cExpression 的一部分。 底線代表字串中的單一未知字元。
GROUP BY GroupColumn [, GroupColumn ...]
根據一或多個數據行中的值,將查詢中的數據列分組。 GroupColumn 可以是下列其中一項:
一般數據表欄位的名稱。
包含 SQL 欄位函式的欄位。
數值表達式,表示結果數據表中數據行的位置。 (最左邊的數據行編號是 1。)
HAVING FilterCondition
指定群組必須符合才能包含在查詢結果中的篩選條件。 HAVING 應該與 GROUP BY 搭配使用,而且可以包含您想要的篩選條件,由 AND 或 OR 運算符連接。 您也可以使用 NOT 來反轉邏輯表達式的值。
FilterCondition 不能包含子查詢。
沒有 GROUP BY 子句的 HAVING 子句的行為就像 WHERE 子句。 您可以在 HAVING 子句中使用區域別名和欄位函式。 如果您的 HAVING 子句不包含字段函式,請使用 WHERE 子句來加快效能。
[UNION [ALL] SELECTCommand]
結合一個 SELECT 的最終結果與另一個 SELECT 的最終結果。 根據預設,UNION 會檢查合併的結果,並排除重複的數據列。 使用括號來結合多個 UNION 子句。
ALL 可防止 UNION 排除合併結果中的重複數據列。
UNION 子句遵循下列規則:
您無法使用 UNION 來合併子查詢。
這兩個SELECT命令在其查詢輸出中必須有相同數目的數據行。
一個 SELECT 查詢結果中的每個資料行都必須有與另一個 SELECT 中對應數據行相同的數據類型和寬度。
只有最終 SELECT 可以有 ORDER BY 子句,必須依編號參考輸出數據行。 如果包含 ORDER BY 子句,它會影響完整的結果。
您也可以使用 UNION 子句來模擬外部聯結。
當您在查詢中聯結兩個數據表時,只有聯結欄位中具有相符值的記錄才會包含在輸出中。 如果父數據表中的記錄在子數據表中沒有對應的記錄,則父數據表中的記錄不會包含在輸出中。 外部聯結可讓您在輸出中包含父數據表中的所有記錄,以及子數據表中的相符記錄。 若要在 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 子句之後的 命令區段會選取客戶數據表中沒有訂單數據表中相符記錄的記錄。
關於命令的第二個區段,請注意下列事項:
括弧內的SELECT語句會先處理。 此語句會建立訂單數據表中所有客戶號碼的選取範圍。
WHERE 子句會在客戶數據表中尋找不在訂單數據表中的所有客戶號碼。 由於命令的第一個區段提供訂單數據表中具有客戶號碼的所有公司,因此客戶數據表中的所有公司現在都會包含在查詢結果中。
由於 UNION 中包含的數據表結構必須相同,因此第二個 SELECT 語句中有兩個佔位符來表示 第一個 SELECT 語句中的orders.order_id 和 orders.emp_id 。
注意
佔位元的類型必須與它們所代表的欄位相同。 如果欄位是日期類型,則佔位元應該是 { / / }。 如果字位是字元字段,則佔位元應該是空字串串 (“” )。
ORDER BY Order_Item [ASC |DESC] [, Order_Item [ASC |DESC] ...]
根據一或多個數據行中的數據來排序查詢結果。 每個 Order_Item 都必須對應至查詢結果中的數據行,而且可以是下列其中一項:
FROM 數據表中的欄位,也是主要 SELECT 子句中的選取專案(不在子查詢中)。
數值表達式,表示結果數據表中數據行的位置。 (最左邊的數據行是數位 1。)
ASC 會根據訂單專案或專案來指定查詢結果的遞增順序,而且是 ORDER BY 的預設值。
DESC 會指定查詢結果的遞減順序。
如果您未使用 ORDER BY 指定訂單,查詢結果就會顯示為未排序。
備註
SELECT 是 Visual FoxPro 內建的 SQL 命令,就像任何其他 Visual FoxPro 命令一樣。 當您使用 SELECT 來擺出查詢時,Visual FoxPro 會解譯查詢,並從數據表擷取指定的數據。 您可以從 [命令提示字元] 視窗或 Visual FoxPro 程式內建立 SELECT 查詢(如同任何其他 Visual FoxPro 命令一樣)。
注意
SELECT 不符合以 SET FILTER 指定的目前篩選條件。
驅動程式備註
當您的應用程式將 ODBC SQL 語句 SELECT 傳送至數據源時,除非命令包含 ODBC 逸出序列,否則 Visual FoxPro ODBC Driver 會將命令轉換成 Visual FoxPro SELECT 命令,而不會進行翻譯。 包含在 ODBC 逸出序列中的項目會轉換成 Visual FoxPro 語法。 如需使用 ODBC 逸出序列的詳細資訊,請參閱時間與日期函式以及 ODBC 程式設計人員參考中的Microsoft,請參閱 ODBC 中的逸出序列。