java web項(xiàng)目開發(fā)案例精粹-2技術(shù)sql查詢語言chap_第1頁
java web項(xiàng)目開發(fā)案例精粹-2技術(shù)sql查詢語言chap_第2頁
java web項(xiàng)目開發(fā)案例精粹-2技術(shù)sql查詢語言chap_第3頁
java web項(xiàng)目開發(fā)案例精粹-2技術(shù)sql查詢語言chap_第4頁
java web項(xiàng)目開發(fā)案例精粹-2技術(shù)sql查詢語言chap_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七章數(shù)據(jù)庫中每個(gè)表僅了一部分的數(shù)據(jù)。在許多情況下,單獨(dú)使用一個(gè)表時(shí)無法查詢到所需的數(shù)據(jù)的,這時(shí)就需要能從多個(gè)表中查詢數(shù)據(jù),就需要使用連接操作。本章將本章主要內(nèi)容:SELECT語句pnumberProjectPaccepter表,也可以使用不同名字的列進(jìn)行連接,例如使EmployeeidDepartmentmgrid列進(jìn)行連接。進(jìn)行連接操作時(shí),用傳統(tǒng)的連接語法:FROM/WHERESQLSQLJOINSELECTFROMTable1name,[Table2name,WHERE[Table1name.]columnoperatorSELECTFROMtable_list/view_list[WHEREconditions]FROM子句中指定了多個(gè)表。例如,下面是一個(gè)典型的非連接的SELECT語句:SELECTname,sex,id,FROMEmployeeWHEREsalary=而連接語句包含了多個(gè)表。例如,查詢部門的負(fù)責(zé)的部門號(hào)、名字、id號(hào)、及工資,就需要使用連接,因?yàn)樵贓mployee表中并沒有誰是什么部門的,的id號(hào)在Department表中,連接語句為:SELECTdnumber,name,sex,id,salaryFROMEmployee,DepartmentWHEREid=————6男1男2男3男4男5男SQLSQLJOIN、CROSSJOINNATURALJOIN,用于連接操作。使用JOIN關(guān)鍵字連接的基本格式如下:SELECTFROMTable1name[CROSS|NATURAL]JOINTable2name[ON[Table1name.]columnoperator[Table2name.]column][WHEREconditions]第一行中的select_list仍然是選擇的列的名稱,但是需要注意的是,如果使用兩CROSSNATURAL是可選項(xiàng),可以使用也可以不使用。如果選擇了CROSS或NATURAL關(guān)鍵字,那么就不能使用ON關(guān)鍵字;CROSSJOINONWHERE子句設(shè)定連接的條件。因?yàn)槿绻辉O(shè)定連接條件,將返回表之間的每一種可能組合(即笛卡NATURALJOIN只有在兩個(gè)表有相同名稱的列時(shí)才能使用,將在同名列上進(jìn)行連接。因此,不必使用關(guān)鍵字ON或WHERE子句設(shè)定連接條件。當(dāng)然,使用WHERE例如,查詢部門的負(fù)責(zé)的部門號(hào)、名字、id號(hào)、及工資,可以使用JOIN進(jìn)行連接:SELECTdnumber,name,sex,id,salaryFROMEmployeeJOINDepartmentONid=————6男1男2男3男4男5男CROSSJOINSELECTdnumber,name,sex,id,salaryFROMEmployeeCROSSJOINDepartmentWHEREid=mgrid雖然Employee表中的id列與Project表中mgrid列的數(shù)據(jù)類型相同,的內(nèi)容也是相同的,但由于創(chuàng)建Project表時(shí)將部門id號(hào)的列的名稱定義為mgrid,因EmployeeProjectNATURALJOINProject表時(shí)將部門id號(hào)的列的名稱也定義為id,則可以對(duì)這兩個(gè)表使用NATURALProject表與Paccepter表中有兩個(gè)相同的列pnumber,兩個(gè)表中pnumber列的ProjectPaccepterNATURALJOIN關(guān)鍵字SELECTpnumber,accepter,budgetFROMProjectNATURALJOINPaccepterCROSSJOIN、JOINFROM/WHERE實(shí)現(xiàn),SELECTSELECTpnumber,accepter,budgetFROMProjectCROSSJOINWHEREProject.pnumber=SELECTpnumber,accepter,budgetFROMProjectJOINPaccepterONProject.pnumber=SELECTpnumber,accepter,budgetFROMProjectPaccepterWHEREProject.pnumber=NATURALJOIN的查詢結(jié)果相同。同時(shí),您可以看到,在這兩個(gè)查詢中在pnumber之前使用了表名進(jìn)行限定,如果不進(jìn)行限定:SELECTpnumber,accepter,budgetFROMProjectJOINPaccepterONpnumber=兩個(gè)pnumber將會(huì)產(chǎn)生。因此,在使用多個(gè)表時(shí),如果表之間有相同名稱的列,雖然越來越多的數(shù)據(jù)庫系統(tǒng)都支持JOIN關(guān)鍵字的連接操作,但是傳統(tǒng)的FROM/WHERE用法仍然使用的非常普遍,而且為了增加代碼的可移植性傳統(tǒng)的FROM/WHERE用法是可取的。因此,本章中大部分例子仍使用傳統(tǒng)的FROM/WHERE語法,其間也會(huì)介紹使用JOIN的語法。進(jìn)行數(shù)據(jù)庫設(shè)計(jì)時(shí),由于一致性(即最小冗余性、方便性及性能的要求,每個(gè)表中的列數(shù)必須有限制,而不能將數(shù)據(jù)都在一個(gè)表中,因此需要按照規(guī)范化準(zhǔn)則對(duì)表進(jìn)行處理。按照規(guī)范化準(zhǔn)則進(jìn)行處理后,許多信息將分散在不同的表中,以防止數(shù)據(jù)冗余、更新復(fù)雜等問題的產(chǎn)生。于是,輸入的數(shù)據(jù)將到按照規(guī)范化準(zhǔn)則設(shè)計(jì)的各個(gè)表中,當(dāng)您希望綜合數(shù)據(jù)進(jìn)行分析時(shí),就不得不從多個(gè)表中組合數(shù)據(jù)。查詢某個(gè)工作人員所屬部門的部門,單獨(dú)的Employee表或單獨(dú)的Department表都使用連接還有一個(gè)好處:連接對(duì)于結(jié)果沒有特別的限制,具有很大的靈活性。通??梢酝ㄟ^連接創(chuàng)建包含不同表中數(shù)據(jù)的新表或者視圖。這就使得數(shù)據(jù)庫的擴(kuò)展具有很大靈性例,果用發(fā)需新信息當(dāng)可通向個(gè)中加一錄在該列的值均為空值,除非隨后對(duì)其進(jìn)行更新。這時(shí),可以為其建立一個(gè)新表,并通過使用適當(dāng)?shù)倪B接以使新的數(shù)據(jù)能方便的與原有數(shù)據(jù)進(jìn)行連接,當(dāng)然用于連接的列也必須包含在新表中。這樣添加新的數(shù)據(jù)時(shí)就不會(huì)在原有的表中產(chǎn)生大量空值。先察看Project表中包含的數(shù)據(jù):SELECTpnumber,budgetFROMProject SELECTpnumber,accepterFROMPaccepter aceperpnubrroct表中的nuber也相同。實(shí)際上,兩個(gè)列的是相同的數(shù)據(jù),都是項(xiàng)目的編號(hào)。一般來說,不同表中不過,當(dāng)用來連接的列是主鍵及與其對(duì)應(yīng)的外部鍵時(shí),可以獲得良好的連接。在理想的情況下,對(duì)數(shù)據(jù)庫中的表進(jìn)行連接時(shí)使用表的主鍵與相應(yīng)外部鍵。因?yàn)椋O(shè)計(jì)數(shù)據(jù)庫時(shí),主鍵與外部鍵在邏輯上就是互相聯(lián)系的,并且主鍵與外部鍵之間具有一致性,會(huì)保持主鍵列與外部鍵列在值上的一致。主鍵與外部鍵可以很好的保持?jǐn)?shù)據(jù)庫完整性。創(chuàng)進(jìn)行連接的列名稱可以不同,除非要使用NATURALJOIN,如果需要使用相同表中的dname列進(jìn)行連接;接是毫無用處的。例如,雖然Employee表中的name列與Department表中的dname在進(jìn)行連接時(shí),還應(yīng)該指定連接條件,連接條件的設(shè)定使您可以很方便的進(jìn)行一些特定的查詢。例如,查找正工作在與項(xiàng)目接收方所在城市相同的工作人員,可以這樣進(jìn)SELECTname,sex,id,salaryFROMEmployee,PaccepterWHEREEmployee.city=SELECTname,sex,id,salaryFROMEmployeeJOINONEmployee.city=笛卡爾ABC———abcdefbcdDE——deefABCDE—————abcdeabcefdefdedefefbcdde 323*6錄。可見,兩個(gè)表的笛卡爾積是兩個(gè)表中所有記錄的所有組合。如果沒有限制連接條件roctaceperSELECTname,sex,id,salaryFROMEmployee,PaccepterABC———abcdefbcdDE——deABCDE—————abcdedefdebcdde進(jìn)行連接操作時(shí),都是先形成表之間的笛卡爾積,獲得笛卡爾積之后再使用指定的HEE的記錄。正確的指定連接條件和限制條件將有助于產(chǎn)生良好的連接結(jié)果。當(dāng)返回的結(jié)果進(jìn)行連接,例如,前面介紹的查詢部門的負(fù)責(zé)的部門號(hào)、名字、id號(hào)、性別及工資,可以使用等號(hào)連接Employee表與Department表:SELECTdnumber,name,sex,id,salaryFROMEmployeeJOINDepartmentONid=SELECTdnumber,name,sex,id,salaryFROMEmployee,DepartmentWHEREid=也可以使用大于或小于等其它運(yùn)算符進(jìn)行連接操作。例如,查找沒有在規(guī)定時(shí)間內(nèi)roctpenddaeceperceaeSELECTpnumber,accepter,penddate,accedateFROMProject,PaccepterWHEREpenddate>accedateANDProject.pnumber=Paccepter.pnumber2001-12-2001-12-2002-04-2002-04-子句中按照兩個(gè)表的pnumber列進(jìn)行相等連接,由于WHERE子句中附加的表達(dá)式也可以使用不等式進(jìn)行連接,與大于連接類似,使用不等式進(jìn)行連接,通常也需要octpendaeaceperaedaeSELECTpnumber,accepter,penddate,accedateFROMProject,PaccepterWHEREpenddate<>accedateANDProject.pnumber=Paccepter.pnumber2001-12-2001-12-2002-08-2002-08-2002-04-2002-04-WHERE子句限制查找的行。例如,只需要查看項(xiàng)目號(hào)小于201的所有項(xiàng)目的項(xiàng)目編號(hào)、接收項(xiàng)目成本,就必須使用WHERE子句SELECTpnumber,accepter,bugdetFROMProjectJOINPaccepterONProject.pnumber=Paccepter.pnumberWHEREProject.pnumber<201SELECTpnumber,accepter,bugdetFROMProject,PaccepterWHEREProject.pnumber=Paccepter.pnumberProject.pnumber<

華夏技術(shù) 神州發(fā)展 四海貿(mào)易多表連有的時(shí)候您可能需要連接兩個(gè)以上的表進(jìn)行查詢,來獲得一些完整的信息。例如,需要知道工作人員本身以及其所屬的部門和所參與的項(xiàng)目的詳細(xì)信息,就需要連接Epoye表、Deparent表、roect表這三個(gè)表以得到所需的信息。FROM子句中添加表名,在連接條件中設(shè)定新的連接條Project121728行的組合表。實(shí)際情況中,每個(gè)表包含的100100萬行的組合表。處理這樣SELECTname,id,dnumber,mgrid,pnumber,grossFROMEmployee,Department,ProjectWHEREdno=dnumberANDpno=pnumber————1111144444455剛55SELECTname,id,dnumber,mgrid,pnumber,grossFROMEmployee,DepartmentONdno=dnumberONpno=就需要對(duì)兩個(gè)表進(jìn)行連接。例如,ProjectPaccepter表之間就是一對(duì)一關(guān)系,可以通過項(xiàng)目號(hào)pnumber進(jìn)行連接:SELECTpnumber,accepter,budgetFROMProjectJOINPaccepterONProject.pnumber=Paccepter.pnumberWHEREProject.pnumber=102SELECTpnumber,accepter,budgetFROMProjectPaccepterWHEREProject.pnumber=Paccepter.pnumberANDProject.pnumber=102

