連接查詢

關係資料庫中最主要的查詢

連接查詢是關係資料庫中最主要的查詢,主要包括內連接、外連接和交叉連接等。通過連接運算符可以實現多個表查詢。連接是關係資料庫模型的主要特點,也是它區別於其它類型資料庫管理系統的一個標誌。在關係資料庫管理系統中,表建立時各數據之間的關係不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創建新的表,然後通過連接進行查詢。

類型形式


內連接的連接查詢結果集中僅包含滿足條件的行,內連接是SQL Server預設的連接方式,可以把 INNERJOIN簡寫成 JOIN,根據所使用的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種;交叉連接的連接查詢結果集中包含兩個表中所有行的組合;外連接的連接查詢結果集中既包含那些滿足條件的行,還包含其中某個表的全部行,有3種形式的外連接:左外連接、右外連接、全外連接。

交叉連接


交叉連接即笛卡兒乘積,是指兩個關係中所有元組的任意組合。一般情況下,交叉查詢是沒有實際意義的。
例如:如果希望得到學生表和選課表兩個關係模式的乘積,查詢語句為
SELECT*
FROM學生表 CROSS JOIN選課表

內連接


內連接是一種最常用的連接類型。內連接查詢實際上是一種任意條件的查詢。使用內連接時,如果兩個表的相關欄位滿足連接條件,就從這兩個表中提取數據並組合成新的記錄,也就是在內連接查詢中,只有滿足條件的元組才能出現在結果關係中。
例如:要查詢每個已經選課的學生的情況,查詢語句為
SELECT*
FROM學生表 INNER JOIN選課表 ON學生表。學號=選課表。學號
分類:
根據比較方式分為:
1)等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重複列。
2)不等連接:在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
3)自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重複列。

自連接


如果在一個連接查詢中,涉及到的兩個表都是同一個表,這種查詢就稱為自連接查詢。同一張表在 FROM字句中多次出現,為了區別該表的每一次出現,需要為表定義一個別名。自連接是一種特殊的內連接,它是指相互連接的表在物理上為同一張表,但可以在邏輯上分為兩張表。
例如:要求檢索出學號為 20210的學生的同班同學的信息,查詢語句為
SELECT學生表.*
FROM學生表 JOIN學生表 AS學生表 1ON學生表。班級=學生表1.班級
WHERE學生表 1.學號= '20210'

外連接


內連接的查詢結果都是滿足連接條件的元組。但有時我們也希望輸出那些不滿足連接條件的元組信息。比如,我們想知道每個學生的選課情況,包括已經選課的學生(這部分學生的學號在學生表中有,在選課表中也有,是滿足連接條件的),也包括沒有選課的學生(這部分學生的學號在學生表中有,但在選課表中沒有,不滿足連接條件),這時就需要使用外連接。外連接是只限制一張表中的數據必須滿足連接條件,而另一張表中的數據可以不滿足連接條件的連接方式。3種外連接:
1)左外連接( LEFTOUTER JOIN)
如果在連接查詢中,連接管子左端的表中所有的元組都列出來,並且能在右端的表中找到匹配的元組,那麼連接成功。如果在右端的表中,沒能找到匹配的元組,那麼對應的元組是空值( NULL)。這時,查詢語句使用關鍵字 LEFT OUTERJOIN,也就是說,左外連接的含義是限制連接關鍵字右端的表中的數據必須滿足連接條件,而不關左端的表中的數據是否滿足連接條件,均輸出左端表中的內容。
例如:要查詢所有學生的選課情況,包括已經選課的和還沒有選課的學生,查詢語句為
SELECT學生表。學號,姓名,班級,課程號,成績
FROM學生表 LEFT OUTER JOIN選課表 ON學生表。學號=選課表。學號
左外連接查詢中左端表中的所有元組的信息都得到了保留。
2)右外連接( RIGHTOUTERJOIN)
右外連接與左外連接類似,只是右端表中的所有元組都列出,限制左端表的數據必須滿足連接條件,而不管右端表中的數據是否滿足連接條件,均輸出表中的內容。
例如:同上例內容,查詢語句為
SELECT學生表。學號,姓名,班級,課程號,成績
FROM學生表 RIGHTOUTERJOIN選課表 ON學生表。學號=選課表。學號
右外連接查詢中右端表中的所有元組的信息都得到了保留。
3)全外連接( FULL OUTER JOIN)
全外連接查詢的特點是左、右兩端表中的元組都輸出,如果沒能找到匹配的元組,就使用 NULL來代替。
例如:同左外連接例子內容,查詢語句為
SELECT學生表。學號,姓名,班級,課程號,成績
FROM學生表 FULL OUTER JOIN選課表 ON學生表。學號=選課表。學號
全外連接查詢中所有表中的元組信息都得到了保留。

