摘要:基于Visual FoxPro(VFP)和Structured Query Language(SQL)編程的應用實踐,文章闡述了SQL的工作原理,并從數(shù)據(jù)查詢、數(shù)據(jù)表聯(lián)接、數(shù)據(jù)更新、數(shù)據(jù)統(tǒng)計等方面介紹了SQL語言在VFP中的應用,給出了具體應用實例,以便于VFP使用者利用SQL實現(xiàn)數(shù)據(jù)庫內的復雜信息的快速存儲、自然聯(lián)接和統(tǒng)計。以及信息的便捷查詢。
關鍵詞:Structured Query Language語言;Visual FoxPro;數(shù)據(jù)庫;信息處理
0 引言
結構化查詢語言SQL是英文Structured Query Language的縮寫。按照美國國家標準協(xié)會(ANSI)的規(guī)定,SQL被作為關系型數(shù)據(jù)庫管理系統(tǒng)的標準語言,SQL語句可以用來執(zhí)行各種操作。目前,絕大多數(shù)流行的關系數(shù)據(jù)管理系統(tǒng)(DBMS),例如Oracle,Sybase,SQL Server,Visual FoxPro等都采用了SQL標準語言。
如圖1所示,數(shù)據(jù)庫管理系統(tǒng)是一個存放信息的數(shù)據(jù)庫及管理、控制數(shù)據(jù)庫的軟件系統(tǒng),當用戶需要檢索數(shù)據(jù)庫中的數(shù)據(jù)時,可以通過SQL語言發(fā)出請求,數(shù)據(jù)庫管理系統(tǒng)對SQL請求進行處理,將按要求所檢索到的數(shù)據(jù)返給用戶。
盡管查詢數(shù)據(jù)是SQL的最重要的功能之一,但它絕不僅僅是一個查詢工具,它還為用戶提供了用于控制數(shù)據(jù)庫管理系統(tǒng)的所有功能,包括數(shù)據(jù)定義、數(shù)據(jù)操縱、數(shù)據(jù)控制等功能。筆者在多年的教學中深深體會到,在VFP中使用SQL語句來處理數(shù)據(jù),不僅方便了編程,而且還可以大大提高數(shù)據(jù)處理的速度。
以下從打開數(shù)據(jù)表、表間的聯(lián)接、數(shù)據(jù)查詢等幾方面敘述SQL在VFP中實現(xiàn)快速信息處理的具體應用。
1 數(shù)據(jù)查詢內容豐富、使用簡單
SQL的核心是查詢,其基本語句形式是:
SELECT * ROM…WHERE…
SQL數(shù)據(jù)查詢有:“簡單查詢”、“多表聯(lián)接查詢”、“嵌套查詢”、“特殊運算符查詢”“通配符查詢”、“排序查詢”等多種形式,程序語句簡單,使用起來方便快捷。
例如:在“成績DBF”表中求出選修111101號課程學生中成績比選修141203號課程的任何學生的成績都要高的學生的學號和成績。
語句形式為:
SELECT學號.成績FROM成績WHERE課程號=“111101”
and成績>all;
(SELECT成績FROM成績WHERE課程號=“141203”)
2 數(shù)據(jù)表的聯(lián)接
在進行數(shù)據(jù)庫結構設計時,為了消除冗余數(shù)據(jù),會將數(shù)據(jù)分配在不同的表中存儲,這樣我們就不可避免地需要同時從不同的表中檢索數(shù)據(jù)。要想使用一個查詢從多個表中返回數(shù)據(jù),就需要清楚這些表中的數(shù)據(jù)之間的關系,進而建立聯(lián)接,只有這樣才能保證從來源于多表的檢索結果是正確的。
在Visual FoxPro中,數(shù)據(jù)表的聯(lián)接是一種等值聯(lián)接,即只有滿足聯(lián)接條件,相應的結果才會出現(xiàn)在結果表中,并且是采用了“視圖”和“查詢”的方法來解決,這兩種方法也是只有視窗形式,而沒有語句,更不能進行復雜聯(lián)接。而SQL語句采用的是自然聯(lián)接,大大提升了聯(lián)接的功能。其聯(lián)接的運算方法是:首先保證一個表中滿足條件的記錄都在結果中,然后將滿足聯(lián)接條件的記錄與另一個表的記錄進行聯(lián)接,不滿足聯(lián)接條件的則應將來自另一個表的屬性值置為空值。SQL語句有四種聯(lián)接方式:內部聯(lián)接(Inner Join)、左聯(lián)接(Left join)、右聯(lián)接(RightJoin)、完全聯(lián)接(Full Join)。
例如:現(xiàn)有數(shù)據(jù)表A和數(shù)據(jù)表B,兩表的結構和記錄已知。請用SQL語句對它們進行四種聯(lián)接。
內部聯(lián)接(Inner Join):
Select A.Key,B.K from A Inner Join B On A.Key=B.key
左聯(lián)接(Left Join):
Select A.Key,B.K from A Left Join B On A.Key=B.key
右聯(lián)接(Right Join):
Select A.Key,B.K from A Ringht Join B On A.Key=B.key
完全聯(lián)接(Full Join):
Select A.Key,B.K from A Full Join B On A.Key=B.key
3 數(shù)據(jù)存儲規(guī)范及數(shù)據(jù)更新方便簡捷
在數(shù)據(jù)庫編程中,常常需要將大量的數(shù)據(jù)存儲。SQL語句有下列五種形式的數(shù)據(jù)存儲語句:
INTO ARRAY;INTO CURSOR;INTO TABLEIDBF;TO FILE;
TO PRINTER
INTO ARRAY語句可以將一個查詢結果存放到一個二維數(shù)組中;INTO CURSOR語句可以將一個查詢結果存放到臨時數(shù)據(jù)表文件中,可以像數(shù)據(jù)表一樣瀏覽其中的記錄。當關閉表時將自動刪除;INTO TABLEIDBF將查詢結果存放到永久表中;TO FILE將查詢結果存放到文本文件中;TO PRINTER將查詢結果直接輸出到打印機。
在數(shù)據(jù)庫操作中,數(shù)據(jù)記錄的更新是常有的事。在VisualFoxPro中數(shù)據(jù)記錄更新是通過自動替換(REPLACE)語句和表間記錄更新(UPDATE)語句實現(xiàn)的。自動替換主要用于單表。其中表間記錄更新的使用形式非常復雜,牽扯到多語句的相互制約,操作中思路很難理頓,必須要考慮到每個表的指針移動情況。SQL語句就省事多了,單表和多表可以一起考慮,其操作非常簡捷。
例如:將“英語DBF”表中的“考分”字段的記錄值加到“成績.DBF”表中的“總分”字段記錄中,同時將這兩個表中涉及到的記錄做標記,用于意外情況的處理(判斷這兩個表在操作中有可能被漏掉的記錄)。SQL語句為:
UPDATE(SELECT成績.學號,成績.總分,英語.姓名,英語.考分,英語.標記From成績Inner Join英語On成績.學號=英語.學號)SET成績.總分=成績.總分+英語.考分,成績。標記=1,英語.標記=1
4 數(shù)據(jù)統(tǒng)計多功能融為一體
統(tǒng)計同樣是數(shù)據(jù)庫編程中常用的功能之一。在VisualFoxPro中對數(shù)據(jù)表的統(tǒng)計工作用到了三條語句(COUNT、SUM、AVERAGE)和兩個函數(shù)MAX( )、MIN( ),功能分散。在SQL語句中不再將它們作為語句和函數(shù)分開,而是作為參數(shù)使用。這樣一來就可以把數(shù)據(jù)統(tǒng)計放在一條語句中來完成,使數(shù)據(jù)統(tǒng)計工作實現(xiàn)了融合。
例如:求“英語DBF”表中全班人數(shù)、“考分”字段的總分、平均分、最高分、最低分。
SELECT COUNT(*),SUM(考分),AVG(考分),MAX(考分),MIN(考分)
FROM英語
如果要把求得的分值分別保存到變量A、B、C、D、E中的話,可以將上面的語句改寫成:
SELECT COUNT(*)AS A,SUM(考分)AS B,AVG(考分)AS C,
MAX(考分)AS D,MIN(考分)AS E FROM英語5結束語
SQL語言可以直接在Visual FoxPro的命令窗口以人機交互的方式使用,也可以嵌入到程序中。Visual FoxPro應用開發(fā)工具已將SQL語言直接嵌入到自身的語言之中,使用起來更加方便。由于SQL中的強大處理功能,極大地豐富了Visual FoxPro的處理能力,已經成為編程中不可缺少的部分。