華夏技術(shù)對(duì)于一對(duì)多關(guān)系的處理也比較簡(jiǎn)單。一對(duì)多關(guān)系是一個(gè)表中一個(gè)記錄可以與另一個(gè)表的若干記錄相對(duì)應(yīng)。查詢時(shí)也可以對(duì)兩個(gè)表進(jìn)行連接。例如,部門與工作人員之間就SELECTname,id,dnumber,mgridFROMEmployeeJOINDepartmentONdno=dnumberWHEREname=’SELECTname,id,dnumber,mgridFROMEmployee,DepartmentWHEREdno=dnumberANDname=’’————1對(duì)于多對(duì)多關(guān)系,由于無法直接對(duì)具有多對(duì)多關(guān)系的兩個(gè)表進(jìn)行連接實(shí)現(xiàn),則必須使用創(chuàng)建數(shù)據(jù)庫時(shí)專門為多對(duì)多關(guān)系創(chuàng)建的連接表來實(shí)現(xiàn)。因此,需要使用包含三個(gè)表的連接來組合數(shù)據(jù)。例如,一個(gè)部門可以同時(shí)進(jìn)行一個(gè)或多個(gè)項(xiàng)目,而一個(gè)項(xiàng)目可能也需要多個(gè)部門的配合才能很好的完成。也就是說,部門與項(xiàng)目間存在著多對(duì)多的關(guān)系??梢酝ㄟ^連接表來實(shí)現(xiàn)部門與項(xiàng)目的連接:SELECTdnumber,mgrid,pnumberFROMDepartmentJOINDep_proONDepartment.dnumber=Dep_pro.dnumberProjectJOINDep_proONProject.pnumber=Dep_pro.pnumberWHEREProject.pnumber=301SELECTdnumber,mgrid,FROMWHEREDepartment.dnumber=Dep_pro.dnumberANDProject.pnumber=Dep_pro.pnumberANDProject.pnumber=301145 列表中列出需要返回的列。如果使用“*”包含所有的列,那么顯示時(shí)列將按照創(chuàng)建表時(shí)指定的順序顯示。例EpoyeDeparentSLET列表種使用了“*”,返回的結(jié)果是難以忍受的:SELECTFROMEmployeeJOINDepartmentONdno=dnumberWHEREname=’SELECTFROMEmployee,DepartmentWHEREdno=dnumberANDname=’ —

