包希日莫
[摘 要] 查詢語句的教學(xué)在高校計(jì)算機(jī)專業(yè)的數(shù)據(jù)庫教學(xué)中占有重要地位。在數(shù)據(jù)庫的查詢語句教學(xué)中引入了查詢語句統(tǒng)一語句框架以及相應(yīng)的問答填空式語句構(gòu)建方法和形式化教學(xué)方案,從而克服了傳統(tǒng)教學(xué)的諸多弊端,在教學(xué)實(shí)踐中收到了較好的效果。
[關(guān) 鍵 詞] 數(shù)據(jù)庫;SQL Server;查詢語句;統(tǒng)一語句框架
[中圖分類號] G623.58 [文獻(xiàn)標(biāo)志碼] A [文章編號] 2096-0603(2018)17-0036-02
一、傳統(tǒng)的數(shù)據(jù)庫查詢教學(xué)
數(shù)據(jù)庫查詢是計(jì)算機(jī)專業(yè)數(shù)據(jù)庫教學(xué)的重點(diǎn)和難點(diǎn)。目前,即使在主流的項(xiàng)目式或任務(wù)驅(qū)動的教學(xué)模式下,仍在沿用通過具體實(shí)例逐一介紹查詢技巧的傳統(tǒng)教學(xué)方法[1][2][3]。例如,介紹如何獲取某數(shù)據(jù)表的前若干條記錄時,通常使用實(shí)例
SELECT Top n *
FROM Table1
其含義為返回?cái)?shù)據(jù)表Table1的前n條記錄;介紹左外連接查詢時,使用類似于
SELECT Table1.Column1,Table2.Column2
FROM Table1
LEFT JOIN Table2
ON Table1.Column1=Table2.Column1
的實(shí)例,其含義是返回?cái)?shù)據(jù)表Table1和Table2的笛卡爾積中的滿足指定匹配條件的記錄的指定列和Table1中的失配記錄的指定列。
雖然遵循由簡單到復(fù)雜的教學(xué)規(guī)律,但是上述教學(xué)方法缺乏系統(tǒng)性和關(guān)聯(lián)性,知識傳授過于零散,不利于學(xué)生整體知識結(jié)構(gòu)的形成和解決問題能力的培養(yǎng)。此外,由于過于強(qiáng)調(diào)知識傳授的完整性,較難做到主次分明、重點(diǎn)突出,違背教學(xué)規(guī)律和認(rèn)知規(guī)律[4][5]。
二、數(shù)據(jù)庫查詢統(tǒng)一語句框架
筆者在數(shù)據(jù)庫查詢教學(xué)中設(shè)計(jì)和運(yùn)用了如下圖所示的SQL Server數(shù)據(jù)庫查詢統(tǒng)一語句框架,并輔以問答填空式語句構(gòu)建方法和形式化教學(xué)方案,克服了傳統(tǒng)教學(xué)的上述諸多不足,在實(shí)踐中收到了較好的效果。
數(shù)據(jù)庫查詢統(tǒng)一語句框架將查詢語句的諸多方面有機(jī)地關(guān)聯(lián)和整合在一起,有助于學(xué)生認(rèn)清查詢語句各要素之間的關(guān)系并從整體上學(xué)習(xí)、理解和運(yùn)用查詢語句。
下面詳細(xì)闡述和說明該統(tǒng)一語句框架。
(一)路徑①
SELECT語句不以任何數(shù)據(jù)表為查詢對象(如查詢當(dāng)前數(shù)據(jù)庫的相關(guān)信息)時,只包含SELECT關(guān)鍵字以及根據(jù)需要給出的函數(shù)或系統(tǒng)變量列表。例如
SELECT HOST_NAME( ),@@SERVERNAME,DB_NAME( ),@@VERSION
該語句查詢當(dāng)前的主機(jī)名稱、服務(wù)器名稱、數(shù)據(jù)庫名稱以及SQL Server版本。
(二)路徑②、③
SELECT語句以數(shù)據(jù)表為查詢對象時,SELECT關(guān)鍵字后可以跟隨篩選記錄條件,如TOP n、TOP n PERCENT等,之后應(yīng)為由要求返回其值的列、常量、變量或函數(shù)構(gòu)成的列表。
對數(shù)據(jù)表進(jìn)行非外連接查詢時,SELECT語句中應(yīng)包含F(xiàn)ROM關(guān)鍵字和被查詢數(shù)據(jù)表的名稱列表,當(dāng)這種查詢?yōu)闂l件查詢時,還應(yīng)包含WHERE關(guān)鍵字和查詢條件。例如
SELECT TOP n Table1.Column1,Table2.Column1
FROM Table1,Table2
WHERE Table1.Column1>=Table2.Column1
該語句返回?cái)?shù)據(jù)表Table1和Table2的迪卡爾積的滿足條件Table1.Column1>= Table2.Column1的前n條記錄的指定列。
對數(shù)據(jù)表進(jìn)行返回未匹配記錄的外連接查詢時,SELECT語句應(yīng)包含
FROM ( )
RIGHT|LEFT|FULL JOIN ( )
ON ( )
FROM、JOIN和ON關(guān)鍵字后依次為左數(shù)據(jù)表名稱、右數(shù)據(jù)表名稱和匹配條件。外連接查詢的實(shí)例請參見本文的第二個例子。
(三)路徑④
對數(shù)據(jù)表的查詢結(jié)果進(jìn)行分組時,SELECT語句應(yīng)包含GROUP BY和作為分組依據(jù)的列的名稱,需要對分組結(jié)果進(jìn)行進(jìn)一步篩選時,應(yīng)包含HAVING關(guān)鍵字和篩選條件。例如
SELECT Column1,F(xiàn)unction1(*),F(xiàn)unction2(Column2)
FROM Table1
GROUP BY Column1
HAVING Column1> n
該語句將Column1的值相同的記錄劃為一組,返回滿足條件Column1> n的各組的Column1列、Funtion1(*)函數(shù)和Function2(Column2)函數(shù)的值。
(四)路徑⑤
需要對查詢結(jié)果進(jìn)行排序時,SELECT語句中應(yīng)當(dāng)引入ORDER BY、排序依據(jù)以及升序、降序選擇。例如
SELECT Column1,Column2
FROM Table1
ORDER BY Column2 DESC
該語句對查詢結(jié)果以Column2的降序進(jìn)行排序。需要指出的是,如果GROUP BY后使用ORDER BY,則對分組結(jié)果進(jìn)行排序。例如
SELECT Column1, Function1(Column2)
FROM Table1
GROUP BY Column1
ORDER BY Function1(Column2) DESC
該語句對數(shù)據(jù)表Table1的內(nèi)容以Column1為依據(jù)進(jìn)行分組,計(jì)算每組記錄的Function1(Column2)值,最后對分組結(jié)果按Function1(Column2)的降序進(jìn)行排序。
三、數(shù)據(jù)庫查詢的問答填空式語句構(gòu)建
面對實(shí)際查詢需求,可以基于上述統(tǒng)一語句框架,采用問答填空式方法構(gòu)建需要的查詢語句。
首先,通過回答下列問題,選擇查詢語句的主要關(guān)鍵字從而確定其主體結(jié)構(gòu):
1.是否為數(shù)據(jù)表查詢?該問題用于取舍上圖框架中的路徑①;
2.數(shù)據(jù)表查詢時,是否要求返回不匹配的記錄?該問題用于在上圖框架的路徑②和路徑③之間進(jìn)行選擇;
3.數(shù)據(jù)表非外連接查詢時,是否有查詢條件?該問題用于決定是否包含WHERE關(guān)鍵字;
4.數(shù)據(jù)表查詢時是否需要分組,分組后是否需要篩選?這些問題分別用于取舍上圖框架中的路徑④以及關(guān)鍵字HAVING;
5.數(shù)據(jù)表查詢時是否需要排序?該問題用于取舍上圖框架中的路徑⑤。
之后,分析確定統(tǒng)一語句框架中被選定關(guān)鍵字后的各括號位置上應(yīng)填的內(nèi)容,從而構(gòu)建起完整的查詢語句。
例如,如果查詢需求為“統(tǒng)計(jì)圖書信息表中清華大學(xué)出版社、電子工業(yè)出版社以及機(jī)械工業(yè)出版社出版的書籍的數(shù)量,計(jì)算各出版社出版的書籍的平均價格并按平均價格由高到低的順序進(jìn)行排序”,通過回答上述問題,可以依次做到:舍棄路徑①;在路徑②和③之間選擇路徑②;不包含關(guān)鍵字WHERE;選擇路徑④及關(guān)鍵字HAVING;選擇路徑⑤。之后在每個關(guān)鍵字后填寫查詢需求中提到的條件,即可得到滿足要求的查詢語句:
SELECT 出版社,COUNT(*),AVG(價格)
FROM 圖書信息表
GROUP BY 出版社
HAVING 出版社=′清華大學(xué)出版社′OR 出版社=′電子工業(yè)出版社′OR出版社=′機(jī)械工業(yè)出版社′
ORDER BY AVG(價格) DESC。
四、數(shù)據(jù)庫查詢的教學(xué)方案設(shè)計(jì)
圍繞統(tǒng)一語句框架和配套的語句構(gòu)建方法展開的數(shù)據(jù)庫查詢教學(xué),其總體教學(xué)方案可設(shè)計(jì)如下:
(一)實(shí)例導(dǎo)入
在介紹數(shù)據(jù)庫查詢的概念、重要性和應(yīng)用場景的前提下,讓學(xué)生直接感受若干個簡單的查詢語句,從而使他們對數(shù)據(jù)庫查詢形成初步的感性認(rèn)識。
(二)統(tǒng)一語句框架與問答填空式語句構(gòu)建
在闡述查詢語句關(guān)鍵字集合的基礎(chǔ)上,重點(diǎn)引入和講授本文的數(shù)據(jù)庫查詢統(tǒng)一語句框架以及基于該框架的問答填空式查詢語句構(gòu)造方法。與查詢語句相關(guān)的零散內(nèi)容,如函數(shù)的使用、條件表達(dá)式的書寫等,可以在介紹問答填空式語句構(gòu)建方法時附帶講授。
(三)鞏固練習(xí)
針對各種查詢需求進(jìn)行查詢語句構(gòu)造練習(xí)。此期間的練習(xí)題覆蓋面要廣,諸多練習(xí)題應(yīng)當(dāng)涵蓋上圖所示統(tǒng)一語句框架的主要路徑,即練習(xí)題中應(yīng)當(dāng)包括非外連接(單表查詢、多表查詢)查詢、外連接(左外連接、右外連接、全外連接)查詢以及查詢結(jié)果分組與排序的各類題目。
五、總結(jié)
以數(shù)據(jù)庫查詢統(tǒng)一語句框架為核心、輔以問答填空式語句構(gòu)建方法和形式化教學(xué)方案的數(shù)據(jù)庫查詢教學(xué)為傳統(tǒng)教學(xué)帶來了諸多變化,如教學(xué)內(nèi)容相互關(guān)聯(lián)并構(gòu)成了有機(jī)整體;教學(xué)過程更加主次分明、重點(diǎn)突出;教學(xué)目標(biāo)更加具體和明確;學(xué)生成就感增強(qiáng),學(xué)習(xí)積極性得到提高;近乎形式化的過程使學(xué)習(xí)難度降低,學(xué)生負(fù)擔(dān)減輕。
如何設(shè)計(jì)形式化教學(xué)方案是需要進(jìn)一步深入探討的課題。
參考文獻(xiàn):
[1]孫繼紅,黃龍泉.SQL Server 2005數(shù)據(jù)庫原理及應(yīng)用[M].北京:國防工業(yè)出版社,2012.
[2]魏善沛,何海江.數(shù)據(jù)庫基礎(chǔ)及應(yīng)用(SQL Server 2012)[M].北京:機(jī)械工業(yè)出版社,2017.
[3]張立新,徐劍波.數(shù)據(jù)庫原理與SQL Server應(yīng)用教程[M].北京:電子工業(yè)出版社,2017.
[4]李丹,趙占坤,丁宏偉,等.SQL Server數(shù)據(jù)庫管理與開發(fā)實(shí)用教程[M].2版.北京:機(jī)械工業(yè)出版社,2015.
[5]陳承歡,趙志茹,肖素華.SQL Server 2014數(shù)據(jù)庫應(yīng)用、管理與設(shè)計(jì)[M].北京:電子工業(yè)出版社,2016.