天天看點

資料查詢:連接配接查詢

1.等值與非等值連接配接查詢

連接配接查詢的where子句中用來連接配接兩個表的條件稱為連接配接條件或連接配接謂詞

例 3.49 查詢每個學生及其選修課程的情況
SELECT Student.*,SC.*  // **Student.*,SC.* 可替換為 * 
FROM Student,SC
WHERE Student.Sno=SC.Sno;
           
資料查詢:連接配接查詢

若在等值連接配接中把目标列中重複的屬性的去掉則為自然連接配接

例 3.50 對例 3.49用自然連接配接完成
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade //手動去重
From Student,SC
WHERE Student.Sno=SC.Sno;
           
資料查詢:連接配接查詢

一條SQL語句可以同時完成選擇和查詢。這時WHRER子句是由連接配接謂詞和選擇謂詞組成的複合條件

例 3.51查詢選修2号課程且成績在90分以上的所有學生的學号和姓名
SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND SC.Cno='2' AND SC.Grade>80;
           
資料查詢:連接配接查詢

該查詢的一種優化的執行過程是,先從SC中挑選出Cno=‘2′并且Grade>90的元組其中一個中間關系在和Student中滿足連接配接條件的元組進行連接配接得到最終的結果關系

2.自身連接配接

連接配接操作不僅可以在兩個表之間進行,也可以是一個表與自己進行連接配接,稱為表的自身連接配接

例 3.52 查詢每一門課的間接先修課(即先修課的先修課)

為Course表取兩個别名,一個是First,另一個是SECOND

FIRST表(Course表)

資料查詢:連接配接查詢

SECOND表(Course表)

資料查詢:連接配接查詢
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
           
資料查詢:連接配接查詢

3.外連接配接

在通常的連接配接操作中,隻有滿足連接配接條件的元組才能作為結果輸出。如例3.49的結果表中沒有201215123和201215125兩個學生的資訊,原因在于他們沒有選課,在SC表中沒有相應的元組,導緻 Student中這些元組在連接配接時被舍棄了。

有時想以 Student表為主體列出每個學生的基本情況及其選課情況。若某個學生沒有選課,仍把 Student的懸浮元組儲存在結果關系中,而在SC表的屬性上填空值NULL,這時就需要使用外連接配接。

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
           
資料查詢:連接配接查詢

使用USING來去掉結果中的重複值

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC USING(Sno);
           

4.多表連接配接

連接配接操作除了可以是兩表連接配接、一個表與其自身連接配接外,還可以是兩個以上的表進行連接配接,後者通常稱為多表連接配接

例 3.54 查詢每個學生的學号、姓名、選修的課程名及成績
SELECT Student.Sno,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
           
資料查詢:連接配接查詢
SELECT *
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
           
資料查詢:連接配接查詢

關系資料庫管理系統在執行多表連接配接時,通常是先進行兩個表的連接配接操作,再将其連接配接結果與第三個表進行連接配接。本例的一種可能的執行方式是,先将 Student表與SC表進行連接配接,得到每個學生的學号、姓名、所選課程号和相應的成績,然後再将其與 Course表進行連接配接,得到最終結果。