應用示例


IT168 技術】以MySql為例。在MySQL資料庫中建立兩張數據表,並分別插入一些數據。
<
腳本如下:
drop table table1;
CREATE TABLE `andrew`.`table1`
(
`name` VARCHAR(32) NOT NULL,
`city` VARCHAR(32) NOT NULL
)
ENGINE = MyISAM;
insert into TABLE1(name, city) values ('Person A', 'BJ');
insert into TABLE1(name, city) values ('Person B', 'BJ');
insert into TABLE1(name, city) values ('Person C', 'SH');
insert into TABLE1(name, city) values ('Person D', 'SZ');
drop table table2;
CREATE TABLE `andrew`.`table2`
(
`name` VARCHAR(32) NOT NULL,
`city` VARCHAR(32) NOT NULL
)
ENGINE = MyISAM;
insert into TABLE2(name, city) values ('Person W', 'BJ');
insert into TABLE2(name, city) values ('Person X', 'SH');
insert into TABLE2(name, city) values ('Person Y', 'SH');
insert into TABLE2(name, city) values ('Person Z', 'NJ');
commit;
1. 外連接 – 左連接結果
table1居左,故謂之左連接。這種情況下,以table1為主,即table1中的所有記錄均會被列出。有一下三種情況:
a. 對於table1中的每一條記錄對應的城市如果在table2中也恰好存在而且剛好只有一條,那麼就會在
返回的結果中形成一條新的記錄。如上面Person A和Person B對應的情況。
b. 對於table1中的每一條記錄對應的城市如果在table2中也恰好存在而且有N條,那麼就會在返回的結果中形成N條新的記錄。如上面的Person C對應的情況。
c. 對於table1中的每一條記錄對應的城市如果在table2中不存在,那麼就會在返回的結果中形成一條
條新的記錄,且該記錄的右邊全部NULL。如上面的Person D對應的情況。
不符合上面三條規則的記錄不會被列出。
2. 外連接 – 右連接結果
table2居右,故謂之右連接。這種情況下,以table2為主,即table2中的所有記錄均會被列出。有一下三種情況:
a. 對於table2中的每一條記錄對應的城市如果在table1中也恰好存在而且剛好只有一條,那麼就會在
返回的結果中形成一條新的記錄。如上面Person X和Person Y對應的情況。
b. 對於table2中的每一條記錄對應的城市如果在table1中也恰好存在而且有N條,那麼就會在返回的結果中形成N條新的記錄。如上面的Person W對應的情況。
c. 對於table2中的每一條記錄對應的城市如果在table1中不存在,那麼就會在返回的結果中形成一條
條新的記錄,且該記錄的左邊全部NULL。如上面的Person Z對應的情況。
不符合上面三條規則的記錄不會被列出。
3. 內連接
內連接的數據記錄中,不會存在欄位為NULL的情況。可以簡單地認為,內鏈接的結果就是在左連接或者右連接的結果中剔除存在欄位為NULL的記錄后所得到的結果。甚至可以認為,如果兩個表中僅分別剩下內連接運算后所得的數據記錄,如table1中只有Person A、Person B和Person C,table2中只有Person W、Person X和Person Y,那麼這兩個表的之間的左連接和右連接的返回的結果是一樣的。
注意:select * from table1 a inner join table2 b on a.city = b.city 和select * from table1 a join table2 b on a.city = b.city 的效果是一樣的,即如果join的左邊沒有諸如left、right或者inner這樣的關鍵字時,預設的是內連接。另,MySQL不支持full join。