張雪燕
(寧波廣播電視大學信息系,浙江寧波315816)
SQL是結構化查詢語言 (Structured Query Language)的縮寫,是當前最為成功、應用最為廣泛的關系數據庫語言。SQL之所以能被用戶及業界接受并成為國際標準,主要是因為它語法簡潔、方便實用、功能齊全強大。SQL語言包括數據查詢、數據操縱、數據定義和數據控制四個功能。
SQL語言是高校計算機及相關專業學生必學的一門語言之一。而學習該語言的重要途徑是練習,以往傳統的練習方式由于學生得不到及時反饋使得學生的學習進度和學習積極性受到較大影響。本文嘗試通過設計一個針對SQL SERVER的SQL語言自動練習系統,[1]在學生輸入答案時,系統能馬上評判該題,判斷題目的正誤,并提示出錯原因。本系統較為關鍵的問題包括:
1.設計SQL語句正誤判斷的算法
一般算法是寫SQL的語法分析器,對學生給出的答案與參考答案根據SQL語義進行比對。[2-7]這樣的算法較具有通用性,但算法較為復雜,且由于學生解答五花八門語義分析有時誤判率會很高。本文摒棄這種思路,直接從結果進行判斷,即直接執行學生的答案及參考答案,若執行結果一致且結果集為非空,則判定正確,否則再通過簡單的語法判斷來判定正誤。但這里有個問題,若執行結果,需要數據庫里面專門為這些題目設定數據,這就需要設計較為完備的數據庫。
2.設計較為完備的數據庫
數據庫的設定包括兩部分,一部分是與管理相關的數據,另一部分則是與練習問題相關的數據。對于第一部分數據,我們可以在初始的時候設定,而對于與練習問題相關的數據,則在教師錄入問題時設定。
筆者在進行數據庫原理課程教學過程中發現,雖然SQL語言語法簡單,但許多學生由于缺乏練習仍然無法理解和掌握,導致在后續很多課程中無法熟練地利用SQL對數據庫進行操作。一般課后的作業布置或練習由于學生不知道標準答案,或者由于標準答案與自己所寫的答案有所區別而無法判斷自己所寫是否正確,從而效果不佳,較為明顯的是學生不可能多次重復做這個練習。因此筆者嘗試建立一個自動練習系統,供學生練習。學生可以在該系統上進行SQL語法練習,系統會根據學生的答案給出評判。通過對選修數據庫原理的學生的調研發現,絕大多數學生較喜歡在這樣的平臺上練習直至較為熟練地掌握SQL語言。
SQL練習系統的主要功能是實現給學生提供SQL語法練習的平臺并實現自動化評判。本系統包括用戶管理模塊、練習題管理模塊及自動批改模塊。用戶管理模塊的主要功能是增刪系統用戶,并能為用戶設置系統權限。其中增加用戶除允許用戶注冊外,還應允許管理員或教師用戶從Excel或其他文本文檔中批量導入用戶。對于管理員用戶還應具有初始化其他用戶密碼的權限。練習題管理模塊主要包括練習題的錄入及相關數據庫表的創建,練習題即為學生練習所用的題目,由于本系統采用執行結果比對的評判方式,因此當練習題所涉及的表不存在的時候,必須要求維護題庫的教師用戶創建數據表并輸入相應的數據。自動批改模塊主要通過在比較系統中執行用戶輸入的SQL語句和執行參考答案所得的結果,來評判用戶所寫的SQL語句是否正確。SQL練習系統的主要功能結構如圖1所示。

圖1 SQL練習系統功能結構圖
本系統是基于WEB的,且操作系統有可能選擇LINUX,因此本系統采用ECLIPSE作為開發工具,采用JSP、SERVELET、HTML、CSS、STRUTS等技術。
一般的操作流程為:用戶在客戶機上提交動態HTML頁面,向服務器提出請求;ActionServlet接收這些請求,Struts根據strutsconfig.xml文件給相關的請求分配給處理模塊進行處理。在業務層,相關業務處理邏輯用該處理模塊提供的方法來實現業務邏輯處理。采用Spring技術把數據庫與業務處理邏輯模塊關聯,利用hibernate的對象化映射,將模塊操作行為映射為對數據庫的操作,從而最終實現用戶的請求。下面我們利用面向對象技術根據角色活動來設計系統。
1.用戶登錄
系統涉及的參與者包括Student(學生)、Teacher(教師)、Administrator(系統管理員)。系統根據用戶名判斷用戶身份,然后進入不同的頁面。
2.學生在系統中的活動
系統通過用戶名判斷用戶是否為學生。若是學生用戶,則登錄系統后可以看到 “練習”、“練習成績管理”、“用戶信息”三個選項。具體如圖2。

