連接是兩元運算,可以對兩個或多個表進行查詢,結果通常是含有參加連接運算的兩個表或多個表的指定列的表。
在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.
小弟第一次寫博客,經驗也不足,有什么錯誤請大家多多包涵!