美章網 資料文庫 數據庫管理系統中查詢技術范文

    數據庫管理系統中查詢技術范文

    本站小編為你精心準備了數據庫管理系統中查詢技術參考范文,愿這些范文能點燃您思維的火花,激發您的寫作靈感。歡迎深入閱讀并收藏。

    數據庫管理系統中查詢技術

    內容提要主要介紹在數據庫管理系統中實現模糊查詢的方法與技巧,提供了能實現真正模糊查詢的二個通用函數的源程序,特別是介紹了結構化查詢語言SQL中鮮為人知的通配符的使用方法。

    關鍵詞FoxPro模糊查詢SELECT-SQL通配符

    在數據庫管理系統中,查詢是一個很重要的內容。然而,在多數情況下人們不能準確知道作為查詢條件的字段內容,如:某字段內容為“涪陵師范高等專科學校”,查詢者可能只知道其簡稱“涪陵師專”或“涪師專”,這時,為保證能查到滿足條件的數據記錄,只能進行模糊查詢。下面從編程的角度談談在FoxPro2.5b中,實現模糊查詢的方法。

    一、簡單的模糊查詢方法

    ①利用比較操作符“=”進行模糊查詢。先把SETEXACT的設置置為OFF,這時,“=”用于兩個字符表達式之間作比較,其規則是:“=”右邊的字符逐個與“=”左邊相同位置的字符進行比較,只要遇到其中一個字符不相等,或者“=”右邊的字符表達式結束,比較操作就結束。所以,"abc"="abc","abc"="ab","ab_"="ab","ab"=""的比較結果均為邏輯真(.T.)。可見,這種方法的模糊性是不能令人滿意的。

    ②利用“$”進行包含比較,其模糊查詢的效果就比用“=”時好得多。這種方法是在“$”右邊的字符表達式中查找“$”左邊的字符表達式,若找到返回邏輯真(.T.),否則返回邏輯假(.F.)。用這種方法只要“$”左邊的字符表達式的每一個字符在“$”右邊的字符表達式中存在且位置不間斷,查找就能成功,然而對于諸如前面提到的“涪陵師專”或“涪師專”之類的簡稱,其查找結果為邏輯假(.F.)。

    由此可見,直接利用“=”和“$”進行比較操作是不能太“模糊”的。

    二、查詢條件為縮略語或簡稱的模糊查詢方法

    縮略語或簡稱在地名、單位名稱中使用非常廣泛。通常,縮略語或簡稱是由全稱中的某些排列位置不連續的字符組成的,因此,通過設置不同長度的字符串進行比較的規則,或者利用包含比較符“$”,是不能對縮略語或簡稱進行模糊查詢的。這時可編寫一通用的自定義函數,將用戶輸入的查詢條件(<字符串2>)與字符型字段變量(<字符串1>)進行逐字比較,如果<字符串2>是<字符串1>的縮略語或簡稱,則返回邏輯真(.T.)否則返回邏輯假(.F.),從而實現模糊查詢。

    下面將作者所編寫的自定義函數介紹給讀者,以供參考。

    設計思想:此函數必須是一個通用函數。為此,執行時可先接受二個參數──<字符串1>和<字符串2>。從<字符串2>的左邊開始取其第

    一、二個字符X1,用AT()函數測試X1在<字符串1>中的位置S1,如果S1不為0,就將<字符串1>中包含X1以及左邊部分的字符截掉,并取<字符串2>中的第

    三、四個字符X2,用AT()函數測試X2在<字符串1>的剩余部分中的位置S2,若S2不為0,就將<字符串1>的剩余部分中包含X2以及左邊部分的字符截掉……,直到將<字符串2>中的字符取完并在<字符串1>中測試完為止,最后本函數返回邏輯真(.T.)。在這個過程中只要有一次測試不成功(即Sn=0),則退出本函數并返回邏輯假(.F.)。因為一個漢字占二個ASCII字符,所以每次取二個相鄰字符進行測試(讓ZFBJ.PRG中的K=2)。這樣做,一是可以減少測試比較的次數,提高程序運行速度。二是當<字符串2>中含有數字、字母等半角字符時,可以減少滿足條件的記錄數目,提高查詢的命中率。然而,若查詢條件中含有英文縮寫,則每次只能取一個ASCII字符進行測試(讓ZFBJ.PRG中的K=1)。

    本函數的源程序如下:

    *程序名稱:ZFBJ.PRG

    *程序功能:比較<字符串2>是否為<字符串1>的縮略語

    *調用格式:ZFBJ(<字符串1>,<字符串2>)

    *通常<字符串1>是一個字符型字段變量

    *返回值:邏輯值.T.或.F.

    *使用環境:FoxPro2.5b

    PARAMETERSm.FIELD,m.INMC

    PRIVATEALL

    IF(PARAMETERS()<2);

    OREMPTY(ALLTRIM(m.FIELD));

    OREMPTY(ALLTRIM(m.INMC))

    RETURN.F.

    ENDIF

    IFSET("TALK")="ON"

    SETTALKOFF

    m.talkstat="ON"

    ENDIF

    pstat=SET("COMPATIBLE")

    SETCOMPATIBLEFOXPLUS

    J=LEN(ALLTRIM(m.INMC))

    K=2

    FORI=1TOJSTEPK

    m.MC=SUBSTR(ALLTRIM(m.INMC),I,K)

    MCWZ=AT(m.MC,ALLTRIM(m.FIELD))

    IFMCWZ<>0

    m.FIELD=SUBSTR(ALLTRIM(m.FIELD),MCWZ+K)

    fhz=.T.

    ELSE

    fhz=.F.

    EXIT

    ENDIF

    ENDFOR

    IFm.talkstat="ON"

    SETTALKON

    ENDIF

    pstat="ON"

    SETCOMPATIBLEON

    ENDIF

    RETURNfhz

    使用舉例:設內存變量m.field,其值為用戶輸入的用戶名稱的簡稱,如“涪師專”,現在要在KTJBK.DBF中查詢用戶名稱(字段名)為“涪陵師范高等專科學校”,或為“涪陵師專”,或為“涪師專”的全部記錄,可以先將滿足條件的記錄拷貝到一臨時數據庫TEMP.DBF中,然后再瀏覽,瀏覽完畢刪除臨時數據庫TEMP.DBF。其程序如下:

    m.field="涪師專"

    SELECT0

    USEKTJBK

    COPYTOTEMP.DBFFORZFBJ(用戶名稱,m.field)

    SELECT0

    USETEMP

    BROWSENOEDIT

    USE

    DELETEFILE

    TEMP.DBF

    SELECTKTJBK

    USE

    通過上面介紹的自定義函數實現了真正的模糊查詢,然而令人遺憾的是它的速度表現總使人感到美中不足。幸好在FoxPro中引入了結構化查詢語言SELECT-SQL。

    三、利用FoxPro中SELECT-SQL語句的模糊查詢方法

    結構化查詢語言SQL是FoxPro中值得驕傲的特色之一。利用SQL的SELECT語句

    可以非常方便、極其快速地進行十分復雜的查詢操作。特別值得推薦的是ELECT-SQL語句中的WHERE參數支持通配符“%(百分符號)”和“_(下劃線符號)”,因此,對于查詢條件為縮略語或簡稱的情況,可以非常簡單地實現真正的模糊查詢。這里,百分符號“%”代表0個或0個以上的任意字符,下劃線符號“_”代表1個任意字符,它們只能與運算符LIKE搭配使用。

    使用舉例:設內存變量m.field,其值為用戶輸入的用戶名稱的簡稱,如“涪師專”,現在要在KTJBK.DBF中查詢用戶名稱(字段名)為“涪陵師范高等專科學校”,或為“涪陵師專”,或為“涪師專”的全部記錄,可以用下面的一段程序實現:

    m.field="涪師專"

    mc_cxtj="%"

    FORi=1TOLEN(ALLTRIM(m.field))STEP2

    mc_cxtj=mc_cxtj+SUBSTR(ALLTRIM(m.field),i,2)+"%"

    ENDFOR

    SELECT*;

    FROMKTJBK;

    WHEREKTJBK.用戶名稱LIKE(mc_cxtj);

    INTOCURSORTEMP

    程序說明:本程序運行時,先將m.field="涪師專"中插入四個通配符“%”,得到mc_cxtj="%涪%師%專%",然后利用SQL的SELECT語句,從數據庫KTJBK.DBF中選出字段變量“用戶名稱”符合“%涪%師%專%”格式的所有記錄,輸出到一個虛擬臨時數據庫TEMP.DBF中。

    利用FoxPro中的結構化查詢語言SELECT-SQL可以編寫出很漂亮的通用查詢程序。筆者在數據庫管理系統的開發實踐中,曾用FoxPro的屏幕生成器編寫過一通用查詢程序,其通用性和執行速度表現都非常好(本人愿拋磚引玉,奉獻給有興趣的《軟件世界》讀者,見附錄),限于篇幅這里就不詳細介紹了。

    附錄:《一個真正的通用查詢程序》見磁盤文件TYCX.TXT(純文本文件)或

    TYCX.DOC(WORD97文檔)

    參考文獻:

    1.江英,楊欣等翻譯.FoxPro2.5使用與參考大全,清華大學出版社,1995

    2.章立民.FoxPro2.5forDOS程序設計——提高篇,人民郵電出版社,1994

    主站蜘蛛池模板: 日本一区二三区好的精华液| 精品一区二区无码AV| 日韩AV在线不卡一区二区三区 | 色狠狠色噜噜Av天堂一区| 国产一区二区三区视频在线观看| 在线观看国产一区二区三区| 亚洲中文字幕乱码一区| 国产综合视频在线观看一区| 美女福利视频一区二区| 中文字幕一区二区三区在线播放 | 精品一区二区三区在线播放 | a级午夜毛片免费一区二区| 国产一区二区三区不卡AV| 国产在线乱子伦一区二区| 韩国精品一区视频在线播放 | 国产一区二区电影| 少妇人妻精品一区二区三区| a级午夜毛片免费一区二区| 国产免费无码一区二区| 毛片一区二区三区| 美女视频一区二区| 亚洲国产一区国产亚洲| 国产aⅴ一区二区| 久久中文字幕一区二区| 国产麻豆剧果冻传媒一区| 国产激情视频一区二区三区| 人妻在线无码一区二区三区| 国产高清在线精品一区二区三区| 肉色超薄丝袜脚交一区二区| 成人毛片一区二区| 搡老熟女老女人一区二区| 天天看高清无码一区二区三区| 国产精品视频一区二区三区无码| 欧美激情一区二区三区成人| 国产伦精品一区二区三区视频猫咪 | 高清一区二区在线观看| 精品无码一区二区三区爱欲九九| 高清一区二区三区| 亚洲Av永久无码精品一区二区| 中文字幕一区二区免费| 精品国产一区二区三区香蕉事|