圖2 學生在系統中的行為
(1)進行練習:①用戶可以設置每次練習的題量及時間。②用戶選擇一個練習之后,可以查看該練習的詳細信息,其中包括練習的知識點、難易程度、練習時限。我們還考慮統計某道題目的正確率=正確的答題次數/所有的答題次數。
(2)練習管理:①普通學生用戶可按照不同的查看方式查看自己已經練習過的考試的情況、排名。②另外我們在練習系統中引入了學習小組。學習小組的組長可以查看本小組成員的練習情況,并有針對性的進行共同學習或提高。
(3)練習信息:①用戶可查看所有的練習列表,包括尚未做過的及已經做過的。②用戶選擇一次練習后,可查看該練習的詳細信息,主要包括知識點、練習的難易程度、練習的總體正確率等。練習還將顯示成績、排名信息(比如前30%等)。若出錯,則還應提示正確答案。③學習小組組長可以打印本學習小組成員的練習情況報表。另外我們也提供了個人練習情況的報表。
(4)用戶信息:用戶可看到個人的姓名、學號、性別、院校信息,可以修改電話號碼,登錄密碼,QQ、Email、手機號等信息。
3.教師在系統中的活動
教師用戶在系統中登錄后,有練習題管理、練習管理、測試管理及練習結果查詢等四項功能。其中
(1)練習題管理。主要是對練習題庫的維護。由于我們采取的自動評閱算法是以執行結果來評判是否正確,因此在教師設置題庫的時候,需要選定該練習題是針對數據庫中的哪個表或哪幾個表來操作的,若題目所涉及的表不存在,則還需要輸入該表,并加入測試數據。詳細參考“四、關鍵算法設計”中的“準備工作”。圖3是教師用戶添加練習題的界面。
(2)練習管理。主要是為促進學生學習,教師可以在此生成課后練習作業直接布置給學生。學生可反復練習,直至完全掌握為止。
(3)測試管理。主要是教師為檢驗學生是否已經掌握SQL而設置的,一般學生只能做一次。但為了系統的開放性,實際在系統中,我們允許教師設定最大測試次數的,默認值為1。在測試打分中,目前的系統實現了自動評閱,但為系統的可擴展性,還允許教師手動評閱。

圖3 教師用戶添加練習題界面
(4)練習結果查詢。教師可以查看學生的練習情況,從而根據這些數據來改進自己的教學。
本系統的主要算法是自動評判算法。由于我們的自動評判算法的特殊性,在實現該算法前,應提前準備算法處理環境。
1.準備工作
由于算法的實現原理是比較兩次執行的結果,因此數據庫中的相關表是否存在就對算法能否最終實現起到決定性的作用。在教師用戶添加練習題的時候,來判斷該環境是否準備完成,由教師用戶來創建完善算法執行所需的環境。
在圖3中,教師按下添加題目按鈕且“所涉及的表已存在”,則該題目直接寫入題庫表,否則“添加題目”按鈕為灰色不可用。若用戶在最后一個文本區內寫了創建表的create語句,則按創建表該語句會被程序直接執行,若合法則創建一個新表,若不合法,程序會提示出錯,教師用戶可檢查自己寫入的語句,再次執行,直至創建成功為止。在創建成功后,系統受限把題目內容和參考答案一并寫入題庫表,并彈出一個對話框,詢問教師用戶是否需要輸入一些測試數據,一般系統建議選是。
下面著重介紹系統如何判斷題目所涉及的相關表是否存在,具體思路如圖4所示。

