MySQL中的多表連接查詢

多表連接查詢

導論
表連接的本質儘量減少數據冗餘。例如創建學生表,老師表,課程表,選課表比只創建一個表更能減少數據冗餘。這四張表可以通過主外鍵和引用的方式相互連接

數據庫連接的本質:只有一種連接,叫做引用的關係

數據庫的連接類型
連接(join):將一張表中的行按照某個條件(連接條件)和另一張表中的行連接起來形成一個新行的過程叫做連接

根據查詢返回的結果,連接可以分爲3大類:
內連接(inner join)
外連接(outer join)
交叉連接(cross join)

根據連接條件所使用的操作符,又可分爲:
相等連接(使用等號操作符)
不等連接(不使用等號操作符)

限定列名
在連接查詢中,一個列可能出現在多張表中。爲了避免引起歧義,通常在列名前面加上表名或表別名作爲前綴
使用表別名作爲前綴,可以使得SQL代碼較短,使用的內存更少
內連接(inner join)
只返回兩張表中所有滿足連接條件的行

如何從多表中取數據?
1.我們先確認我們需要取的數據來自於那些表
2.畫出表的結構,找出這些表的的關聯關係(例如:學生和選課通過學生ID關聯起來)
3.寫出select語句的大體結構
4.from後邊跟上查詢的數據來自哪些表(起別名相對方便)
5.where後邊跟關聯關係
6.可以對取出的數據進行進一步處理(使用and,order by , group by 等)

示例:select s.sname, t.tname, c.cname, x,xuefen ##展示s表的sname列,t表的tname列
c表的cname列,x表的xuefen列
from stu s, tea t, course c, xuanke x ##分別給stu表,tea表等起別名爲s,t等

  where s.sid=x.sid and t.tid=x.tid and c.cid=x.cid  ##s表的sid列等於x表的sid列等
                                           中間用and連接
  and s.sname=’李三’;
  多表關聯時,如果兩個表中都有的列需要指定在那個表中,如果只在一個表中可以不用指定在在那個表

主外鍵

主鍵:學生表裏的學號列就是該表的主鍵列,所謂主鍵列就是這一列的每一個值都能唯一的代表這一行的數據。主鍵列的值唯一,不能有重複,不能爲空,主鍵列一般是數字列

外鍵:選課表裏的學號列就是外鍵,外鍵列的所有數據來自於主表(學生表)對應的主鍵
外鍵的值一定來自於主鍵,外鍵一定引用主鍵

表連接的相關語法
1.使用on字句
示例:select s.sname, t.tname, c.cname, x,xuefen ##展示s表的sname列,t表的tname列c表的cname列,x表的xuefen列
from stu s ##給stu表起別名爲 s stu是主表
join xuanke x ##加入xuanke表,別名是x
on s.sid=x.sid ##on加條件,條件是s表的sid列等於x表的sid列,往下類似
join tea t
on x.tid=t.tid
join course c
on c.cid=x.cid; ##注:最後的from有stu,xuanke,tea,course四張表在這裏插入圖片描述2.using字句
兩個關聯表的列名字相同時,可以使用using字句
示例:
select s.sname, t.tname, c.cname, x,xuefen
from stu s ##stu是主表
join xuanke x
using(sid) ##因爲學生表和選課表中都有sid列,且該列是關聯列,可以使用using 字句
join tea t
using(tid)
join course c
using(cid);在這裏插入圖片描述3.使用natural join字句
NATURAL JOIN子句自動到兩張表中查找所有同名同類型的列拿來做連接列,進行相等連接
示例:
select s.sname, t.tname, c.cname, x,xuefen
from stu s
natural join xuanke x ##因爲學生表和選課表中都有sid列,且該列是關聯列,可以使用natural join字句,關聯列進行自動連接
natural join tea t ##同理

natural join course c; #同理在這裏插入圖片描述注:推薦使用經典寫法和on字句的寫法!!

外連接
1.左外連接
除了返回兩張表中所有滿足連接條件的行之外,還要返回左表中所有不滿足連接條件的行。所謂左表,就是寫在LEFT JOIN關鍵字左邊的表
左外連接特點:會將主表的所有要查詢的信息顯示出來
示例:
select s.sname,x.xuefen ##查詢s表的name列和x表的xuefe列
from stu s ##根據join可以得出來自stu表和xuanke表
left join xuanke x ##左外連接選課表,會把沒有選課的學生列出來
on s.sid=x.xid; ##條件是s表的sid列等於x表的xid列在這裏插入圖片描述由表得出:王五沒有選課,但是也把他列出來,這就是左外連接的優勢

什麼情況下會用到左外連接呢??
(1)我們查詢時主表有”所有”這個關鍵詞,例如:查詢所有學生信息以及他們的選課信息(注:學生表是主表),因爲主表有的信息外表不一定有
(2)通俗來說就是主表(左表)的主鍵列上有的信息,在右表的外鍵列上找不到時,會使用左外鏈接

2.右外連接
除了返回兩張表中所有滿足連接條件的行之外,還要返回右表中所有不滿足連接條件的行。所謂右表(外鍵存在的表),就是寫在RIGHT JOIN關鍵字右邊的表
一般沒有右外連接,因爲右表的外鍵都來自左表的主鍵,也就是右表的外鍵列的信息一般都能在左表的主鍵列上找到
示例:
select s.sname,x.sid,x.cid,x.xuefen ##查詢s表的name列和x表的sid列,cid列和xuefe列
from stu s ##根據join條件可以得出來自stu表和xuanke表
right join xuanke x ##右外連接選課表,會把已經選課的全部學生顯示出來
on s.sid=x.xid;

什麼情況下會用到右外連接呢??
(1)右表裏外鍵列有的信息在左表的主鍵列上找不到時,會使用右外鏈接

注:mysql不支持全連接,也就是不支持左右外連接

給連接查詢附加條件
1.在使用左右外連接時,可以在select字句的最後邊加上附加條件(and字句或者where字句)
示例:
select s.sname,x.xuefen ##查詢s表的name列和x表的xuefe列
from stu s ##根據join可以得出來自stu表和xuanke表
left join xuanke x ##左外連接選課表,會把沒有選課的學生列出來
on s.sid=x.xid
where s.name=’張三’; ##只查詢s表的sname列爲張三的信息 where最後執行
(and) ##and會先執行
2.在經典寫法中,也可以在select字句的最後邊加上附加條件(使用and,order by , group by 等)
示例:
select s.sname, t.tname, c.cname, x,xuefen ##展示s表的sname列,t表的tname列
c表的cname列,x表的xuefen列
from stu s, tea t, course c, xuanke x ##分別給stu表,tea表等起別名爲s,t等

where s.sid=x.sid and t.tid=x.tid and c.cid=x.cid ##s表的sid列等於x表的sid列等
and s.sname=’李三’;

交叉連接
笛卡爾積
如果連接查詢沒有寫任何連接條件,那麼一張表中的所有行可以和另一張表中的所有行進行連接,得到的結果集中的總行數就是兩張表中總行數的乘積,叫做笛卡爾積
在實際中,應該要避免產生笛卡爾積的連接,特別是對於大表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章