SQlserver表連接


連接是兩元運算,可以對兩個或多個表進行查詢,結果通常是含有參加連接運算的兩個表或多個表的指定列的表。

在T-SQL中,連接查詢有兩類:

第一類:符合SQL標准的連接謂詞表示形式;

第二類:T-SQL擴展的使用關鍵字JOIN的表示形式。

下面對這兩種連接進行講解,下面是本次實驗要用到的表:

表一:學生表(學號,姓名,專業)

表二:課程表(課程號,課程名,學分)

表三:成績表(學號,課程號,成績)

 

一、第一類:符合SQL標准的連接謂詞表示形式

1、可以在Select 語句的where子句中使用比較運算符給出連接條件對表進行連接。

如:將學生表和成績表進行連接

(1)select * from XSB,CJB where XSB.StuNum=CJB.StuNum;

(2)select XSB.*,CJB.CourseNum,CJB.Chengji from XSB,CJB where XSB.StuNum=CJB.StuNum

第一個連接為等值連接:即選取屬性列值相等的記錄,另外:連接謂詞中的比較符還可以是<、<=、=、>、>=、!=、<>(不等於)、!<、!>,當比較符為“=”時即為等值連接。

第二個連接為自然連接:即表一與表二做等值連接后,去掉重復屬性列的結果。

二、第二類:T-SQL擴展的使用關鍵字JOIN的表示形式。

用join連接方式連接要比第一類謂詞連接方式效率高。

用join關鍵字指定的連接有三種類型:內連接、外連接、交叉連接。

(1)內連接。Inner關鍵字指定連接類型,on關鍵字指定連接條件。內連接是系統默認的,故Inner可以省略。

  例1:select * from XSB inner join CJB on XSB.StuNum=CJB.StuNum;

可以看出,所有選課的學生的信息被查詢出來了,與上面等值連接結果一樣。

例2:連接多個表,查詢選課學生的學號、姓名、課程名、成績

   Select XSB.StuNum,Name,CourseName,Chengji

from XSB join CJB join KCB

on CJB.CourseNum = KCB.CourseNum 

on XSB.StuNum=CJB.StuNum

(2)外連接。用關鍵字Outer指定其類型,外連接的結果不但包含滿足連接條件的行,還包括相應表中的所有行。外連接有三種:

        I、左外連接(left outer join),結果表中除了包括滿足連接條件的行外,還包括左表中的所有行。常用。

        II、右外連接(right outer join),結果表中除了包括滿足連接條件的行外,還包括右表中的所有行。不常用。

        III、完全外連接(full outer join),結果表中除了包括滿足連接條件的行外,還包括兩個表中的所有行。不常用。

 

  I.1  左外連接例子,查詢每個學生的選課數目,由於學號為“1104”的學生沒有選課,故不能用內連接

    Select * from XSB left outer join CJB on XSB.StuNum = CJB.StuNum 

     

在上面等值連接的例子中,學號為“1104”的學生由於沒有選課,結果集中也就沒有他,在左連接中,左表的所有記錄都會保留。

這種連接是有實際價值的,如要找出每個同學的選課門數,其中既包括選了課的同學,也包括沒有選課的同學。其查詢如下:

 Select XSB.StuNum ,count(CJB.StuNum) as '選課門數'

from XSB left outer join CJB

on XSB.StuNum = CJB.StuNum 

group by XSB.StuNum ,CJB.StuNum

注意到第四個同學的選課門數為零,在這里也顯示了,而如果用內連接,第四個同學就會被忽略掉。

右外連接及完全外連接道理與此相同,在此不再詳說。

(3)交叉連接。實際上是將兩個表做笛卡爾積運算。

如:select * from XSB cross join CJB.

小弟第一次寫博客,經驗也不足,有什么錯誤請大家多多包涵!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM