楊浩宇
(昆明工業(yè)職業(yè)技術(shù)學院,云南 昆明 650302)
數(shù)據(jù)查詢作為數(shù)據(jù)庫操作的重點,也一直是學習者的學習重點,多表查詢則是其中不可回避的重點與難點。本文以一個學生數(shù)據(jù)庫(Student)為例討論幾種實現(xiàn)多表查詢的方式。
Studen中有三張表:stuinfo(學生信息表),用于存放學生基本信息;course(課程信息表),用于存放課程信息;score(成績表)用于存放學生各課程的考試成績,具體結(jié)構(gòu)如下:
表1 學生信息表結(jié)構(gòu)
表2 課程信息表結(jié)構(gòu)
表3 成績表結(jié)構(gòu)
對于這三張表的多表查詢主要集中在成績的統(tǒng)計和查詢上。
例如,查詢學生每門課程的成績,包括學號、姓名、課程名稱和成績信息,用SQL語句完成如下:
select d1.stuid,d1.name,d2.cid,d2.cname,d3.score
from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid
或者,查詢每位學生所學課程的平均分,包括學號、姓名和平均分:
select d2.stuid,d2.name,AVG(d1.score)
from score d1,stuinfo d2
where d1.stuid=d2.stuid
group by d2.stuid,d2.name order byAVG(d1.score)desc
再如,統(tǒng)計各門課程的最高分、最低分和平均分:
select d2.cid,d2.cname,AVG(d1.score),MAX(d1.score),MIN(d1.score)
from score d1,course d2
where d1.cid=d2.cid
在SQL Server8中除了用SQL語句完成這類問題,也可以用其它的數(shù)據(jù)庫對象完成。以學生所學課程成績查詢?yōu)槔?,用如下語句建立一個叫做score1的視圖,然后查看score1的數(shù)據(jù)來查看到位學生的各門課程成績,而且,還可以再通過SQL語句對score1行和列進行選擇統(tǒng)計數(shù)據(jù)。
create view score1
as
select d1.stuid,d1.name,d2.cid,d2.cname,d3.score
from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid
例如,查詢每位學生學過的所有課程的平均分,對視圖score1操作的SQL語句:
Select stuid,name,avg(score)from score1 group by stuid,name
圖1 視圖統(tǒng)計學生各科平均分
查詢各門課程的最高分、最低分和平均分,通過對Score1視圖的操作來完成SQL語句如下:select cid,cname,max(score),min(score),avg(score)from score1 group by cid,cname
可見,對比之前對多表查詢的語句,視圖查詢簡潔很多。
圖2 視圖查詢結(jié)果
視圖作為數(shù)據(jù)庫中的一種對象,是一個虛擬表,視圖一旦被建立,作用與表相同,但它并不保存任何數(shù)據(jù),它的數(shù)據(jù)來自定義視圖的查詢所引用的表。視圖可以使用戶將焦點集中于感興趣的數(shù)據(jù),不必要的數(shù)據(jù)可以不出現(xiàn)在視圖中,這也增加了數(shù)據(jù)的安全性;其次,視圖可以減化操作,特別是對于對多表查詢不熟悉的用戶;第三,可以根據(jù)用戶的需求定制數(shù)據(jù),同時保持數(shù)據(jù)表的簡潔性,又不會占用很多的存儲空間,并且,在視圖中同樣可以對數(shù)據(jù)進行增刪改的操作。
除了視圖,還可以用存儲過程來完成對成績的查詢。創(chuàng)建名為p1的存儲過程如下:
create procedure p1 as
select d1.stuid,d1.name,d2.cname,d3.score from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid
需要查看成績的時候調(diào)用p1存儲過程:exec p1就可以查看所有學生的各門課程成績,如果需要針對某學生或某課程進行查詢,則需要創(chuàng)建帶參數(shù)的存儲過程。
Create procedure p2(char(10))as
select d1.stuid,d1.name,d2.cname,d3.score from stuinfo d1,course d2,score d3
where d1.stuid=d3.stuid and d2.cid=d3.cid and d1.stuid=@sid
p2存儲過程可以通過學號查詢學生成績調(diào)用語句:exec p2“2015020202”
從上面三種實現(xiàn)多表數(shù)據(jù)查詢的方法來看,SQL語句查詢交互性強,查詢靈活,但對于了解不多的用戶來說,多表復(fù)雜查詢會有一定的困難。視圖的優(yōu)點是可以防止未經(jīng)許可的用戶訪問敏感數(shù)據(jù);降低數(shù)據(jù)庫的復(fù)雜度;結(jié)果更容易理解,獲得數(shù)據(jù)更容易,應(yīng)用程序的維護更加方便,但需要數(shù)據(jù)庫設(shè)計者對數(shù)據(jù)操作有足夠的了解和預(yù)見,否則可能會限制系統(tǒng)功能;存儲過程的優(yōu)勢是可以包含邏輯控制語句和數(shù)據(jù)操作語句速度,模塊化和封裝能夠加快系統(tǒng)運行,減少網(wǎng)絡(luò)流量,但它的靈活性不如前兩種方式。
[1]王永樂,徐書欣.S QLServer 2008數(shù)據(jù)庫管理及應(yīng)用[M].北京:清華大學出版社,2011.
[2]王勇.用關(guān)系數(shù)據(jù)庫標準語言S QL實現(xiàn)數(shù)據(jù)查詢(多表查詢)的應(yīng)用研究[J].計算機光盤軟件與應(yīng)用,2014(19):66-67.