圖4 判斷SQL語句所涉及的表是否已存在
系統首先根據參考答案來獲得當前題目所涉及的表,然后與數據庫內已有的表進行比較。由于SQL的查詢語句的語法比較固定,在表名后一般跟where或group或having或order,所以只要判斷這幾個詞之間的內容并利用“,”作為分隔符來判斷表名即可。比如對于參考答案 “select student.studentid,student.name,subject. name,score.score from student,subject,score where student.studentid=“001””,則根據算法思路,獲得的strTable=“student,subject,score”,然后用“,”作為分割,獲得的tables[0]=student,tables[1]=subject,tables[2]= score。
2.自動評判算法
本文所設計的自動評判算法主要是依據兩次SQL語句的執行結果來判斷這兩個SQL語句是否等價,即來評判學生給出的答案是否正確。但用這種方式來判斷與數據表中的數據相關性太大,比如對表subject(subjectid, subjectname,credit,semester,required)查詢“數據庫原理與應用”課程的詳細情況,參考答案為 “select*from subject where subjectname=“數據庫原理與應用””,學生給出的答案為“select*from subject”。顯然答案是不對的。但當subject表中無任何數據或無“數據庫原理與應用”課程的時候,兩次執行的結果是一樣的。因此我們在設計該算法的時候考慮簡單的來分析下SQL語法。具體思路如下:
(1)執行學生答案,若合法,則保存學生的執行結果至動態數組TRYRESULT中。否則直接評判錯誤,算法退出。
(2)執行參考答案,若合法,則保存執行結果至動態數組RESULT中。若語法錯誤或相關表結構不一致時,直接提示參考答案錯誤或提示由于表結構不一致無法評判該題,直接退出算法。
(3)比較RESULT與TRYRESULT,若兩者不相同,則判定學生答案出錯;若相同則分兩種情況:①RESULT非空,則判定學生答案為正確;②RESULT為空,則轉到(4)。
(4)提取參考答案中的關鍵字,存放到動態數組ANSWERKEYS中;對比ANSWERKEYS中的關鍵字,從學生的答案中查找相應的詞,若都查到則判定學生答案正確;若查不到,則判定學生答案出錯。
在上述算法中,最困難的是(4)。它實際上涉及到SQL語法解析,本文中采用了較為簡單的評判算法。只抓取幾個較為簡單的關鍵字,以SQL語法中的關鍵字為主,再加上條件判斷中的條件語句。提取關鍵字的算法如下:①把SQL語法相關的關鍵字存入KEYS[]數組中;②取出KEYS[]中的關鍵字與參考答案進行比較;③判斷比較結果,若存在,則把該關鍵字存入ANSWERKEYS[]中;④取出參考答案中帶有“=”或帶引號的字符串存入到ANSWERSKEYS[]中。
最終關鍵字存放在ANSWERKEYS[]數組中。例如:“select*from subject where subjectname=“數據庫原理與應用””,在ANSWERKEYS數組中,保存的關鍵字為select,from,subject,where,subjectname=“數據庫原理與應用”。然后通過用字符串函數在學生答案中查找對應的字符串。由于通過前面的執行,語法錯誤已經被排除,因此本文的算法評判的正確率在目前的數據庫中達到97%以上。具體結果如表1。

表1 算法執行結果
在上述數據中需要提出的是,有些題目本算法無法判斷其正誤,主要是由于題目中涉及的表結構與數據庫中已有表的結構不一致。在表1的第一行數據中,在評判錯誤的2.68%中,無法評判的占95.97%。
本文設計的基于Web的SQL練習系統界面簡單,功能較為完備。在設計之初參考過很多在線考試系統和自動評判系統。本系統具有以下三個特點:
(1)直接執行SQL語句能判斷學生提供的答案是否符合語法規范。而通常的SQL語義分析算法較為復雜,且由于學生提供的答案五花八門,可能導致判斷失誤。而我們通過直接執行,可以利用系統自帶的解析器來解析語法,既簡化了算法又保證了正確性與可靠性。
(2)僅在當執行的結果集為空時來分析SQL語句。這樣算法簡單可靠,除了表或表結構不存在或不相符的情況,一般都能正確的評判。目前的測試數據集中還未出現由于其他原因無法評判或評判失誤的情況。
(3)作為對(2)的一種補救措施,我們在教師用戶錄入題目的時候,根據他提供的參考答案來判斷他在題目中所涉及的表是否存在,并強制要求其創建該表,建議其輸入測試數據。
(4)雖然目前系統主要用于練習,但系統中提供了教師管理及考試管理的接口,供以后系統擴充使用。因此本系統具有開放性和可擴展性,比如自動組卷、手動評判等接口。
在測試過程及學生實際使用過程中,系統運行穩定可靠,速度較快,且評判的失誤率極低,受到廣大師生的好評。但系統也存在一些缺點,最大的缺點是,系統目前沒有判斷用戶所涉及的表的結構是否與數據庫內已經存在的表結構一致,從而直接導致有些題目無法評判。臨時的解決方法是通過判斷參考答案select關鍵字至from關鍵字之間的字段 (即題目中所涉及的數據表結構)與數據庫內已存在的同名的表結構是否一致,若不一致則考慮在另外的數據庫中創建該表。另一個目前未解決的問題是,隨著題目的增多,必然會刪除一些陳舊的不典型的題目,此時僅與這些題目關聯的數據表應被刪除。[8]在今后系統的改進中將側重解決這兩個問題。
[1]由東友.SQL Server考核自動閱卷系統設計與實現[D].長春:吉林大學,2012.
[2]李海龍等.通用標準SQL語法分析模型[J].小型微型計算機系統,2003(11):1969-1972.
[3]孫兆玉等.一種SQL語法分析的策略和實現[J].計算機應用,2007(6):18-23.
[4]蔡雷.數據庫查詢語言SQL的語法分析及實現[D].天津:天津大學,2006.
[5]丁祥武等.SQL測試用例集的自動生成[J].計算機應用與軟件,2012(8):185-199.
[6]曹婧華等.Delphi編程實現SQL語句的實驗教學[J].長春大學學報,2011(4).
[7]楊鶴標,陳力.自然語言向SQL代碼的轉化方法[J].計算機工程,2011(23).
[8]劉春.四川建筑職業技術學院SQL Server數據庫備份系統的設計與實現[D].成都:電子科技大學,2010.