———1977-04-an女44 2001-1-本例中僅列出了一行,結(jié)果已經(jīng)是很晦澀了。如果查詢返回的是20行,甚至的時(shí)候,返回的結(jié)果幾乎無法閱讀。因此,在使用時(shí)需要注意“*”的使用,不恰當(dāng)?shù)厥褂脤?huì)造成很大的不便。進(jìn)行連接時(shí),應(yīng)該仔細(xì)選擇需要查看的列。EmployeednoDepartmentdnumber列連接,顯示結(jié)果SELECTname,salary,dno,dnumberFROMEmployeeJOINDepartmentONdno=WHEREsalary=SELECTname,salary,dno,dnumberFROMEmployee,DepartmentWHEREdno=dnumberANDsalary=22115511剛55332233SELECT列表中使用一個(gè)列即可。如,上面的查詢可SELECTname,salary,dnumberFROMEmployeeJOINDepartmentONdno=dnumberWHEREsalary=SELECTname,salary,dnumberFROMEmployee,DepartmentWHEREdno=dnumberANDsalary=2151剛5323在進(jìn)行連接時(shí),也可以為表或列創(chuàng)建別名以方便使用或使顯示結(jié)果更加清晰。特別是表中有相同名稱的列時(shí),別名的使用可以使代碼更易于輸入,且更易于閱讀。例如,ProectPacceperpnuber所以需要進(jìn)行限定以防止:SELECTpnumber,accepter,pmgridFROMProjectJOINPaccepterONProject.pnumber=WHEREProject.pnumber=SELECTpnumber,accepter,pmgridFROMProject,PaccepterWHEREProject.pnumber=Paccepter.pnumberANDProject.pnumber=102如果項(xiàng)目接收方也有對(duì)應(yīng)項(xiàng)目的,且創(chuàng)建Pa eter表時(shí),也命名為pmgrid,SELECTpnumber,accepter,Project.pmgridFROMProjectJOINPaccepterONProject.pnumber=Paccepter.pnumberWHEREProject.pnumber=102SELECTpnumber,accepter,Project.pmgridFROMProject,PaccepterWHEREProject.pnumber=Paccepter.pnumberANDProject.pnumber=102使用這么長(zhǎng)的表名進(jìn)行限定時(shí)比較麻煩的,也使得代碼不是非常清晰??梢詾楸韯?chuàng)建別名便于代碼的書寫,也可以為列創(chuàng)建別名以使顯示結(jié)果清晰易讀。例如,上例可以SELECTpnumber,accepter,Paccepter.pmgridASAc FROMProjectpJOINPaccepteraONp.pnumber=a.pnumberWHEREp.pnumber=102SELECTpnumber,accepter,Paccepter.pmgridASAc FROMProjectp,PaccepteraWHEREp.pnumber=a.pnumberAND

