一 概述 1 背景 理論上將全部數據放到同一張表中很難實現,實際上即使實現了,表也很龐大,很冗雜,不便於查詢與維護,因此將不同的數據存放到不同的表中,需要時連接各表進行查詢。 2 執行過程 兩張表進行連接查詢時,將其中一張表中的每一行數據與另外一張表的全部數據進行對比,如果滿足給定的條件,則將這兩行 ...
一 概述
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='李四'”就獲得了最終結果。