肖海蓉
(陜西理工學(xué)院,陜西漢中723000)
EXISTS的使用在實際的數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)中有著較為廣泛的應(yīng)用,其在SQL的教學(xué)、實踐環(huán)節(jié)中也是學(xué)生比較難于理解和掌握的內(nèi)容。但是,目前在大多數(shù)的教材和參考書上只是簡單地通過一兩個例子介紹了帶有存在量詞EXISTS的書寫語句,并沒有給出實質(zhì)性的說明。本文根據(jù)作者多年的教學(xué)經(jīng)驗,總結(jié)出EXISTS在不同的場合下的使用情況,并以學(xué)生接觸較多的實際案例為依托,在SQL Server環(huán)境下得到了驗證。
以網(wǎng)上商品銷售系統(tǒng)的數(shù)據(jù)庫為例,對EXISTS在不同場合的使用進行探討,下面給出了數(shù)據(jù)庫中的客戶表、商品表、商品銷售表。
表1 商品表
表2 客戶表
我們知道,SQL語句并不提供語義中含有全稱量詞(For All)的實現(xiàn)方法,具體實現(xiàn)時,可以把帶有全稱量詞的謂詞轉(zhuǎn)換為等價的帶有存在量詞(EXISTS)的謂詞形式。
表3 產(chǎn)品銷售表
例:為了統(tǒng)計商品銷售的情況,查詢?nèi)恰芭笨蛻糍徺I的商品編號。
問題分析:即在查找結(jié)果中的商品編號沒有“男”客戶購買過此商品??梢允褂瞄g接的方法,先求客戶購買過的所有商品編號以及男客戶購買的商品編號,兩者再做差運算就可得到所求結(jié)果,這時使用SQL語句提供的組合查詢minus,則設(shè)計查詢語句如下:
但在SQL Server2005的環(huán)境下,分析語句后結(jié)果如圖1所示。這是因為在SQLServer、MySQL在內(nèi)的幾種SQL產(chǎn)品的不同版本并不完全支持標(biāo)準(zhǔn)SQL提供的INTERSECT和MINUS兩種操作。因此,我們必須尋求另外一種解決此問題的方法。可以把“全是”轉(zhuǎn)換為等價的帶有存在量詞(EXISTS)的形式語義,其等價的語義為:查找這樣的商品編號,不存在男客戶也購買了此商品的情況存在。則設(shè)計的SQL語句如下:
需要注意的是:在含有“全是”語義中,不能用謂詞IN來代替EXISTS,如果使用IN的話,則查詢結(jié)果中會還有男女客戶都購買的商品編號。當(dāng)然,此類問題還可以使用=all謂詞加以實現(xiàn)。
例:為了統(tǒng)計不同客戶購買商品的情況,查詢購買過全部商品的客戶名。
問題分析:查詢購買過全部商品的客戶姓名,即找這樣的商品名,不存在某一個商品他不購買的情況。通過等價的語義轉(zhuǎn)換,同樣可以把SQL語句設(shè)計成EXISTS的形式如下:
同樣,此類問題的SQL查詢語句也不能使用IN代替EXISTS。
例:為了統(tǒng)計哪些商品未曾有過銷售記錄,求沒有客戶購買過的商品名。
問題分析:沒有客戶購買過的商品名,即找這樣的商品,在商品銷售表中不存在該商品有銷售記錄。轉(zhuǎn)換為等價的帶有EXISTS的SQL語句如下:
執(zhí)行的結(jié)果如圖4所示,由于本數(shù)據(jù)庫中不存在哪個商品未銷售過,所以執(zhí)行結(jié)果為空。
這種類型同樣能夠解決諸如“查詢購買了那個商品,但沒有購買另一種商品”的情況。
例:查詢購買了商品編號“s1001”,并且又購買了商品編號“s2002”的客戶名。
問題分析:此類問題同樣可轉(zhuǎn)換為帶有EXISTS的SQL語句,設(shè)計的語句如下:
其執(zhí)行結(jié)果如圖5所示。
在數(shù)據(jù)庫原理課程的教學(xué)中,帶有EXISTS的SQL查詢語句一直以來是教學(xué)中的一個難點,也是學(xué)生最頭痛的問題,文章以SQL Server2005為實現(xiàn)環(huán)境,通過實際的案例研究,總結(jié)出在SQL語句的設(shè)計中,如何正確靈活地使用EXISTS的情況,更好地掌握SQL語句的書寫技巧。
[1]李春葆,數(shù)據(jù)庫原理及應(yīng)用系統(tǒng)解析[M].北京:清華大學(xué)出版社,2002.
[2]高榮芳等,數(shù)據(jù)庫原理[M].西安:西安電子科技大學(xué)出版社,2003.
[3]苗雪蘭等,數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用教程[M].北京:機械工業(yè)出版社,2007.
[4]肖海蓉.SQL中分組查詢的設(shè)計與應(yīng)用[J].計算機與數(shù)字工程,2009,5:85-87.
[5]肖海蓉.關(guān)系代數(shù)中“除法”運算與SQL中帶有exists子查詢的對比教學(xué)[J].電腦學(xué)習(xí),2009,5:158-159.