汪 洋
(安慶師范大學(xué)計(jì)算機(jī)與信息學(xué)院,安徽安慶246133)
SQL語言中沒有全稱量詞和邏輯蘊(yùn)含[1](本文將帶有全稱量詞和邏輯蘊(yùn)含的查詢稱為復(fù)雜查詢),實(shí)踐中,必須將復(fù)雜查詢變換為等價(jià)的帶有存在量詞的謂詞查詢[2],這一過程對于數(shù)據(jù)庫初學(xué)者是一個(gè)不小的挑戰(zhàn)。作者在多年數(shù)據(jù)庫教學(xué)實(shí)踐的反思和探索下,借助謂詞演算語言ALPHA將復(fù)雜查詢進(jìn)行等價(jià)變換,生成SQL語句,過程簡單清晰,易為初學(xué)者所理解和掌握。
圖1 基于ALPHA語言的復(fù)雜查詢SQL語句生成框架
本文提出的復(fù)雜查詢的SQL語句生成框架如圖1所示。
首先將復(fù)雜查詢用ALPHA語言進(jìn)行表示, 然后利用邏輯謂詞等價(jià)變換理論,將ALPHA語句中的全稱量詞和邏輯蘊(yùn)含進(jìn)行等價(jià)變換,最后再使用ALPHA語言查詢語句向SQL語句變換生成算法生成SQL語言查詢。
SQL語言沒有全稱量詞,只能把帶有全稱量詞的謂詞變換為等價(jià)的帶有存在量詞的謂詞[3-4]。
(1)式語義解釋:對于所有的x,P都成立等價(jià)于不存在一個(gè)x,P不成立。
SQL語言也沒有邏輯蘊(yùn)含謂詞和運(yùn)算,可以利用謂詞演算將邏輯蘊(yùn)含謂詞進(jìn)行等價(jià)變轉(zhuǎn):
(2)式語義解釋:p則q等價(jià)于非p或q。
如果查詢要求中既有全稱量詞,又有邏輯蘊(yùn)含,則可進(jìn)行下面的等價(jià)變換。
(3)式語義解釋:對于所有的y,p則q,等價(jià)于不存在這樣的y,p成立而q不成立。
關(guān)系演算以數(shù)理邏輯中的謂詞演算為基礎(chǔ),分成元組關(guān)系演算和域關(guān)系演算兩類,ALPHA語言是一種典型的元組關(guān)系演算語言,它以元組變量作為謂詞變元[1]。本節(jié)以文獻(xiàn)[1]第70頁的數(shù)據(jù)庫作為示例數(shù)據(jù)庫,該數(shù)據(jù)庫關(guān)系如圖2所示,設(shè)計(jì)了2個(gè)例子,例1是帶有全稱量詞的查詢,而例2是既有全稱量詞又有邏輯蘊(yùn)含的復(fù)雜查詢。先闡述用元組關(guān)系演算ALPHA語言表示復(fù)雜查詢要求,再利用謂詞變換理論進(jìn)行等價(jià)的謂詞變換。
例1查詢供應(yīng)了全部零件的供應(yīng)商姓名。首先用AHPHA語言將例1查詢表示為:
然后,用(1)式將上述語句進(jìn)行等價(jià)變換為:
圖2 示例數(shù)據(jù)庫關(guān)系圖
(4)式語義解釋為查詢這樣的供應(yīng)商的姓名,不存在一種零件,該供應(yīng)商沒有供應(yīng)該零件。
例2 查詢至少供應(yīng)了S1供應(yīng)商所供應(yīng)的全部零件的供應(yīng)商代碼。
先用AHPHA語言將例2查詢表示為:
再用(3)式將上述語句進(jìn)行等價(jià)變換:
(5)式語義解釋:查詢這樣的供應(yīng)商的代碼,不存在一種零件,S1供應(yīng)商供應(yīng)了該零件,而該供應(yīng)商沒有供應(yīng)這種零件。
Step 1:將變換后的ALPHA工作空間中的表達(dá)式表名.屬性名轉(zhuǎn)換為SELECT屬性名FROM表名;
Step 2:將?轉(zhuǎn)換為WHERE EXISTS,??轉(zhuǎn)換為WHERENOTEXISTS;
Step 3:將元組變量轉(zhuǎn)換為SELECT*FROM表名表別名(其中表名為定義元組變量的表名,表別名為元組變量名);
Step 4:∧轉(zhuǎn)換為AND,∨轉(zhuǎn)換為OR。
經(jīng)過上述算法轉(zhuǎn)換,例1的(4)式可轉(zhuǎn)換為下面的SQL語句:
為解決數(shù)據(jù)庫理論初學(xué)者編寫復(fù)雜查詢SQL語句的困難,作者在多年數(shù)據(jù)庫教學(xué)實(shí)踐研究中,探索出一個(gè)復(fù)雜查詢的SQL語句生成方法,借助謂詞演算語言ALPHA將復(fù)雜查詢進(jìn)行了等價(jià)變換,學(xué)習(xí)者只需按該方法進(jìn)行簡單的ALPHA語言符號向SQL語句的轉(zhuǎn)換,即可生成復(fù)雜查詢的SQL語句,該過程簡單清晰,易為初學(xué)者理解和掌握。該方法在多年的教學(xué)實(shí)踐中得到了檢驗(yàn),并取得了較好的教學(xué)效果。