SQL連接查詢可以實(shí)現(xiàn)對(duì)多個(gè)表進(jìn)行查詢,生成的結(jié)果包含滿足連接條件的記錄。連接查詢是關(guān)系數(shù)據(jù)庫的重要組成部分和主要特點(diǎn),在實(shí)際應(yīng)用中,連接查詢廣泛應(yīng)用在數(shù)據(jù)庫使用的方方面面。該文目的是想介紹利用SQL連接查詢高效完成復(fù)雜的“學(xué)校學(xué)歷證書**資料”,了解不同連接查詢的使用方法,掌握連接查詢?cè)?ldquo;用戶信息管理”中的實(shí)際應(yīng)用,探討連接查詢的使用技巧,為科學(xué)、準(zhǔn)確、快速地實(shí)現(xiàn)數(shù)據(jù)的查詢和管理提供依據(jù)。
摘要:該文根據(jù)數(shù)據(jù)庫系統(tǒng)的關(guān)系模型,分析了數(shù)據(jù)庫連接查詢的分類和應(yīng)用,并通過具體實(shí)例和對(duì)比的方法,對(duì)數(shù)據(jù)庫的連接查詢?cè)趯W(xué)校教務(wù)工作中的靈活運(yùn)用進(jìn)行了探討。
關(guān)鍵詞:連接查詢,多表查詢,連接謂詞
1連接查詢
連接是兩元運(yùn)算,是關(guān)系的模向結(jié)合。連接運(yùn)算是將兩個(gè)關(guān)系模式拼接成一個(gè)更寬的關(guān)系模式,生成的新關(guān)系中包含滿足連接條件的記錄。
在實(shí)際的應(yīng)用中,當(dāng)檢索數(shù)據(jù)時(shí),常通過連接操作查詢出存放在多個(gè)表中的不同實(shí)體的信息。例如,在教師信息管理數(shù)據(jù)庫中查詢某教師的姓名、職稱、工資、任課科目等,所需要的列有來自于教師表的姓名和職稱數(shù)據(jù)列;有來自于工資表中的工資數(shù)據(jù)列;有來自于課程表中的任課科目數(shù)據(jù)列。這種涉及到多個(gè)表之間的查詢就是我們所說的連接查詢。
在T-SQL中,連接查詢分為兩種表示形式,一是符合SQL標(biāo)準(zhǔn)的連接謂詞的表示形式,二是T-SQL擴(kuò)展的使用關(guān)鍵詞JOIN的表示形式。
1.1連接謂詞
連接謂詞表示形式的連接查詢是在WHERE子句中使用的連接語句,在數(shù)據(jù)庫語言中,也被稱為隱性連接。然而,隨著數(shù)據(jù)庫語言的規(guī)范和發(fā)展,隱性連接已逐漸不被使用,當(dāng)前的數(shù)據(jù)庫語言基本上已經(jīng)全部采用顯性連接。
1.2使用JOIN關(guān)鍵詞指定的連接
T-SQL擴(kuò)展了以JOIN關(guān)鍵詞指定連接的表示方式,我們將這種以JOIN……ON子句產(chǎn)生的連接稱為顯性連接。顯性連接大大增強(qiáng)了多表的連接運(yùn)算能力。FROM子句的表示將多個(gè)表連接起來,連接語法格式如下:
FROMjoin_tablejoin_typejoin_table
[ON(join_condition)]
指出連接類型,可分為三種:內(nèi)連接、外連接和交叉連接。
1)內(nèi)連接(join或innerjoin):兩個(gè)存在關(guān)聯(lián)關(guān)系的表A和B,表A與表B內(nèi)連接的查詢結(jié)果為C,結(jié)果集C中只能包括表A與表B中滿足連接條件的記錄。
2)外連接可分為:左連接、右連接、完全外連接。
、僮筮B接(leftjoin或leftouterjoin):兩個(gè)存在關(guān)聯(lián)關(guān)系的表A和B,表A與表B左連接的查詢結(jié)果為C。C的記錄中包括A的全部記錄以及B中與A滿足連接條件的記錄,C中A與B不滿足連接條件的列值為空值。
、谟疫B接(rightjoin或rightouterjoin):右連接的含義是:兩個(gè)存在關(guān)聯(lián)關(guān)系的表A和B,表A與表B右連接的查詢結(jié)果為C。C的記錄中包括B的全部記錄以及表A中與B滿足連接條件的記錄,C中B與A不能夠滿足連接條件部分為空值。
、弁耆膺B接(fulljoin或fullouterjoin):兩個(gè)存在關(guān)聯(lián)關(guān)系的表A和B,表A與表B完全外連接的查詢結(jié)果為C。C的記錄中包括A和B的全部記錄,C中B與A以及A與B不滿足連接條件的部分為空值。
3)交叉連接(crossjoin):交叉連接查詢返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,查詢結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。
2巧用SQL的外連接示例
內(nèi)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件和連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不僅包含符合連接條件的行,而且還可以包括左表、右表或兩個(gè)連接表中的所有數(shù)據(jù)行。因此,外連接更具靈活性,查詢運(yùn)算功能也更強(qiáng)大,合理應(yīng)用好外連接查詢有時(shí)將起到意想不到的效果,并大大提高我們的工作效率。
2.1案例問題
學(xué)歷證書是學(xué)生在學(xué)校學(xué)習(xí)的重要憑證,對(duì)學(xué)生的就業(yè)具有重大影響。因此,學(xué)歷證書的及時(shí)**和準(zhǔn)時(shí)發(fā)放是每一所學(xué)校都非常重視的工作。而對(duì)于技工院校,學(xué)歷證書**過程中畢業(yè)生資料的收集和整理,特別是畢業(yè)生學(xué)習(xí)成績(jī)(含五門文化基礎(chǔ)課成績(jī)和五門專業(yè)課成績(jī))的錄入又是這項(xiàng)工作的重中之重。需完成上報(bào)的“畢業(yè)生學(xué)習(xí)成績(jī)表”,見圖6。
隨著學(xué)校規(guī)模的不斷擴(kuò)大,畢業(yè)學(xué)生人數(shù)的逐年增多,學(xué)生畢業(yè)資料的整理更是越來越繁重。畢業(yè)生學(xué)習(xí)成績(jī)的錄入困難主要表現(xiàn)在如下幾方面:
1)“畢業(yè)生學(xué)習(xí)成績(jī)表”要求需嚴(yán)格按照規(guī)定的學(xué)生學(xué)號(hào)次序和規(guī)定的十門課程的排序進(jìn)行錄入。
2)各畢業(yè)生的各科目成績(jī)需從每個(gè)學(xué)期期末各班主任上交教學(xué)管理部門的“學(xué)生成績(jī)總表”中查詢獲取。
3)各班主任上交的“學(xué)生成績(jī)總表”中學(xué)生的排序通常是按學(xué)生的座位號(hào)進(jìn)行排列的,而且各科目的排序也是隨機(jī)的。
因此,要完成一個(gè)班級(jí)的畢業(yè)生學(xué)習(xí)成績(jī)表,基本上需要分別到四個(gè)學(xué)期的“學(xué)生成績(jī)總表”中去逐一將十門課程的成績(jī)找出來,并填入“畢業(yè)生學(xué)習(xí)成績(jī)表”對(duì)應(yīng)的位置。這是何等繁重的一項(xiàng)工作,傳統(tǒng)的方式完成一個(gè)班級(jí)的成績(jī)錄入至少也得花上三個(gè)多小時(shí)。而對(duì)于整個(gè)學(xué)校幾十個(gè)畢業(yè)班而言,一個(gè)部門要完成這么一項(xiàng)巨大的工程,這簡(jiǎn)直就是一項(xiàng)不可能的任務(wù)。
為此,如何高效、快速的完成如此龐大的數(shù)據(jù)錄入,減少相關(guān)學(xué)生管理部門的工作量,就是擺在我們面前的一個(gè)重要的課題。2.2創(chuàng)建示例數(shù)據(jù)庫
1)創(chuàng)建案例數(shù)據(jù)庫和數(shù)據(jù)表
為了進(jìn)行實(shí)驗(yàn)分析,該文利用“畢業(yè)生花名冊(cè)”(見圖7)和各學(xué)期每個(gè)班主任交上來的“學(xué)生成績(jī)總表”EXCEL表格(見圖8),建立了案例數(shù)據(jù)庫“DB09”,對(duì)應(yīng)XM和T1兩張數(shù)據(jù)表,如表1、2所示。
2)給數(shù)據(jù)表填充數(shù)據(jù)
示例數(shù)據(jù)庫和數(shù)據(jù)表創(chuàng)建完成后,我們把要查詢的班級(jí)學(xué)生名單從全校的“畢業(yè)生花名冊(cè)”中復(fù)制下來,并粘貼到XM數(shù)據(jù)表中。并將需查詢的某一學(xué)期的該班級(jí)的學(xué)生成績(jī)總表數(shù)據(jù),復(fù)制粘貼到T1數(shù)據(jù)表中。至此,數(shù)據(jù)庫、數(shù)據(jù)表和需查詢的數(shù)據(jù)都已準(zhǔn)備完成。
2.3編寫SQL語句
現(xiàn)在我們需要做的就是利用SQL語句,按照XM表的名字順序,從T1表中查詢出需要的科目成績(jī)。比方說,如果希望按照0915班的學(xué)生名字排序,查詢同學(xué)們?cè)?009—2010學(xué)年第一學(xué)期FLASH科目的對(duì)應(yīng)成績(jī),則可以編寫如下所示的SELECT語句:
USEDB09
selectXM.姓名,T1.科目二as'FLASH'
fromXMleftjoinT1
onXM.姓名=T1.姓名
orderbyXM.idasc
以上語句執(zhí)行的結(jié)果如圖9所示。
通過上述的SQL左外連接示例,我們輕輕松松實(shí)現(xiàn)了對(duì)0915班FLASH科目的成績(jī)查詢,這跟手工逐一篩選相比,無疑前進(jìn)了一大步。然而,我們僅僅實(shí)現(xiàn)了對(duì)一個(gè)學(xué)期一門科目的成績(jī)查詢,那么,我們能不能夠使用同樣的方法,實(shí)現(xiàn)同時(shí)對(duì)多個(gè)學(xué)期多門科目的成績(jī)查詢呢?答案顯然是肯定的。
下面,我們以0915班為例,以每學(xué)期的“學(xué)生成績(jī)總表”建立相對(duì)應(yīng)的數(shù)據(jù)表,分別為:T1、T2、T3、T4。再按照學(xué)生名字的排序,查詢出同學(xué)們第一學(xué)期的FLASH,第二學(xué)期的英語和語文,第三學(xué)期的政治和計(jì)算機(jī)網(wǎng)絡(luò)管理,第四學(xué)期的數(shù)學(xué)、體育、中文VF、網(wǎng)頁制作和ASP程序設(shè)計(jì)科目的對(duì)應(yīng)成績(jī)。實(shí)現(xiàn)的SELECT語句如下:
USEDB09
selectxm.姓名,T3.科目五as'政治',T2.科目七as'語文',T4.科目六as'數(shù)學(xué)',T2.科目六as'英語',T4.科目七as'體育',T1.科目二as'FLASH',T4.科目一as'中文VF',T4.科目四as'ASP程序設(shè)計(jì)',T3.科目二as'計(jì)算機(jī)網(wǎng)絡(luò)管理',T4.科目三as'網(wǎng)頁制作'
fromxmleftjoinT1onT1.姓名=xm.姓名
leftjoinT2onT2.姓名=xm.姓名
leftjoinT3onT3.姓名=xm.姓名
leftjoinT4onT4.姓名=xm.姓名
orderbyXM.idasc
上述語句執(zhí)行的結(jié)果如圖10所示。
通過對(duì)SELECT語句進(jìn)一步的優(yōu)化和擴(kuò)展,我們一步到位,一次執(zhí)行即可完成一個(gè)班級(jí)的畢業(yè)生學(xué)習(xí)成績(jī)表,將這項(xiàng)原本“不可能的任務(wù)”變得輕而易舉,大大減少了相關(guān)學(xué)生管理部門的工作量,為學(xué)校每年學(xué)歷證書的及時(shí)**提供了強(qiáng)有力的保障和支持。
3結(jié)束語
SQL是一門ANSI的標(biāo)準(zhǔn)計(jì)算機(jī)語言,集數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制等功能于一體,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)。數(shù)據(jù)庫的查詢正是SQL語言的核心內(nèi)容,也是我們最常用的操作。而連接查詢又是關(guān)系數(shù)據(jù)庫中最主要的查詢,在實(shí)際中被廣泛應(yīng)用。如何在各行各業(yè)中靈活、科學(xué)地使用數(shù)據(jù)庫技術(shù),提高工作效率具有很現(xiàn)實(shí)的意義。
參考文獻(xiàn):
[1]周峰,張振東,張術(shù)強(qiáng).SQL結(jié)構(gòu)化查詢語言[M].北京:中國(guó)鐵道出版社,2010:149-165.
[2]鄭阿奇.SQLSERVER實(shí)用教程[M].北京:電子工業(yè)出版社,2011:99-103.
[3]宋曉峰.SQLServer2000中文版基礎(chǔ)教程[M].北京:人民郵電出版社,2007:44-159.
轉(zhuǎn)載請(qǐng)注明來自:http://www.jinnzone.com/dianzijishulw/28833.html