回覆列表
  • 1 # 使用者893130743901

    SELECT--SQL語法

    從一個或多個表中檢索資料。SELECTSQL命令是與其它Vfp一樣的內建的Vfp命令。當你使用SELECT來生成查詢時,Vfp翻譯查詢並從表中獲取指定資料。你可以從以下地方建立SELECT查詢:

    “命令”視窗中

    帶有其它任何Vfp命令的Vfp程式中

    查詢設計器中

    SELECT[ALL|DISTINCT][TOPnExpr[PERCENT]][Alias.]Select_Item

    [[AS]Column_Name][,[Alias.]Select_Item[[AS]Column_Name]...]

    FROM[FORCE][DatabaseName!]Table[[AS]Local_Alias]

    [[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]JOINDatabaseName!]

    Table[[AS]Local_Alias][ONJoinCondition...]

    [[INTODestination]|[TOFILEFileName[ADDITIVE]|TOPRINTER[PROMPT]|TOSCREEN]]

    [PREFERENCEPreferenceName][NOCONSOLE][PLAIN][NOWAIT]

    [WHEREJoinCondition[ANDJoinCondition...][AND|ORFilterCondition[AND|ORFilterCondition...]]]

    [GroupByGroupColumn[,GroupColumn...]][HAVINGFilterCondition][UNION[ALL]SELECTCommand]

    [OrderByOrder_Item[ASC|DESC][,Order_Item[ASC|DESC]...]]

    引數

    SELECT

    在SELECT子句中指定在查詢結果中包含的欄位、常量和表示式。

    ALL

    查詢結果中包含所有行(包括重複值)。ALL是預設設定。

    DISTINCT

    在查詢結果中剔除重複的行。每一個SELECT子句只能使用一次DISTINCT。

    TOPnExpr[PERCENT]

    在符合查詢條件的所有記錄中,選取指定數量或百分比的記錄。TOP子句必須與ORDERBY子句同時使用。ORDERBY子句指定查詢結果中包含的列上由Top字句決定的行數,TOP子句根據此排序選定最開始的nExpr個或nExpr%的記錄。

    您可以指定選取1到32767個記錄。使用ORDERBY子句指定的欄位進行排序,會產生並列的情況,比如,可能有多個記錄,它們在選定的欄位上相同;所以,如果您指定nExpr為10,在查詢結果中可能多於10個記錄,因為可能有幾個記錄位置並列。

    如果包含PERCENT關鍵字指定查詢結果中的記錄數,得到記錄數的可能是小數,這時進行取整。包含PERCENT關鍵字時,nExpr的範圍是0.01到99.99。

    [Alias.]Select_Item

    限定匹配項的名稱。Select_Item指定的每一項在查詢結果中都生成一列。一個項可以是以下一個

    FROM子句所包含的表中的欄位名稱。

    一個常量,查詢結果中每一行都出現這個常量值。

    一個表示式,可以是使用者自定義函式名。

    關於使用使用者定義函式的詳細資訊,參見注釋節中的帶使用者定義函式的SELECT。

    你用Select_Item指定的各項生成一個查詢結果列。

    如果兩個或更多的項具有相同的名稱,在項名前包含表別名和一個句點來避免列重複。

    [AS]Column_Name

    為查詢輸出中的列指定顯示名。Column_Name可以是表示式但不能包含不允許的字元,如,欄位名中的空格。

    當Select_Item是一個表示式或包含一個欄位函式而且你想給該列一個有意義的名字時該選項是有用的。

    FROM[FORCE]DatabaseName!

    列出所有從中檢索資料的表。

    FORCE指定連線表時按它們出現在FROM子句中的順序。如果省略FORCE,Vfp會試圖對查詢進行最佳化。但是,使用FORCE子句,避免了最佳化過程,可能加快查詢執行的速度。

    當包含表的資料庫不是當前資料庫時,DatabaseName!指定這個資料庫的名稱。如果資料庫不是當前資料庫,就必須指定包含表的資料庫名稱。應在資料庫名稱之後表名之前加上感嘆號(!)分隔符。

    [[AS]Local_Alias]

    為Table中的表指定一個臨時名稱。如果指定了本地別名,那麼在整個SELECT語句中必須都用這個別名代替表名。本地別名不影響VisualFoxPro環境。INNERJOIN只有在其他表中包含對應記錄(一個或多個)的記錄才出現在查詢結果中。

    INNERJOIN只有在其他表中包含對應記錄(一個或多個)的記錄才出現在查詢結果中。

    LEFT[OUTER]JOIN在查詢結果中包含:JOIN左側表中的所有記錄,以及JOIN右側表中匹配的記錄。OUTER關鍵字可被省略;包含OUTER強調這是一個外連線(outerjoin)。

    RIGHT[OUTER]JOIN在查詢結果中包含:JOIN右側表中的所有記錄,以及JOIN左側表中匹配的記錄。OUTER關鍵字可被省略;包含OUTER強調這是一個外連線接(outerjoin)。

    FULL[OUTER]JOIN在查詢結果中包含:JOIN兩側所有的匹配記錄,和不匹配的記錄;包含OUTER強調這是一個外連線(outerjoin)。

    關於連線的詳細資訊,參見備註段中的Joins。

    ONJoinCondition指定連線條件。

    INTODestination

    指定在何處儲存查詢結果。Destination可以是下列子句之一:

    ARRAYArrayName,將查詢結果儲存到變數陣列中。

    如果查詢結果中不包含任何記錄,則不建立這個陣列。

    CURSORCursorName[NOFILTER|READWRITE]將查詢結果儲存到臨時表中。

    要建立一個查用於子查詢中的遊標,用NOFILTER。關於NOFILTER的詳細資訊,參見備註節。

    要指定遊標是臨時的和可修改的,使用READWRITE。如果源表或表使用autoincrementing,該設定不會被READWRITE遊標繼承。

    DBF|TABLETableName[DATABASEDatabaseName[NAMELongTableName]]儲存查詢結果到一個表中。

    包含DATABASEDatabaseName以指定添加了表的資料庫。

    包含NAMELongTableName可以為該表命一個最多可包括128個字元的並且可以在資料庫中代替短名字的長名。

    如果沒有包括INTO子句,查詢結果顯示在一個“瀏覽”視窗中。也可以用TOFILE子句來定向查詢結果到印表機或一個檔案。

    TOFILEFileName[ADDITIVE]|TOPRINTER[PROMPT]|TOSCREEN

    定向查詢結果到印表機或一個檔案。

    ADDITIVE新增查詢輸出到TOFILEFileName中指定的已存在的文字檔案內容中。

    TOPRINTER定向查詢輸出到一個印表機。在列印開始之前,使用可選的PROMPT子句顯示一個對話方塊。您可以根據當前安裝的印表機驅動程式調整印表機的設定。將PROMPT子句放置在緊跟TOPRINTER之後。

    TOSCREEN使查詢結果定向輸出到Vfp主視窗或活動的使用者自定義視窗中。

    PREFERENCEPreferenceName

    如果查詢結果送往瀏覽視窗,就可以使用PREFERENCE儲存瀏覽視窗的屬性和選項以備後用。關於PREFERENCE功能的詳細資訊,參見備註節。

    NOCONSOLE

    不顯示送到檔案、印表機或Vfp主視窗的查詢結果。

    PLAIN

    防止列標題出現在顯示的查詢結果中。不管有無TO子句都可使用PLAIN子句。如果SELECT語句中包括INTO子句,則忽略PLAIN子句。

    NOWAIT

    開啟瀏覽視窗並將查詢結果輸出到這個視窗後繼續程式的執行。程式並不等待關閉瀏覽視窗,而是立即執行緊接在SELECT語句後面的程式行。關於如何使用NOWAIT的說明,參見備註節。

    WHEREJoinCondition

    指定Vfp的查詢結果中只包括符合指定條件的記錄。JoinCondition指定位於FROM子句中的欄位連線表。關於指定連線條件的詳細資訊,參見備註節。

    WHERE支援JoinCondition的ESCAPE運算子,讓你可以執行包含有百分號(%)和下劃線(_)萬用字元的SELECTSQL命令查詢。ESCAPE允許你指定一個按原字樣處理的SELECTSQL命令萬用字元。在ESCAPE子句中,一旦一個字元被放到萬用字元字元之前,就表示這個萬用字元被看作一個文字字元。

    FilterCondition

    指定將包含在查詢結果中記錄必須符合的條件。使用AND或OR運算子,您可以包含隨意數目的過濾條件。您還可以使用NOT運算子將邏輯表示式的值取反,或使用EMPTY()函式以檢查空欄位。

    SELECTSQL命令在篩選條件中支援"

    GroupByGroupColumn[,GroupColumn...]

    按列的值對查詢結果的行進行分組。GroupColumn可以是常規的表字段名,也可以是一個包含SQL欄位函式的欄位名,還可以是一個數值表示式,指定查詢結果表中的列位置(最左邊的列編號為1)。

    HAVINGFilterCondition

    指定包括在查詢結果中的組必須滿足的篩選條件。HAVING應該同GROUPBY一起使用。它能包含數量不限的篩選條件,篩選條件用AND或OR連線,還可以使用NOT來對邏輯表示式求反。可以在HAVING子句中使用本地別名和欄位函式。關於你可以使用的欄位函式的詳細資訊,參見備註節。FilterCondition不能包含子查詢。

    可以使用帶HAVING子句的GroupBy。使用HAVING子句的命令如果沒有使用GROUPBY子句,則它的作用與WHERE子句相同。

    如果HAVING子句不包含欄位函式的話,使用WHERE子句可以獲得較快的速度。

    HAVING子句應該出現在INTO子句前否則產生錯誤。

    [UNION[ALL]SELECTCommand]

    把一個SELECT語句的最後查詢結果同另一個SELECT語句最後查詢結果組合起來。預設情況下,UNION檢查組合的結果並排除重複的行。

    要組合多個UNION子句,可使用括號。可以用UNION子句模擬一個外部聯接。

    當一個列是備註或通用型時,不允許連線不同型別的列。

    在Vfp8.0以前的版本中,當在兩個不同型別的欄位上執行UNION操作時你需要執行明確的轉換。

    Vfp現在對支援它的資料型別支援隱含資料型別轉換。關於隱含資料型別轉換和資料型別優先,UNION子句允許的規則,以及其它資訊的詳細內容,參見備註節中的資料型別轉換和優先。

    OrderByOrder_Item[ASC|DESC]

    根據列的資料對查詢結果進行排序。每個Order_Item都必須對應查詢結果中的一列。它可以是下列之一:

    FROM子句中表的欄位,同時也是SELECT主句(不在子查詢中)的一個選擇項。

    一個數值表示式,表示查詢結果中列的位置(最左邊列編號為1)。

    ASC指定查詢結果根據排序項以升序排列。它是ORDERBY的預設選項。

    DESC指定查詢結果以降序排列。

    備註

    在使用FROM子句時如果沒有開啟表,Vfp顯示“開啟”對話方塊讓你指定檔案位置。一但開啟後,表在查詢完成後仍然保持開啟。

    當在Destination引數中使用CURSOR子句時,如果你指定了一個開啟的表的名字,Vfp產生一條錯誤資訊。在SELECT執行後,臨時遊標保持開啟並是活動的和只讀的除非你指定了READWRITE選項。當你關閉該臨時遊標時,它被刪除。遊標可以指定SORTWORK而成為存在於驅動器或捲上的臨時檔案。

    當在Destination引數中使用CURSOR子句時,你現在可以使用NOFILTER來建立一個可用於後來的查詢的遊標。在早期版本的Vfp中,你需要包括一個額外的常數或表示式作為篩選。例如,新增一個邏輯true作為篩選表示式來建立一個可用於後來的查詢的查詢:

    SELECT*,.T.FROMcustomersINTOCURSORmyquery

    當在Destination引數中使用DBF|TABLE子句時,如果你指定了一個已經開啟的表,而且SETSAFETY是設定為OFF,Vfp不警告地複寫該表。如果你沒有指定一個副檔名,Vfp給表一個.dbf副檔名。在SELECT執行後表保持開啟並且是活動的。

    如果你在相同查詢中包括INTO和TO子句,Vfp忽略TO子句。如果你包括TO子句但沒有包括INTO子句,你可以定向查詢結果到一個名為FileName的ASCII文字檔案,到印表機,或到Vfp主視窗。

    PREFERENCE把特徵,屬性或引數選項長期儲存在FoxUser.dbf資原始檔中。Preferences可以在任何時候獲取。第一次執行有PREFERENCEPreferenceName的SELECT命令時建立引數選項。以後執行有相同引數選項名的SELECT命令時便將瀏覽視窗恢復到原來的引數選項狀態。當瀏覽視窗關閉時,更新引數選項。如果您按下CTRL+Q+W鍵退出“瀏覽”視窗,您對“瀏覽”視窗所做的更改不會儲存到資原始檔中。

    SELECT命令中包括TOSCREEN可以把查詢結果定向輸出到Vfp主視窗或使用者自定義視窗。如果顯示時Vfp主視窗或使用者自定義視窗中寫滿了一屏,就暫停輸出。按任意鍵可以檢視查詢結果後面的內容。但是,如果命令中包括了NOWAIT子句,顯示查詢結果時就不會暫停,等待按鍵,而是在Vfp主視窗或使用者自定義視窗中連續滾過所有內容。如果命令中包含有INTO子句,忽略NOWAIT子句。

    在一個SQL查詢的WHERE子句中包括EVALUATE()函式會返回不正確的資料。

    如果包括一個以上的表在查詢中,你應該在第一個以後為每一個表指定一個連線條件。連線條件可以包含篩選條件。

    注意每一個SELECT語句的最大連線數是9.

    必須用AND運算子來連線多個連線條件。各連線條件具有以下格式:

    當你在串中使用=運算子時,它的動作根據SETANSI的設定會不同。當SETANSI設定為OFF時,Vfp只比較串到較短串結束。當SETANSI設定為ON時,Vfp遵循ANSI標準的字串比較。關於Vfp如果執行字串比較的額外資訊,參見SETANSI和SETEXACT。

    下列欄位函式可以與選定項一起使用,選定項可以是一個欄位或包含欄位的表示式:

    AVG(Select_Item),計算列中數值的平均值。

    COUNT(Select_Item),計算列中選定項的數目。計算查詢輸出的行數。COUNT(*)計算查詢輸出中的行數。

    MIN(Select_Item),確定列中Select_Item的最小值。

    MAX(Select_Item),確定列中Select_Item的最大值。

    SUM(Select_Item),計算列中數值的和。

    欄位函式不能巢狀使用。

    UNION子句遵守下列規則:

    不能使用UNION來組合子查詢。

    兩個SELECT命令的查詢結果中的列數必須相同。

    兩個SELECT查詢結果中的對應列必須有相同的資料型別和寬度。

    只有最後的SELECT中可以包含ORDERBY子句,而且必須按編號指出所輸出的列。如果包含了一個ORDERBY子句,它將影響整個結果。

    當你用UNION連線查詢中的兩個表時,僅匹配連線欄位值的記錄會出現在查詢結果中。如果在父表中的記錄在子表中沒有相應的記錄,父表中的記錄不會出現在查詢結果中。一個外部聯接允許你包括父表中的所有記錄到輸出結果中,連同子表中的匹配記錄一起。要在Vfp中建立一個外部聯接,你需要要使用一個巢狀的SELECT命令

    注意確信在每一個分號前包括一個空格。否則,Vfp產生一個錯誤。

    上例中,在UNION子句前的部分的命令從兩個表中選擇具有匹配值的記錄。不包括沒有相關的發票的客戶公司。命令中UNION子句後的部分選擇客戶表中的在訂單表中無匹配記錄的記錄。

    關於第二部分的命令,注意以下幾點:

    包括在園括號中的SELECT語句首先處理。該語句的結果是選擇訂單表中的所有客戶編號。

    WHERE子句找出customer表中的在orders表沒有相關記錄的所有客戶編號。由於第一節中的命令提供了所在orders表中有客戶編號的公司,Customer表中的所有公司現在都包含在查詢結果中了。

    因為在UNION中的表的結構必須相同,有兩個佔位符在第二個SELECT語句中來代表第一個SELECT語句中的orders.order_id和orders.emp_id。

    注意佔位符必須與它們所代表的欄位有相同型別。如果欄位是日期型,佔位符應該是。如果欄位是一個字元欄位,佔位符應該是一個空串("")。

    如果你沒有在OrderBy子句中指定排序,查詢結果顯示為未排序。

    當你發出SETTALKON並執行SELECT時,Vfp顯示查詢使用的時間和結果中的記錄數。_TALLY包含了在查詢結果中的記錄數。

    SETFILTER設定的篩選條件對SELECT命令不起作用。

    注意下面部分提到的子查詢,是指在SELECT命令中包含的SELECT命令。子查詢必須包括在園括號中。在SELECT命令的WHERE子句中可以包含最多兩個平級的(非巢狀)的子查詢。子查詢中可以有多個連線條件(joinconditions)。

    在你建立查詢輸出時,列的命名遵循如下規則:

    如果選擇項是具有唯一名稱的欄位,則用欄位名作為輸出列名。

    如果多個選擇項具有相同名稱。例如,如果名為Customer的表有一個STREET欄位,而名為Employees的表也有一個STREET欄位,則輸出列命名為Extension_A和Extension_B(STREET_A和STREET_B)。如果選擇項名稱有10字元長,可以將名稱截短後再加下劃線和字母。例如,DEPARTMENT變為DEPARTME_A。

    如果選擇項是表示式,它的輸出列命名為EXP_A。其他表示式分別命名為EXP_B、EXP_C,依此類推。

    如果選擇項包含諸如COUNT()這樣的欄位函式,則輸出列命名為CNT_A。如果另一個選擇項包含SUM(),它的輸出列命名為SUM_B。

    使用者定義函式和在SELECT子句中使用使用者自定義函式有明顯優點,但使用時應考慮以下限制:

    SELECT子句的執行速度會受使用者自定義函式執行速度的影響。因此,如果使使用者自定義函式的操作量很大,則這些函式的功能最好呼叫C語言或組合語言編寫的API或使用者自定義函式來完成。

    在SELECT啟用的使用者自定義函式中,很難預測Vfp輸入/輸出(I/O)和表的環境。一般來說,不知道選擇的工作區是哪一個,不知道當前表的名稱,甚至不知道正在處理的欄位名。這些變數的值完全取決於使用者自定義函式在最佳化過程的什麼地方啟用。

    在SELECT子句呼叫的使用者自定義函式中修改VfpI/O或表的環境是很不安全的。一般來說,這樣做的結果難以預料。

    從SELECT將值傳遞給使用者自定函式唯一可靠的方法,是啟用使用者自定義函式時以引數的形式傳遞。

    經過實踐,有可能發現某種被認為是違法的操作在某種FoxPro版本中執行正確,但這並不保證它在以後的版本中也能正確執行。

    拋開這些限制不說,使用者自定義函式在SELECT語句中還是可接受的。但不要忘記使用SELECT可能要降低效能。要學習如何在SELECT中使用使用者定義函式,參見示例節。

    連線Vfp支援ANSISQL"92連線(Join)語法,透過比較兩個或多個表中的欄位,將它們的記錄連線到一起,生成查詢。例如,內部連線(innerjoin)是將兩個表中連線欄位(joinedfield)值相同的記錄選取到查詢中。Vfp支援巢狀連線(nestedjoins)

    由於SQL是派生於數學集合理論,各表可以代表一個環。指定連線條件的ON子句確定交接點,它代表匹配的行集合。對於一個內部聯接,交接發生在兩個環的內部或"inner"部分。一個外聯接不僅僅包括這些表內部的交叉區域匹配的行,也包括環的外面的左或右部的交集的行。

  • 中秋節和大豐收的關聯?
  • AG張角“酒後吐真言”,對久哲咆哮“你長大了嗎”,直言尊敬久哲但也恨他,這為何呢?