數據庫多表鏈接查詢的實現方式

數據庫多表鏈接查詢的實現方式

  鏈接查詢是關係數據庫中最主要的查詢,主要包括自鏈接內鏈接外鏈接交叉鏈接。經過鏈接運算符能夠實現多個表查詢。鏈接是關係數據庫模型的主要特色,也是它區別於其它類型數據庫管理系統的一個標誌。 在關係數據庫管理系統中,表創建時各數據之間的關係沒必要肯定,常把一個實體的全部信息存放在一個表中。當檢索數據時,經過鏈接操做查詢出存放在多個表中的不一樣實體的信息。鏈接操做給用戶帶來很大的靈活性,他們能夠在任什麼時候候增長新的數據類型。爲不一樣實體建立新的表,而後經過鏈接進行查詢。

  內鏈接的鏈接查詢結果集中僅包含知足條件的行,內鏈接是SQL Server缺省的鏈接方式,能夠把INNERJOIN簡寫成JOIN,根據所使用的比較方式不一樣,內鏈接又分爲等值鏈接、天然鏈接和不等鏈接三種;交叉鏈接的鏈接查詢結果集中包含兩個表中全部行的組合;外鏈接的鏈接查詢結果集中既包含那些知足條件的行,還包含其中某個表的所有行,有3種形式的外鏈接:左外鏈接、右外鏈接、全外鏈接。

1、交叉鏈接

  交叉鏈接即笛卡兒乘積,是指兩個關係中全部元組的任意組合。通常狀況下,交叉查詢是沒有實際意義的。

    例如:若是但願獲得學生表和選課表兩個關係模式的乘積,查詢語句爲

      SELECT *

      FROM學生表CROSS JOIN選課表

2、內鏈接

  內鏈接是一種最經常使用的鏈接類型。內鏈接查詢其實是一種任意條件的查詢。使用內鏈接時,若是兩個表的相關字段知足鏈接條件,就從這兩個表中提取數據並組合成新的記錄,也就是在內鏈接查詢中,只有知足條件的元組才能出如今結果關係中。

    例如:要查詢每一個已經選課的學生的狀況,查詢語句爲

      SELECT*

      FROM學生表INNER JOIN選課表ON學生表.學號=選課表.學號

分類:

根據比較方式分爲:

1)等值鏈接:在鏈接條件中使用等於號(=)運算符比較被鏈接列的列值,其查詢結果中列出被鏈接表中的全部列,包括其中的重複列。

2)不等鏈接:在鏈接條件使用除等於運算符之外的其它比較運算符比較被鏈接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。

3)天然鏈接:在鏈接條件中使用等於(=)運算符比較被鏈接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除鏈接表中的重複列。

 

3、自鏈接

  若是在一個鏈接查詢中,涉及到的兩個表都是同一個表,這種查詢就稱爲自鏈接查詢。同一張表在FROM字句中屢次出現,爲了區別該表的每一次出現,須要爲表定義一個別名。自鏈接是一種特殊的內鏈接,它是指相互鏈接的表在物理上爲同一張表,但能夠在邏輯上分爲兩張表。

    例如:要求檢索出學號爲20210的學生的同班同窗的信息,查詢語句爲

      SELECT學生表.*

      FROM學生表JOIN學生表AS學生表1ON學生表.班級=學生表1.班級

      WHERE學生表1.學號='20210'

 

4、外鏈接

  內鏈接的查詢結果都是知足鏈接條件的元組。但有時咱們也但願輸出那些不知足鏈接條件的元組信息。好比,咱們想知道每一個學生的選課狀況,包括已經選課的學生(這部分學生的學號在學生表中有,在選課表中也有,是知足鏈接條件的),也包括沒有選課的學生(這部分學生的學號在學生表中有,但在選課表中沒有,不知足鏈接條件),這時就須要使用外鏈接。外鏈接是隻限制一張表中的數據必須知足鏈接條件,而另外一張表中的數據能夠不知足鏈接條件的鏈接方式。

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學生表.學號=選課表.學號

全外鏈接查詢中全部表中的元組信息都獲得了保留。

 

5、應用示例

 2 以MySql爲例。在MySQL數據庫中創建兩張數據表,並分別插入一些數據。
 4 腳本以下:
 5 drop table table1;
 6 CREATE TABLE `andrew`.`table1`
 7 (
 8 `name` VARCHAR(32) NOT NULL,
 9 `city` VARCHAR(32) NOT NULL
10 )
11 ENGINE = MyISAM;
12 insert into TABLE1(name, city) values ('Person A', 'BJ');
13 insert into TABLE1(name, city) values ('Person B', 'BJ');
14 insert into TABLE1(name, city) values ('Person C', 'SH');
15 insert into TABLE1(name, city) values ('Person D', 'SZ');
16 commit;
17 drop table table2;
18 CREATE TABLE `andrew`.`table2`
19 (
20 `name` VARCHAR(32) NOT NULL,
21 `city` VARCHAR(32) NOT NULL
22 )
23 ENGINE = MyISAM;
24 insert into TABLE2(name, city) values ('Person W', 'BJ');
25 insert into TABLE2(name, city) values ('Person X', 'SH');
26 insert into TABLE2(name, city) values ('Person Y', 'SH');
27 insert into TABLE2(name, city) values ('Person Z', 'NJ');
28 commit;
29 1. 外鏈接 – 左鏈接結果
30 table1居左,故謂之左鏈接。這種狀況下,以table1爲主,即table1中的全部記錄均會被列出。有一下三種狀況:
31 a. 對於table1中的每一條記錄對應的城市若是在table2中也剛好存在並且恰好只有一條,那麼就會在
32 返回的結果中造成一條新的記錄。如上面Person A和Person B對應的狀況。
33 b. 對於table1中的每一條記錄對應的城市若是在table2中也剛好存在並且有N條,那麼就會在返回的結果中造成N條新的記錄。如上面的Person C對應的狀況。
34 c. 對於table1中的每一條記錄對應的城市若是在table2中不存在,那麼就會在返回的結果中造成一條
35 條新的記錄,且該記錄的右邊所有NULL。如上面的Person D對應的狀況。
36 不符合上面三條規則的記錄不會被列出。
37 2. 外鏈接 – 右鏈接結果
38 table2居右,故謂之右鏈接。這種狀況下,以table2爲主,即table2中的全部記錄均會被列出。有一下三種狀況:
39 a. 對於table2中的每一條記錄對應的城市若是在table1中也剛好存在並且恰好只有一條,那麼就會在
40 返回的結果中造成一條新的記錄。如上面Person X和Person Y對應的狀況。
41 b. 對於table2中的每一條記錄對應的城市若是在table1中也剛好存在並且有N條,那麼就會在返回的結果中造成N條新的記錄。如上面的Person W對應的狀況。
42 c. 對於table2中的每一條記錄對應的城市若是在table1中不存在,那麼就會在返回的結果中造成一條
43 條新的記錄,且該記錄的左邊所有NULL。如上面的Person Z對應的狀況。
44 不符合上面三條規則的記錄不會被列出。
45 3. 內鏈接
46 內鏈接的數據記錄中,不會存在字段爲NULL的狀況。能夠簡單地認爲,內連接的結果就是在左鏈接或者右鏈接的結果中剔除存在字段爲NULL的記錄後所獲得的結果。  甚至能夠認爲,若是兩個表中僅分別剩下內鏈接運算後所得的數據記錄,如table1中只有Person A、Person B和Person C,table2中只有Person W、Person X和Person Y,  那麼這兩個表的之間的左鏈接和右鏈接的返回的結果是同樣的。
47 注意: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。
相關文章
相關標籤/搜索