連接查詢

連接查詢是關係數據庫中最主要的查詢,包括等值連接查詢、自然連接查詢、非等值連接查詢、自身連接查詢、外連接查詢和複合條件連接查詢等。

一、等值與非等值連接查詢

連接查詢的WHERE子句中用來連接兩個表的條件稱爲連接條件或連接謂詞,其一般格式爲:

[<表名1>.]<列名1> <比較運算符> [<表名2>.]<列名2> ,其中比較運算符主要有:=,>,<,>=,<=,!=(或<>)等。此外,連接謂詞還可以使用下面形式[<表名1>.] <列名1> BETWEEN [<表名2>.] <列名2>  AND [<表名2>.] <列名3>。

當連接運算符爲=時,稱爲等值連接。使用其他運算符稱爲非等值連接。連接謂詞中的列名稱爲連接字段。連接條件中的各連接字段類型必須是可比的,但名字不必相同。

SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno

RDBMS執行該連接操作的一種可能過程是:

首先在表Student中找到第一個元祖,然後從頭開始掃描SC表,逐一查找與Student第一個元組的Sno相等的SC元組,找到後就將Student中的第一個元組與該元組拼接起來,形成結果表中的一個元組。SC全部查找完後,再找Student中第二個元組,然後再從頭掃描SC,逐一查找滿足連接條件的元組,找到後就將Student中的第二個元組與該元組拼接起來,形成結果表中的一個元組。重複上述操作,直到Student中的全部元組都處理完畢爲止。這就是嵌套循環算法的基本思想。

   如果在SC表Sno上建立了索引的話,就不用每次全表掃描SC表了,而是根據Sno值通過索引找到對應的SC元組。用索引查詢SC中滿足條件的元組一般會比全表掃描快。

(1)若在等值連接中把目標列中重複的屬性值去掉則爲自然連接。

(2)自身連接

二、外連接

在通常的連接操作中,只有滿足條件的元組才能作爲結果輸出。左外連接列出左邊關係中所有的元組,右外連接列出右邊關係中所有的元組。

三、複合條件連接

WHERE 子句中可以有多個連接條件,稱爲複合條件連接。

查詢選修2號課程且成績在90分以上的所有學生

SELECT Student,Sno,Sname FROM Student,SC WHERE Student.Sno = SC.Sno AND SC.Cno = '2' AND SC.Grade > 90

該查詢的一種優化(高效)的執行過程是先從SC中挑選出Cno='2'且Grade>90的元組形成一箇中間關係,再和Student中滿足連接條件的元組進行連接得到最終的結果關係。

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

四、嵌套查詢

在SQL語言中,一個SELECT-FROM-WHERE 語句稱爲一個查詢塊。將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱爲嵌套查詢。

eg:

SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno='2')

上層的查詢塊稱爲外層查詢或福查詢,下層查詢塊稱爲內層查詢或子查詢。SQL語言允許多層嵌套查詢。即一個子查詢中還可以嵌套其他子查詢。需要特別指出的是,子查詢的SELECT語句中不能使用ORDER BY 子句,ORDER BY 子句只能對最終查詢結果排序。

1、帶有IN謂詞的子查詢

在嵌套查詢中,子查詢的結果往往是一個集合,所以謂詞IN是嵌套查詢中最經常使用的謂詞。

eg:SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='張三');本例中,子查詢的查詢條件不依賴與父查詢,稱爲不相關子查詢。一種求解方法是由裏向外處理,即先執行子查詢,子查詢的結果用於建立其父查詢的查找條件。

2、帶有比較運算符的子查詢是指父查詢與子查詢之間用比較運算符進行連接。當用戶能確切知道內層查詢返回的是單值時,可以用>,<,=,>=,<=,!=或<>等比較運算符。

找出每個學生超過他所選修課程平均成績的課程號

SELECT Sno,Cno FROM SC x WHERE Grade >= (SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno)

x是表SC的別名,又稱爲元組變量,可以用來表示SC的一個元組。內層查詢是求一個學生所有選修課程平均成績的,至於是哪個學生的平均成績要看參數x.Sno的值,而該值是與父查詢相關的,因此這類查詢稱爲相關子查詢。

這個語句的一種可能的執行過程是:

1、從外層查詢中取出SC的一個元組x,將元組x的Sno值傳送給內層查詢。

2、執行內層查詢,得到值,用該值代替內層查詢,得到外層查詢

3、執行這個查詢,得到結果。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章