華夏技術(shù)10015NULL時(shí),NULL將不會(huì)參與連接,即使兩個(gè)表的連接列都存在NULL,連接結(jié)果也不會(huì)存在NULL。因?yàn)?,空值代表的是未知、丟失或不可例如,Employeecity列記錄的是工作人員正在工作的城市,該列允許空值,在citycity列包含SELECTname,city,pnoFROMEmployeeWHEREpno同樣,Paccepter表中city列也可能由于出現(xiàn)了空值(假設(shè)項(xiàng)目號(hào)為102301citySELECTpnumber,accepter,cityFROMPaccepterSELECTname,city,pnumber,accepterFROMEmployeee,PaccepteraWHEREe.city=a.cityANDpno=pnumberANDcityNOTIN(’’,’104與301員正在城市“杭州”或“廈門”工作。Empoee中名為“”的工作人員參與了301cycy詢結(jié)果可以看出,雖然符合設(shè)定的其它條件,但是并沒有進(jìn)行連接操作。可見,連接操接著,使用WHERE子句從形成的笛卡爾積中去除所有不符合限制條件的行。這時(shí)SELECT子句還沒有進(jìn)行執(zhí)行,因此,連接表形成的笛卡爾積中包含了用于連接的WHERESELECT列表中的列的原WHEREGROUPBYBY子句中指定的列對(duì)剩下的行進(jìn)行分組。雖然,這時(shí)SELECT子句還沒有執(zhí)行,但是如果SELECT列表中包含了函數(shù)將會(huì)對(duì)分好的組進(jìn)行計(jì)算。HAVING子句,將使用其設(shè)定的條件對(duì)分組結(jié)果進(jìn)行刪除,ORDERBYORDERBY子句指定的列進(jìn)行排序顯示出來。一般的一般的連接通常通過兩個(gè)表中的某個(gè)特定的列進(jìn)行連接。最通常使用的是相等連接,當(dāng)然也可以使用大于連接、小于連接等。例如,EployePacceper表中都包含cycySQL語句進(jìn)行連接:SELECTname,city,pnumber,accepterFROMEmployeee,PaccepteraWHEREe.city=a.cityANDpno=pnumber剛CESA.自然連使用WHERE子句限制查找的行仍然是可以的。使用傳統(tǒng)的FROM/WHERE子句,則需要在WHERE子句中指定連接列的相等條件。例如,ProjectPaccepterpnumberProjectPaccepterSELECTpnumber,accepter,FROMProjectpNATURALJOINPaccepterSELECTpnumber,accepter,pmgridFROMProjectp,PaccepteraWHEREp.pnumber=a.pnumber自連有的時(shí)候需要進(jìn)行一些特殊的操作,例如,查詢項(xiàng)目接收方在同一個(gè)城市的項(xiàng)目,于roect表中并沒有項(xiàng)目接收方所在城市的信息,無法得到項(xiàng)目接收方的信息,而acceper表中了項(xiàng)目接收方所在城市的信息,那么如何得到處于同一個(gè)城市的所有項(xiàng)目的信息呢?當(dāng)然,可以使用子查詢來實(shí)現(xiàn),子查詢將在下一章中介紹。但是,使用子查詢比較麻煩。SQL支持了自連接可以很好的完成這樣的操作。例如,如果不為表設(shè)定別名,對(duì)Paccepter表進(jìn)行自連接:SELECTPaccepter.accepter,Paccepter.city,Paccepter.accepter,Paccepter.cityFROMPaccepter,Paccepter由于Pacceptercity列進(jìn)行自連接時(shí)產(chǎn)生的結(jié)果太多,因此設(shè)定只對(duì)city列SELECTpnumber,accepter,cityFROMPaccepter SELECTa1.accepter,a1.city,a2.accepter,a2.cityFROMPacceptera1,Pacceptera2WHEREa1.city=a2.cityANDa1.cityIN(’杭州’,’’)———由于在自連接時(shí)沒有設(shè)定限制條件,所以行與其自身產(chǎn)生了連接,造成了結(jié)果的大量重復(fù),使得顯示結(jié)果很不清晰。因此,需要為其加上不等條件保證行不與其自身相連SELECTDISTINCTa1.accepter,a1.city,a2.accepter,a2.cityFROMPacceptera1,Pacceptera2WHEREa1.city=a2.cityANDa1.acceptera2.accepterANDa1.cityIN(’杭州’,’’)———藍(lán)科通訊公杭州漢升咨詢公司杭藍(lán)科通訊公杭州貿(mào)易公司杭漢升咨詢公杭州藍(lán)科通訊公司杭漢升咨詢公杭州貿(mào)易公司杭貿(mào)易公司杭州藍(lán)科通訊公司杭貿(mào)易公司杭州漢升咨詢公司杭化天通訊公汽修公司化天通訊公汽修公司東勝東勝汽修公司化天通訊公司東勝化天通訊公司東勝汽修公司DISTINCT關(guān)鍵字用于去除重復(fù)。避許多公司中可能還Employee表中為每個(gè)工作人員其上司的id號(hào),增加一個(gè)leader列用來上司的id號(hào)。那么就可以對(duì)Employee表進(jìn)行自連接,以查找員工SELECT,e1.id,ASleader,e2.idASleaderidFROMEmployeee1,Employeee2WHEREe1.leader=外連是外連接的作用。使用外連接可以方便的在連接結(jié)果中包含某個(gè)表中的其它記錄。SQL中提供了兩個(gè)關(guān)鍵字:LEFTOUTERJOINRIGHTOUTERJOIN。LEFTOUTERJOIN關(guān)鍵字使外連接顯示LEFTOUTERJOIN左側(cè)的表包含的所有記錄。而RIGHTOUTERJOIN關(guān)鍵字則使外連接顯示RIGHTOUTERJOIN右側(cè)的表所包含的所有記錄。LEFTOUTER要顯示工作人員的信息及其參與的項(xiàng)目的信息,可以對(duì)EmployeeProject表進(jìn)行連連接進(jìn)行查詢,可以這樣使用LEFTOUTERJOIN:SELECTname,id,pnumber,pmgridFROMEmployeeLEFTOUTERJOINProjectONpno=pnumber剛LEFTOUTERJOINEmployeeProject表中記錄連接的值,都將在結(jié)果中包含Employee表中的所有記錄,對(duì)于沒有連接值的記錄其對(duì)應(yīng)的Project表中的列顯示為空值。在不同的數(shù)據(jù)庫產(chǎn)品中,LEFTOUTERJOIN的實(shí)現(xiàn)可能會(huì)有所不同。例如,Oracle中在需要顯示所有記錄的表之后使用一個(gè)加號(hào)來實(shí)現(xiàn),如上例在Oracle中可以這樣編SELECTname,id,pnumber,pmgridFROMEmployee,ProjectONpno(+)=T-SQL“*”號(hào)來實(shí)現(xiàn),如上例應(yīng)該這SELECTname,id,pnumber,pmgridFROMEmployee,ProjectWHEREpno*=RIGHTOUTER表包含的所有記錄。如SQL語句:SELECTname,id,pnumber,FROMEmployeeRIGHTOUTERJOINProjectONpno=pnumberProjectEmployee表中的記錄。返剛RIGHTOUTERJOIN告訴系統(tǒng),無論P(yáng)roject表中的記錄是否有一個(gè)可以與Employee表中記錄連接的值,都將在結(jié)果中包含Project表中的所有記錄,對(duì)于沒有連接值的記錄其對(duì)應(yīng)的Employee表中的列顯示為空值。在不同的數(shù)據(jù)庫產(chǎn)品中,RIGHTOUTERJOIN的實(shí)現(xiàn)可能會(huì)有所不同。例如,上例在Oracle中可以這樣編寫:SELECTname,id,pnumber,pmgridFROMEmployee,ProjectONpno=SELECTname,id,pnumber,pmgridFROMEmployee,ProjectWHEREpno=*FULLOUTER如果您希望在連接結(jié)果中列出連接的兩個(gè)表中包含的所有記錄,則可以使用SQLFULLOUTERJOIN關(guān)鍵字。FULLOUTERJOINLEFTOUTERJOIN與RIGHTOUTERJOIN的結(jié)果。EmployeeProjectFULLOUTERSELECTFROMEmployeeFULLOUTERJOINProjectONpno=pnumberLEFTOUTERJOIN24RIGHTOUTERJOIN23FULLOUTERJOIN32行??梢?,查詢結(jié)果在包含可以EmployeeProject表中沒有對(duì)應(yīng)值的記錄,也將ProjectEmployeeLEFTOUTERJOIN與RIGHTOUTERJOIN的結(jié)合。在SQL2中連接表是不可更新的。也就是說,基于連接表形成的視圖不能使用DELETE、INSERT、UPDATE語句進(jìn)行操作。但是,SQL3中基于連接表形成的視圖是FULLOUTERJOIN形成的視圖,Employee9列,Project表有7列,INSERT操作有三種可能的情況:97列都是空值,INSERT79Employee表中。INSERT添加的新記錄就添加在Employee表中;97Project表中。INSERTDELETEUPDATE操作,也有上述的一些可能情況,具體的使用請(qǐng)參看視WHEREEmployee表與Project表進(jìn)行RIGHTOUTERJOIN,同時(shí)加上限制條件,希望工作人員的工資高于3000.00元,可以這樣使用SQL語句:SELECTname,id,pnumber,FROMEmployeeRIGHTOUTERJOINProjectONpno=pnumberANDsalary>IHTOUTERJOIN符合條件的工作人員的值將顯示為空值。如果單獨(dú)使用條件進(jìn)行普通連接,而不是外部連接:SELECTname,id,pnumber,pmgridFROMEmployeeJOINProjectONpno=WHEREsalary>SELECTname,id,pnumber,pmgridFROMEmployee,ProjectWHEREpno=pnumberANDsalary> 語句的結(jié)果可以看作是一個(gè)集合,這樣就可以使用集合運(yùn)算符對(duì)UNION將多個(gè)查詢的結(jié)果組合到一個(gè)查詢結(jié)果中。默認(rèn)的情況下,UNION將刪MINUS返回在一個(gè)查詢結(jié)果中存在,而不在另一個(gè)查詢結(jié)果中存在的行,即兩UNONUNOIN運(yùn)算是集合運(yùn)算中應(yīng)用的最多的,得到了廣泛的支持。UNION運(yùn)算可以從多個(gè)表中組合數(shù)據(jù)進(jìn)行顯示,但是與連接不同,UNION不是在FROM子句中添加多個(gè)表并指定連接條件實(shí)現(xiàn),而是通過將多個(gè)查詢的結(jié)果結(jié)合到一起實(shí)現(xiàn)的。使用UNIONSELECTFROMtable_list/view_list[WHEREconditions]UNIONSELECTFROMtable_list/view_list[WHEREconditions]這樣使用UNION:SELECTid,name,cityFROMEmployeeWHEREcityIN(’杭州’,’廈門’)SELECTpnumber,accepter,cityFROMPaccepterWHEREcityIN(’杭州’,’廈門由于兩個(gè)查詢結(jié)果都包含三個(gè)列,而且對(duì)應(yīng)列的數(shù)據(jù)類型相同,id與pumber都為整數(shù)類型,nameacceptercity也都是字符串類型。因此,對(duì)這兩個(gè)查詢結(jié)果進(jìn)行UNION運(yùn)算是可以的。運(yùn)算結(jié)果為: ————從查詢結(jié)果可以看出,顯示時(shí)列的名稱用的是第一個(gè)查詢列出的列的名稱。同時(shí),EploeeacceperSELET列表中的列按照從左到右的順序自動(dòng)進(jìn)UNION運(yùn)算符的位置無關(guān)。UNIONSELECTid,nameFROMEmployeeWHEREcityIN(’杭州’,’廈門’)SELECTpnumber,accepter,cityFROMPaccepterWHEREcityIN(’杭州’,’廈門SELECTid,birthday,cityFROMEmployeeWHEREcityIN(’杭州’,’廈門’)SELECTpnumber,pmgrid,cityFROMPaccepterWHEREcityIN(’杭州’,’廈門brhdypgrd是屬子數(shù)據(jù)類型的,二者不能兼容,因此產(chǎn)生了錯(cuò)誤。在使用集合運(yùn)算符時(shí),一定要注意列的數(shù)目相等,且對(duì)應(yīng)列相互兼容這兩個(gè)條件。而下面的查詢雖然符合條件,不會(huì)產(chǎn)生錯(cuò)SELECTid,birthday,cityFROMEmployeeWHEREcityIN(’杭州’,’廈門’)SELECTpnumber,accedate,cityFROMPaccepterWHEREcityIN(’杭州’,’廈門—2001-05-2002-02-2002-04-2003-01-birthdayUNION運(yùn)ORDERBYORDERBY子句對(duì)查詢結(jié)果進(jìn)行排序,以增強(qiáng)查詢結(jié)果的可讀性。集合運(yùn)算的每個(gè)查詢都可以有自己的WHERE子句,但是整ORDERBYORDERBY子句應(yīng)該放在集合運(yùn)結(jié)果按照city列進(jìn)行排序,可以這樣使用UNION:SELECTidASnumber,name,cityFROMEmployeeWHEREcityIN(’杭州’,’廈門’)SELECTpnumber,accepter,cityFROMPaccepterWHEREcityIN(’杭州’,’廈門’)ORDERBYcityALL僅僅使用UNION時(shí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論