肖海蓉
(陜西理工學(xué)院,陜西漢中723000)
EXISTS的使用在實(shí)際的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā)中有著較為廣泛的應(yīng)用,其在SQL的教學(xué)、實(shí)踐環(huán)節(jié)中也是學(xué)生比較難于理解和掌握的內(nèi)容。但是,目前在大多數(shù)的教材和參考書(shū)上只是簡(jiǎn)單地通過(guò)一兩個(gè)例子介紹了帶有存在量詞EXISTS的書(shū)寫(xiě)語(yǔ)句,并沒(méi)有給出實(shí)質(zhì)性的說(shuō)明。本文根據(jù)作者多年的教學(xué)經(jīng)驗(yàn),總結(jié)出EXISTS在不同的場(chǎng)合下的使用情況,并以學(xué)生接觸較多的實(shí)際案例為依托,在SQL Server環(huán)境下得到了驗(yàn)證。
以網(wǎng)上商品銷(xiāo)售系統(tǒng)的數(shù)據(jù)庫(kù)為例,對(duì)EXISTS在不同場(chǎng)合的使用進(jìn)行探討,下面給出了數(shù)據(jù)庫(kù)中的客戶(hù)表、商品表、商品銷(xiāo)售表。

表1 商品表

表2 客戶(hù)表
我們知道,SQL語(yǔ)句并不提供語(yǔ)義中含有全稱(chēng)量詞(For All)的實(shí)現(xiàn)方法,具體實(shí)現(xiàn)時(shí),可以把帶有全稱(chēng)量詞的謂詞轉(zhuǎn)換為等價(jià)的帶有存在量詞(EXISTS)的謂詞形式。

表3 產(chǎn)品銷(xiāo)售表
例:為了統(tǒng)計(jì)商品銷(xiāo)售的情況,查詢(xún)?nèi)恰芭笨蛻?hù)購(gòu)買(mǎi)的商品編號(hào)。
問(wèn)題分析:即在查找結(jié)果中的商品編號(hào)沒(méi)有“男”客戶(hù)購(gòu)買(mǎi)過(guò)此商品。可以使用間接的方法,先求客戶(hù)購(gòu)買(mǎi)過(guò)的所有商品編號(hào)以及男客戶(hù)購(gòu)買(mǎi)的商品編號(hào),兩者再做差運(yùn)算就可得到所求結(jié)果,這時(shí)使用SQL語(yǔ)句提供的組合查詢(xún)minus,則設(shè)計(jì)查詢(xún)語(yǔ)句如下:

但在SQL Server2005的環(huán)境下,分析語(yǔ)句后結(jié)果如圖1所示。這是因?yàn)樵赟QLServer、MySQL在內(nèi)的幾種SQL產(chǎn)品的不同版本并不完全支持標(biāo)準(zhǔn)SQL提供的INTERSECT和MINUS兩種操作。因此,我們必須尋求另外一種解決此問(wèn)題的方法。可以把“全是”轉(zhuǎn)換為等價(jià)的帶有存在量詞(EXISTS)的形式語(yǔ)義,其等價(jià)的語(yǔ)義為:查找這樣的商品編號(hào),不存在男客戶(hù)也購(gòu)買(mǎi)了此商品的情況存在。則設(shè)計(jì)的SQL語(yǔ)句如下:

需要注意的是:在含有“全是”語(yǔ)義中,不能用謂詞IN來(lái)代替EXISTS,如果使用IN的話(huà),則查詢(xún)結(jié)果中會(huì)還有男女客戶(hù)都購(gòu)買(mǎi)的商品編號(hào)。當(dāng)然,此類(lèi)問(wèn)題還可以使用=all謂詞加以實(shí)現(xiàn)。

例:為了統(tǒng)計(jì)不同客戶(hù)購(gòu)買(mǎi)商品的情況,查詢(xún)購(gòu)買(mǎi)過(guò)全部商品的客戶(hù)名。
問(wèn)題分析:查詢(xún)購(gòu)買(mǎi)過(guò)全部商品的客戶(hù)姓名,即找這樣的商品名,不存在某一個(gè)商品他不購(gòu)買(mǎi)的情況。通過(guò)等價(jià)的語(yǔ)義轉(zhuǎn)換,同樣可以把SQL語(yǔ)句設(shè)計(jì)成EXISTS的形式如下:



同樣,此類(lèi)問(wèn)題的SQL查詢(xún)語(yǔ)句也不能使用IN代替EXISTS。
例:為了統(tǒng)計(jì)哪些商品未曾有過(guò)銷(xiāo)售記錄,求沒(méi)有客戶(hù)購(gòu)買(mǎi)過(guò)的商品名。
問(wèn)題分析:沒(méi)有客戶(hù)購(gòu)買(mǎi)過(guò)的商品名,即找這樣的商品,在商品銷(xiāo)售表中不存在該商品有銷(xiāo)售記錄。轉(zhuǎn)換為等價(jià)的帶有EXISTS的SQL語(yǔ)句如下:

執(zhí)行的結(jié)果如圖4所示,由于本數(shù)據(jù)庫(kù)中不存在哪個(gè)商品未銷(xiāo)售過(guò),所以執(zhí)行結(jié)果為空。

這種類(lèi)型同樣能夠解決諸如“查詢(xún)購(gòu)買(mǎi)了那個(gè)商品,但沒(méi)有購(gòu)買(mǎi)另一種商品”的情況。
例:查詢(xún)購(gòu)買(mǎi)了商品編號(hào)“s1001”,并且又購(gòu)買(mǎi)了商品編號(hào)“s2002”的客戶(hù)名。
問(wèn)題分析:此類(lèi)問(wèn)題同樣可轉(zhuǎn)換為帶有EXISTS的SQL語(yǔ)句,設(shè)計(jì)的語(yǔ)句如下:

其執(zhí)行結(jié)果如圖5所示。

在數(shù)據(jù)庫(kù)原理課程的教學(xué)中,帶有EXISTS的SQL查詢(xún)語(yǔ)句一直以來(lái)是教學(xué)中的一個(gè)難點(diǎn),也是學(xué)生最頭痛的問(wèn)題,文章以SQL Server2005為實(shí)現(xiàn)環(huán)境,通過(guò)實(shí)際的案例研究,總結(jié)出在SQL語(yǔ)句的設(shè)計(jì)中,如何正確靈活地使用EXISTS的情況,更好地掌握SQL語(yǔ)句的書(shū)寫(xiě)技巧。
[1]李春葆,數(shù)據(jù)庫(kù)原理及應(yīng)用系統(tǒng)解析[M].北京:清華大學(xué)出版社,2002.
[2]高榮芳等,數(shù)據(jù)庫(kù)原理[M].西安:西安電子科技大學(xué)出版社,2003.
[3]苗雪蘭等,數(shù)據(jù)庫(kù)系統(tǒng)原理及應(yīng)用教程[M].北京:機(jī)械工業(yè)出版社,2007.
[4]肖海蓉.SQL中分組查詢(xún)的設(shè)計(jì)與應(yīng)用[J].計(jì)算機(jī)與數(shù)字工程,2009,5:85-87.
[5]肖海蓉.關(guān)系代數(shù)中“除法”運(yùn)算與SQL中帶有exists子查詢(xún)的對(duì)比教學(xué)[J].電腦學(xué)習(xí),2009,5:158-159.