連接查詢,涉及兩個或兩個以上的表。這種查詢是關係數據庫中最主要的查詢。
連接查詢的兩種表示形式:
一、用連接謂詞
(1)連接謂詞“=”
在select語句的where子句中使用比較運算符對多個表進行連接。
比較運算符在我的文章“數據庫6之單表查詢”中有寫到,此處只講最常用的連接謂詞“=”
當比較運算符爲“=”的時候,也被稱爲等值連接。
注意:等值連接只要有等值的條件,不需要列的屬性相同。
屬性:數據類型、存放的數據等
---->自然連接
這是一種特殊的等值連接。它要求兩個列必須有相同的屬性,而且要把重複的列屬性去掉。而等值連接不會去掉重複的屬性列。
此連接暫時不作詳解,等以後遇到再更新。
(2)連接謂詞between…and…
當我們選擇的幾個表中有重複列(重複列:表a中有sno列,表b中也有sno列)時,一定要顯示指出該列屬於哪個表。
語法:表.列。例如:treader.ReaderID表示該列ReaderID是treader表中的,不是tlend表中的。
二、關鍵字join
有的時候我們使用連接謂詞不一定能滿足所有的需求。比如下面這個例子
我們想要通過連接s表和sc表來獲得該學生選修的課程以及成績。
如果我們採用等值連接(s.學號=sc.學號),結果將會是這樣子的:
爲了得到完整的結果,我們可以使用join關鍵字指定連接的表示方式,這樣,表的連接運算能力就有了增強。
格式:
on用於指定連接的條件,後面仍然可以加where子句。
1.[inner]join(內連接):如果表中有一個匹配就返回一行記錄,沒有匹配的就不返回。默認爲inner(內連接)
2.left[outer]join(左連接):即使右表中沒有相匹配的,也會返回左表所有的行。返回行的時候,如果B表中沒有與之匹配的值,就用null取代。
3.right[outer]join(右連接):即使左表中沒有相匹配的,也從右表中返回所有的行
結果的表中除了包括滿足連接條件的行之外,還包括右表中的所有行。
4.full[outer]join(全連接):只要其中一個表中存在匹配就會返回兩個表的所有行
除了包括滿足條件的行之外,還包括兩個表中的所有行。
注意:full outer join產生A和B的並集,但是對於沒有匹配的記錄,就會以null作爲空值
5.cross join(交叉連接):笛卡爾積。是所有內連接的基礎,返回兩個集合的笛卡爾積,最終的結果集中的數據行數就是第一個表中符合查詢條件的數據乘以第二個表中符合查詢條件的數據行數。(實際意義不太大)
三、一種特殊的連接--------------自連接
問題:如果先查詢和學號“131101”同一個系的所有學生的姓名,該怎麼操作呢?
分析:首先找到學號爲“131101”的學生所在的系,爲“計算機”。然後再通過系名“計算機”找到所有的學生的姓名。
這個時候,只有一個xs表顯然不夠用,必須找到另外一個含有系名和姓名的表與xs表連接,才能通過系名“計算機”準確無誤地找到和學號爲“131101”相同系的所有的學生的姓名。我們發現,xs表中就包括了我們需要的這兩個列,所以,我們把xs表和自身(xs表)連接起來,就產生了自連接。
概念:將一個表和它自身連接,這種連接稱爲自連接。
注意:使用自連接的時候,一定要給表指定兩個別名,並且,對所有列的引用都要用別名限定,因爲兩個表的結構一模一樣,不能區分你寫的列是哪個表裏面的。