文章編號(hào):1672-5913(2008)18-0145-02
摘要:本文針對(duì)教材中的一些例題進(jìn)行了分析與探討,給出了同一問(wèn)題不同的解決方案;設(shè)計(jì)了面向SQL語(yǔ)言的輔助教學(xué)系統(tǒng)。實(shí)踐教學(xué)表明,這些措施的實(shí)施為學(xué)生深刻領(lǐng)會(huì)和運(yùn)用SQL語(yǔ)言提供了幫助,增強(qiáng)了學(xué)生的實(shí)踐能力。
關(guān)鍵詞:SQL語(yǔ)言;數(shù)據(jù)庫(kù)系統(tǒng);存儲(chǔ)過(guò)程
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B
引言
在“數(shù)據(jù)庫(kù)原理”課程的教學(xué)中,SQL語(yǔ)言是一個(gè)難點(diǎn),也是一個(gè)重點(diǎn),加上該課程的教學(xué)大綱中明確要求學(xué)生要全面掌握、深刻理解、熟練應(yīng)用SQL語(yǔ)言。盡管SQL語(yǔ)言有簡(jiǎn)單和高度結(jié)構(gòu)化的特點(diǎn),但在實(shí)際教學(xué)中學(xué)生常是“上課一聽就懂,上機(jī)無(wú)法下手”,這種情況基本上是理論學(xué)習(xí)和上機(jī)實(shí)驗(yàn)不能同步進(jìn)行。本文對(duì)教材中的一些例題進(jìn)行了分析,由于教材中使用的數(shù)據(jù)庫(kù)系統(tǒng)與實(shí)際使用有一定的差距,因此這些例題不能在一些數(shù)據(jù)庫(kù)中實(shí)現(xiàn),導(dǎo)致了學(xué)生上機(jī)測(cè)試的困難。本文以SQL Server 2000為數(shù)據(jù)庫(kù)的實(shí)驗(yàn)平臺(tái),對(duì)那些不能實(shí)現(xiàn)的例題進(jìn)行了相應(yīng)的轉(zhuǎn)化,給出了同一問(wèn)題的多種實(shí)現(xiàn)方法,設(shè)計(jì)了針對(duì)SQL語(yǔ)言使用的輔助實(shí)驗(yàn)系統(tǒng)。為了進(jìn)一步提高學(xué)生對(duì)SQL的實(shí)踐能力,介紹了存儲(chǔ)過(guò)程和自定義函數(shù)的使用。在進(jìn)行SQL語(yǔ)言教學(xué)的過(guò)程中,這些方法和措施的實(shí)行,已經(jīng)在數(shù)據(jù)庫(kù)的綜合實(shí)驗(yàn)和畢業(yè)設(shè)計(jì)中都得到很好的體現(xiàn)。
1教材例題,缺乏具體環(huán)境
例題是學(xué)生學(xué)習(xí)新概念、領(lǐng)會(huì)新知識(shí)的一種重要手段,它在整個(gè)教學(xué)過(guò)程中起著非常重要的作用。盡管SQL語(yǔ)言是一種通用的語(yǔ)言,但是在不同的關(guān)系數(shù)據(jù)庫(kù)中管理系統(tǒng)中,仍然有一些微小的差別。教材中推薦使用國(guó)產(chǎn)金倉(cāng)數(shù)據(jù)庫(kù)管理系統(tǒng)Kingbase Es作為實(shí)驗(yàn)平臺(tái),但由于該數(shù)據(jù)庫(kù)不具有普遍的使用性,而目前普遍使用的是SQL Server、Access、Oracle等數(shù)據(jù)庫(kù)的系列版本,這造成了例題與實(shí)際使用環(huán)境的脫節(jié)。因此,在教學(xué)中,如何根據(jù)使用環(huán)境的不同,對(duì)教材種的例題進(jìn)行及時(shí)的調(diào)整顯得尤為重要。在本文中,以SQL Server
2000作為數(shù)據(jù)庫(kù)的使用環(huán)境,下面通過(guò)一些例題來(lái)說(shuō)明教材[1]中的實(shí)現(xiàn)方式與實(shí)際使用環(huán)境的差異性。
【例51】 查詢選修了課程1又選修課程2的學(xué)生。
教材上給出了如下的表達(dá):
Select Sno
From SC
Where Cno=’1’
Intersect
Select Sno
From SC
Where Cno=’2’
而這種表達(dá)方式在SQL Server 2000中是無(wú)法實(shí)現(xiàn)的。在三種集合操作中,只有并操作Union可以以這種方式使用,而交操作Intersect和差操作Except必須通過(guò)轉(zhuǎn)化才能在SQL Server 2000中使用。Intersect和Except關(guān)鍵字在SQL Server 2000中是兩個(gè)函數(shù),分別表示兩個(gè)集合的交運(yùn)算和差運(yùn)算。下面給出【例51】對(duì)應(yīng)的正確代碼:
Select Sno
From SC
Where Cno=’1’ AND Sno in
(Select Sno
From SC
Where Cno=’2’);
同樣【例52】的代碼也必須進(jìn)行轉(zhuǎn)化。
【例39】查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生。
在教材中特別強(qiáng)調(diào)子查詢一定要跟在比較符之后,并指出了下列語(yǔ)句
Select Sno,Sname,Sdept
From student
Where (Select Sdept
From Student
Where Sname=’劉晨’)= Sdept
是錯(cuò)誤的,但是上述語(yǔ)句在查詢分析器中能正常執(zhí)行,且能給出正確的結(jié)果。
2一題多解,拓展學(xué)生思維
由于每個(gè)學(xué)生思考的途徑不同,可能會(huì)對(duì)同一個(gè)問(wèn)題有許多不同的解法,在教學(xué)中,鼓勵(lì)學(xué)生自覺(jué)探求多種解法,這樣不僅使學(xué)生的基礎(chǔ)知識(shí)、基本技能得到訓(xùn)練,而且使學(xué)生的能力得到增強(qiáng),智力得到開發(fā)。
【例21】查詢?nèi)鄙俪煽?jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。
Select Sno,Cno
From SC
Where Grade IS NULL;
所謂空值是“不知道”或“無(wú)意義”的值,“0”和“空格”都不是空值。以上代碼等同于
Select Sno,Cno
From SC
Where Grade =’’;
【例7】將計(jì)算機(jī)科學(xué)系全體學(xué)生的成績(jī)置零。
Update SC
Set Grade=0
Where ‘CS’=
(Select Sdept
From Student
WhereStudent.Sno=SC.Sno);
習(xí)慣上,where后面條件中“=”前面是一個(gè)字段,而不應(yīng)該是一個(gè)常量,同樣,以上代碼也可以進(jìn)行相應(yīng)的轉(zhuǎn)化
Update SC
Set Grade=0
From SC,Student
Where Student.Sno=SC.Sno and Student.Sdept=’CS’
3常見(jiàn)錯(cuò)誤,不容忽略
Delete語(yǔ)句的功能是從指定的表中刪除滿足where子句條件的所有元組。如果省略了where子句,表示刪除表中全部元組,但表的定義仍在字典中。也就是說(shuō),Delete語(yǔ)句刪除的是表中的數(shù)據(jù),而不是關(guān)于表的定義。因此當(dāng)表中的某一字段設(shè)為int型,且為自增型的時(shí)候,如果刪除了該表中的全部數(shù)據(jù)。當(dāng)再插入新的數(shù)據(jù)時(shí)候,自增型字段的數(shù)據(jù)不是從1開始,而是從刪除數(shù)據(jù)中的最大值加1開始。為了避免這種情況的產(chǎn)生,在SQL Server 2000中提供了Truncate 命令。因此必須根據(jù)具體情況采用相應(yīng)的命令。
4講解例題,增設(shè)輔助系統(tǒng)
在講SQL語(yǔ)言使用的時(shí)候,傳統(tǒng)的方法只是把例題中每一條語(yǔ)句給學(xué)生解釋一遍,這樣教師教起來(lái)沒(méi)有激情,學(xué)生聽起來(lái)倍感枯燥。為此,設(shè)計(jì)了一個(gè)針對(duì)SQL語(yǔ)言使用的輔助系統(tǒng),該系統(tǒng)為學(xué)生提供了一個(gè)上機(jī)操作SQL 語(yǔ)言的平臺(tái),讓學(xué)生通過(guò)在線“做”上機(jī)實(shí)驗(yàn),不斷地觀察、交流和反思,從而更好地“學(xué)”SQL 語(yǔ)言的結(jié)構(gòu)和元素。
5面向應(yīng)用,提高實(shí)踐能力
SQL語(yǔ)言在實(shí)際開發(fā)應(yīng)用系統(tǒng)過(guò)程中占有非常重要的地位。目前,使用SQL編程來(lái)訪問(wèn)和管理數(shù)據(jù)庫(kù)中數(shù)據(jù)的方式主要有:嵌入式SQL,PL/SQL,ODBC,JDBC以及OLEDB編程等方式。下面僅對(duì)經(jīng)常使用的嵌入式SQL和PL/SQL來(lái)做進(jìn)一步分析:
(1) 嵌入式SQL::是將SQL語(yǔ)言嵌入程序設(shè)計(jì)語(yǔ)言中,被嵌入的程序設(shè)計(jì)語(yǔ)言包括所有的高級(jí)語(yǔ)言。但是教材中給出的語(yǔ)句在應(yīng)用系統(tǒng)的開發(fā)過(guò)程中使用頻率是相對(duì)比較低的,如何將這些思想和某一具體的開發(fā)工具相結(jié)合,使學(xué)生更容易理解這些功能,是教學(xué)過(guò)程中面臨的一個(gè)非常重要的問(wèn)題。
【例】 連接數(shù)據(jù)庫(kù)的語(yǔ)句
Exec SQL Connect to target [AS connetion-name ][User user-name]
和關(guān)閉數(shù)據(jù)庫(kù)的語(yǔ)句
Exec SQL Disconnect [connection];
這些語(yǔ)句在目前常用的開發(fā)工具是很少使用的。目前常用的開發(fā)工具中,連接和關(guān)閉數(shù)據(jù)庫(kù)是通過(guò)開發(fā)工具中帶的控件來(lái)完成的,如大家熟悉的ADO技術(shù)等。
(2)PL/SQL是編寫數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的一種過(guò)程語(yǔ)言,在教材中對(duì)存儲(chǔ)過(guò)程的介紹比較少,但在實(shí)際的應(yīng)用系統(tǒng)開發(fā)中,存儲(chǔ)過(guò)程的開發(fā)可以極大地提高軟件的可維護(hù)性和系統(tǒng)的運(yùn)行速度。下面給出將兩個(gè)字符串連接成一個(gè)字符串的例子:
Create procedure strconnect @str1 varchar(20),@str2 varchar(20),@connect varchar(40) output
As
Select @connect=@str1+@str2
(3) 自定義函數(shù)。在系統(tǒng)開發(fā)過(guò)程中,經(jīng)常發(fā)現(xiàn)一些相同的功能在多個(gè)地方使用,因此,可以通過(guò)自定義函數(shù)來(lái)完成這一功能。同樣,下面給出一個(gè)將兩個(gè)字符串連接成一個(gè)字符串例子的代碼:
Function strconnect(str1,varchar(20),str2 varchar(20)
Begin
Return str1+str2;
End;
總之,進(jìn)一步掌握SQL語(yǔ)言這些功能,能有效地提高學(xué)生的動(dòng)手實(shí)踐能力,增強(qiáng)他們的就業(yè)競(jìng)爭(zhēng)力。
參 考 文 獻(xiàn)
[1] 王珊,薩師煊. 數(shù)據(jù)庫(kù)系統(tǒng)概論[M]. 高等教育出版社,2006.
[2] 曹付元,李茹,梁吉業(yè),王俊紅. “數(shù)據(jù)庫(kù)原理”課程中實(shí)踐教學(xué)的創(chuàng)新模式探索[J]. 高等理科教學(xué)(教育教學(xué)研究專輯),2008:168-170.
[3] 李華. 數(shù)據(jù)庫(kù)教學(xué)淺析[J]. 計(jì)算機(jī)教育,2007,(8):32-34.