一、笛卡爾積:sql
笛卡爾積的元素是元組,關係A和B的笛卡爾積能夠記爲(AXB),若是A爲a目,B爲b目,那麼A和B的笛卡爾積爲(a+b)列的元組集合。spa
(1)學生表和分數表中的信息:code
學生表:blog
分數表(大概就是這個樣子):class
(2)學生表和分數表執行笛卡爾積後:sql語句
SELECT *
FROM student JOIN score
能夠看出,執行sql語句後,student表中的每一條語句分別與score表中的每一條語句鏈接。im
二、內鏈接:查詢
內鏈接又稱爲普通鏈接或天然鏈接。在說天然鏈接以前,應該先說一下鏈接的概念,鏈接是從笛卡爾積中選取屬性間知足必定條件的元組。鏈接運算又能夠分爲等值鏈接和天然鏈接。db
(1)等值鏈接:img
當條件爲「=」的鏈接爲等值鏈接,是鏈接屬性值相等的那些元組。其結果是鏈接的表的全部列,包括重複列。
仍是運用上面的學生表和分數表:
執行如下語句(隱式內鏈接):
過濾掉沒有用的元組,保留想要的有意義的元組。
SELECT *
FROM student,score
WHERE student.studentno=score.studentno
或者(顯式內鏈接):
SELECT *
FROM student INNER JOIN score ON
student.studentno=score.studentno
即:只有學生表的學號屬性和分數表的學號屬性相等的時候纔會將表中的兩個元組相連,與笛卡爾積相比,等值鏈接添加了限制條件。
(2)天然鏈接:
天然鏈接不只要求鏈接的兩個字段必須同名,還要求將結果中重複的屬性列去掉。
執行語句:
SELECT *
FROM student NATURAL JOIN score
以上天然鏈接的查詢的元組的條數與等值鏈接相同,只不過是相同的屬性(studentno)只保留了一個。
三、外鏈接
在以上的學生表和分數表的鏈接中,存在有些學生分數表中沒有對應的該學生的分數信息,一樣也有可能存在有分數而沒有該學生信息的狀況。這些找不到對應的元組進行匹配的元組稱爲懸浮元組。
若是把懸浮元組也保留在結果中,那麼這種鏈接就叫作外鏈接。
(1)左外鏈接(只保留左邊關係中的懸浮元組):
爲了使查詢結果更明顯,故意製造一個沒有分數的學生:
INSERT INTO student VALUES('111','12345566','1111-11-11','111','111','男','zhai','890')
插入後若是進行等值鏈接或天然鏈接都不會出現學號爲"111"的學生的信息。可是,若是進行左外鏈接的查詢,會出現該學生的信息,可是有關該學生的成績的相關信息爲空。
執行如下語句,進行學生表和分數表的左外鏈接:
SELECT *
FROM student LEFT OUTER JOIN score
ON student.studentno=score.studentno
(2)右外鏈接(只保留右邊關係中的懸浮元組):
建立一個學生的分數元組,只有成績而沒有與之對應的學生(學號):
INSERT INTO score VALUES('55','1234344','c8848','87','98','123')
插入後若是進行等值鏈接或天然鏈接都不會出現學號爲1234344的分數,可是若是進行右外鏈接,就會出現只有學生的分數信息,而沒有該學生的基本信息的狀況。
SELECT *
FROM student RIGHT OUTER JOIN score
ON student.studentno=score.studentno
四、內鏈接、外鏈接之間的關係:
若是用上圖來表示內鏈接與外鏈接之間的關係的話:
2:表明內鏈接
一、2:左外鏈接
二、3:右外鏈接