1. 程式人生 > >數據庫多表連接查詢的實現方式

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

元組 多個 rom select 選擇列 有時 提取數據 連接的查詢 eve

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

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

  內連接的連接查詢結果集中僅包含滿足條件的行,內連接是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學生表.學號=選課表.學號

全外連接查詢中所有表中的元組信息都得到了保留。

五、應用示例

 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。

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