皇甫大雙
摘要:在數(shù)據(jù)庫系統(tǒng)設(shè)計與實現(xiàn)的過程中,許多的模塊都需要實現(xiàn)查詢的功能,如果要從數(shù)據(jù)庫中查詢滿足條件的數(shù)據(jù),可以通過Select語句來實現(xiàn)。所以關(guān)注SQL Server數(shù)據(jù)庫查詢的研究以及實例應(yīng)用就顯得很有必要。
關(guān)鍵詞:數(shù)據(jù)庫;查詢;數(shù)據(jù)分組;測試
中圖分類號:TP393文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)28-0046-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
在數(shù)據(jù)庫系統(tǒng)設(shè)計與實現(xiàn)的過程中,許多的模塊都需要實現(xiàn)查詢的功能,如果要從數(shù)據(jù)庫中查詢滿足條件的數(shù)據(jù),可以通過Select語句來實現(xiàn)。
查詢(Query)通常又被稱為檢索,是數(shù)據(jù)庫技術(shù)中最基本、最核心的操作之一。SQL Server數(shù)據(jù)庫提供了強(qiáng)大的查詢功能,主要包括有簡單查詢、條件查詢、數(shù)據(jù)分組統(tǒng)計查詢、連接查詢以及子查詢等?;诖?,本論文主要以商品銷售管理數(shù)據(jù)庫系統(tǒng)為例,重點(diǎn)探討較為復(fù)雜的子查詢在實際問題中的研究以及應(yīng)用。
1 子查詢知識簡介
1.1子查詢的概念
子查詢通常又被稱為嵌套查詢,是一個嵌套在Select、Insert、Update、Delete數(shù)據(jù)操縱語句或其他子查詢中的查詢。任何允許使用表達(dá)式的地方都可以使用子查詢。子查詢也稱為內(nèi)部查詢或內(nèi)部選擇,一般都需要用括號括起來,而包含子查詢的語句稱為外部查詢或外部選擇。
1.2常見的幾種子查詢
在T-SQL語句中使用in或not in的子查詢、使用比較運(yùn)算符的子查詢、使用any、all比較運(yùn)算符的子查詢以及使用exists或not exists的子查詢,這四種查詢是較為常見和使用的子查詢。
1.3 子查詢的語法格式
Select <字段列表> from <表名>
Where <列表或列表表達(dá)式>(子查詢)
2 商品銷售管理數(shù)據(jù)庫
在商品銷售管理系統(tǒng)中創(chuàng)建一個名為Manage的數(shù)據(jù)庫,該數(shù)據(jù)庫包含客戶信息表(Buyers)、商品信息表(Wares)和商品訂購信息表(Sales)三個表格,具體的表結(jié)構(gòu)如下所示。
3 子查詢的實例應(yīng)用
3.1 使用in或not in子查詢進(jìn)行集成員測試查詢
使用子查詢進(jìn)行集成員測試時,通過邏輯運(yùn)算符in或not in將一個表達(dá)式的值與子查詢返回的零個或多個值進(jìn)行比較。In或not in子查詢用于對一個給定值是否存在于子查詢結(jié)果集中的判斷,其中,當(dāng)表達(dá)式與子查詢結(jié)果集中的某個值相等時,返回True,否則返回False,若使用了not,則返回的值剛好相反。舉例如下:
使用子查詢檢索訂購了貨品編號為20200001的客戶的所有信息,在查詢分析器中輸入以下的T-SQL代碼即可實現(xiàn):
Select * From Buyers
Where BuyerID in (Select BuyerID From Sales where WaresID=20200001)
3.2 使用子查詢進(jìn)行比較測試
在帶有比較運(yùn)算符的子查詢中,子查詢的結(jié)果是一個單值。父查詢通過比較運(yùn)算符將父查詢中的一個表達(dá)式與子查詢的結(jié)果(單值)進(jìn)行比較,當(dāng)表達(dá)式的值與子查詢結(jié)果比較后,運(yùn)算的結(jié)果為True,則父查詢中的“表達(dá)式比較運(yùn)算符(子查詢)”條件表達(dá)式返回True,否、則返回False,常用的比較運(yùn)算符有=、>、<、>=、<=、<>、!>、!<、!=等,舉例如下:
使用子查詢檢索商品信息表Wares中價格高于平均價格商品的信息,在查詢分析器中輸入以下的T-SQL代碼即可實現(xiàn):
Select * From Wares
Where unitPrice > (select Avg(unitPrice) from Wares)
3.3 使用any、all運(yùn)算符的批量比較測試子查詢
子查詢中返回單值時可以使用比較運(yùn)算符,如若返回的是一個結(jié)果集多值的情況下,這時不僅要用到比較運(yùn)算符,同時還需要用到any或all兩個邏輯運(yùn)算符。any、all與比較運(yùn)算符的應(yīng)用如下表所示:
使用any運(yùn)算符的舉例為:使用子查詢檢索某次訂貨金額低于500元的客戶信息,在查詢分析器中輸入以下的T-SQL代碼即可實現(xiàn):
Select * from Buyers
Where 500 > any(Select amount From Sales where Buyers.BuyerID=Sales.BuyerID )
使用all運(yùn)算符的舉例為:使用子查詢檢索未曾被客戶購買的商品編號以及商品名稱,在查詢分析器中輸入以下的T-SQL代碼即可實現(xiàn):
Select ?WaresID,WaresName from Wares
Where WaresID<> all(Select distinct WaresID from Sales)
3.4 使用Exists子查詢進(jìn)行存在性測試
使用Exists關(guān)鍵字引入一個子查詢時,相當(dāng)于進(jìn)行一次存在測試。外部查詢的where字句測試子查詢返回的行是否存在,如果在子查詢的結(jié)果集中包含有,一條或多條記錄,則存在性測試返回True,否則返回False,Not Exists將對存在性測試結(jié)果取相反。舉例如下:
使用子查詢檢索所有沒有訂貨的客戶信息,在查詢分析器中輸入以下的T-SQL代碼即可實現(xiàn):
Select * from Buyers
Where not Exists (select * from Sales where Buyers.BuyerID=sales.BuyerID)
4 結(jié)束語
SQL Server數(shù)據(jù)庫中數(shù)據(jù)的查詢是一個非常重要同時也是使用頻繁的功能,特別是涉及兩個以上的多表查詢的時候子查詢的使用就顯得尤為重要。有了子查詢,我們可以將另一張表中需要的數(shù)據(jù)通過子查詢的方式先查出來,然后再通過連接將結(jié)果和另一個表中的結(jié)果根據(jù)連接條件組合在一起,由于連接之前先做了一次查詢,查詢的結(jié)果只是符合要求的數(shù)據(jù)記錄,而不是所有的,這樣其實就減少了連接時表的數(shù)據(jù)記錄,大大地提高了查詢的速度。
參考文獻(xiàn):
[1] 周旺紅.SQL Server 2012數(shù)據(jù)庫T-SQL查詢方法及實例解析[J].信息與電腦(理論版),2018(24):144-145.
[2] 張沛露,王建軍.基于網(wǎng)絡(luò)平臺的數(shù)據(jù)庫基礎(chǔ)課程教學(xué)模式初探[J].科技傳播,2010,2(24):232,227.
[3] 孫志梅.淺談“數(shù)據(jù)庫基礎(chǔ)及應(yīng)用”教學(xué)中的體會[J].民營科技,2009(10):89.
[4] 張偉平,許帥,李媛媛,等.翻轉(zhuǎn)課堂對學(xué)習(xí)效果有效性的研究:教師角色視角——以教育技術(shù)學(xué)專業(yè)《數(shù)據(jù)庫基礎(chǔ)》實驗課程為例[J].當(dāng)代教育理論與實踐,2017,9(1):73-75.
[5]韓麗.“SQL Server數(shù)據(jù)庫基礎(chǔ)”課程教學(xué)實踐——面向高職高專計算機(jī)應(yīng)用專業(yè)學(xué)生[J].科教文匯(下旬刊),2010(5):173-174.
【通聯(lián)編輯:代影】