1. 程式人生 > >多表連接查詢

多表連接查詢

邊表 分享 行數據 外鍵 學生表 過程 所有 right 維護

一 概述

1 背景

理論上將全部數據放到同一張表中很難實現,實際上即使實現了,表也很龐大,很冗雜,不便於查詢與維護,因此將不同的數據存放到不同的表中,需要時連接各表進行查詢。

2 執行過程

兩張表進行連接查詢時,將其中一張表中的每一行數據與另外一張表的全部數據進行對比,如果滿足給定的條件,則將這兩行數據合並為一行,否則舍棄,繼續對比剩余行。

3 笛卡爾現象

如果表連接時未設置連接條件,那麽返回的查詢結果數目是兩個表行數的乘積,這種現象被叫做笛卡爾現象。

二 表連接查詢的幾種方式

1.內連接

兩張表進行連接查詢,如果只顯示匹配數據,那麽采用內連接的方式。
格式:

select t1.columnName01,t2.columnName02 from tbName01 t1(inner)join tbName02 t2 on 連接條件;

為了指明字段所屬的表,為每一張參與連接的表指定別名,通過別名調用其中的字段。

2.外連接

外連接將連接指向的一張表中的數據全部返回,另一種表對應字段無匹配數據時用null填充。
格式:

select t1.columnName01,t2.columnName02 from tbName01 t1 right/left (outer) join tbName02 t2 on 連接條件;

在外連接中使用left,左邊表的數據被全部取出;使用right,右邊表的數據被全部取出。

三 n>=3張表的連接查詢

一張表A與多張表連接查詢,表A與其他表分別進行連接查詢,最終的結果是各個獨立連接查詢結果中相同A表字段數據的組合,

即將某一個連接查詢結果中某一行A表全部字段取出,如果其他連接查詢結果都具有該A字段,則所有具有該字段的行合並為一行。

下面以多對多關聯關系進行演示。

學生表tb_student:

技術分享

課程表tb_course:

技術分享

中間表tb_mid(采用聯合主鍵,每個主鍵字段又是一個外鍵字段,分別指向對應的學生表或者課程表的主鍵):

技術分享

任務:查詢學生“李四”所選的全部課程。

分析:學生表與課程表之間沒有直接關系,而學生表與中間表、課程表與中間表都有關系,因此采用中間表作為主表,分別與學生表、課程表進行連接查詢。

中間表與學生表連接查詢,將查詢結果記作A表:

select s.id,s.name,m.course_id,m.student_id from tb_student s join tb_mid m on s.id=m.student_id;

技術分享

中間表與課程表連接查詢,將查詢結果記作B表:

select c.id,c.name,m.course_id,m.student_id from tb_course c join tb_mid m on c.id =m.course_id;

技術分享

從A表中的某一行取出主表(tb_mid)的全部數據,與B表的所有行進行對比,如果主表對應字段值相同,則合並為一行,以此循環,就形成了3張表連接查詢的結果:

技術分享

以上就是如下3張表連接查詢的執行過程:

select s.id sid,s.name sname,c.id cid ,c.name cname,m.student_id,m.course_id 
     from 
       tb_mid m join tb_student s on m.student_id =s.id 
                join tb_course c on m.course_id=c.id;

在3張表連接查詢結果中添加一個過濾條件“where s.name=‘李四‘”就獲得了最終結果。

多表連接查詢