數據庫——連接(自然連接、外連接、內連接)

1、自然連接:只考慮那些在兩個關係模式中都出現的屬性上取值相同的元組對 natural joinjoin...using

select A1,A2,...,An
from r1 natural join r2 natural join ... natural join rn
where P;
select name1, course_id
from instructor, teaches
where instructor.ID = teaches.ID;

等價於

select name1, course_id
from instructor natural join teaches;

### 但以下的一個例子卻不等價 ###

前提:已知instructor和teaches自然連接包括屬性(ID, name, dept_name, salary, course_id, sec_id)

           而course關係包含的屬性是(course_id, title, dept_name, credits)

select name,title
from instructor natural join teaches, course
where teaches.course_id = course.course_id;
-- 列出教師的名字以及他們所講授課程的名稱

不等價於

select name1,title
from instructor natural join teaches natural join course;

原因:instructor、teaches和course三者自然連接包括屬性(course_id, dept_name)

而instructor和teaches自然連接後,再讓teaches與course根據屬性course_id相同選出元組的結果,會忽略掉所有(course_id, dept_name)這樣的對,因此兩種查詢結果不同

因此,爲了發揚自然連接的優點,同時避免不必要的相等的屬性帶來的危險,引入了下面的構造形式 

select A1,A2
from r1 join r2 using (A1,A3); -- r1、r2爲表名

join...using與自然連接相似,但可以指定用哪些屬性進行匹配連接,在t1.A1 = t2.A1並且t1.A2 = t2.A2成立的前提下(t1、t2爲元組),來自r1的元組t1和來自r2的元組t2就能匹配,即使r1和r2都具有名爲A3的屬性,也不需要t1.A3 = t2.A3成立

 

on條件:允許在參與連接的關係上設置通用的謂詞,可表示任何SQL謂詞

on中謂詞的寫法與where子句謂詞類似;與using條件一樣,on條件出現在連接表達式的末尾

  • 使用帶on條件的連接表達式的查詢可以用不帶on條件的等價表達式來替換,只需把on子句中的謂詞移到where子句中即可
  • 對外連接這類連接來說,on條件的表現與where條件是不同的
  • 如果在on子句中指定連接條件,並在where子句中出現其餘的條件,這樣的SQL查詢更易讀
select *
from student join takes on student.ID = takes.ID;

 

2、外連接(outer join):保留那些在連接中丟失的元組

  • 左外連接:只保留出現在左外連接運算之前(左邊)的關係中的元組
  • 右外連接:只保留出現在右外連接運算之後(右邊)的關係中的元組
  • 全外連接:保留出現在兩個關係中的元組

左(右)側關係中不匹配右(左)側關係任何元組的元組被添上空值並加入到結果中

select *
from student natural left outer join takes;
-- -----------------------------------------
select *
from takes natural right outer join student;
-- -----------------------------------------
-- 以上兩個得到的結果是一樣的,只不過結果中屬性出現的順序不同

在外連接中,on和where的表現是不同的。原因是外連接只爲那些對相應內連接結果沒有貢獻的元組補上空值並加入結果。

select *
from student left outer join takes on student.ID = takes.ID;

不等價於

select * 
from student left outer join takes on true
where student.ID = takes.ID;

 

3、內連接(inner join):不保留未匹配元組的連接運算

join子句中沒有使用outer前綴,默認連接類型是inner join,常規連接爲內連接

select *
from student join takes using(ID);

等價於

select *
from student inner join takes using(ID);

 類似地,natural join等價於natural inner join

 

4、任意的連接形式/類型(內連接、左外連接、右外連接、全外連接)可以和任意的連接條件(自然連接natural、using條件連接或on條件連接)進行組合

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