mysql多表連線查詢例項講解
實際的專案,存在多張表的關聯關係。不可能在一張表裡面就能檢索出所有資料。如果沒有表連線的話,那麼我們就需要非常多的操作。比如需要從A表找出限制性的條件來從B表中檢索資料。不但需要分多表來操作,而且效率也不高。比如書中的例子:
程式碼如下:
SELECT FId FROM T_Customer WHERE FName='MIKE'
這個SQL語句返回2,也就是姓名為MIKE 的客戶的FId值為2,這樣就可以到T_Order中檢索FCustomerId等於2 的記錄:
程式碼如下:
SELECT FNumber,FPrice FROM T_Order WHERE FCustomerId=2
下面我們詳細來看看錶連線。表連線有多種不同的型別,有交叉連線(CROSS JOIN)、內連線(INNER JOIN)、外連線(OUTTER JOIN)。
(1)內連線(INNER JOIN):內連線組合兩張表,並且只獲取滿足兩表連線條件的資料。
程式碼如下:
SELECT o.FId,o.FNumber,o.FPrice,c.FId,c.FName,c .FAge FROM T_Order o JOIN T_Customer c ON o.FCustomerId= c.FId
注:在大多數資料庫系統中,INNER JOIN中的INNER是可選的,INNER JOIN 是預設的連線方式。
在使用表連線的時候可以不侷限於只連線兩張表,因為有很多情況下需要聯絡許多表。例如,T_Order表同時還需要連線T_Customer和T_OrderType兩張表才能檢索到所需要的資訊,編寫如下SQL語句即可:
程式碼如下:
SELECT o.FId,c .FAge FROM T_Order o JOIN T_Customer c ON o.FCustomerId= c.FId INNER JOIN T_OrderType ON T_Order.FTypeId= T_OrderType.FId
(2)交叉連線(CROSS JOIN):交叉連線所有涉及的表中的所有記錄都包含在結果集中。可以採用兩種方式來定義交叉連線,分別是隱式和顯式的連線。
下面看看隱式的例子:
程式碼如下:
SELECT T_Customer.FId,T_Customer.FName,T_Customer.FAge,T_Order.FId,T_Order.FNumber,T_Order.FPrice FROM T_Customer,T_Order
使用顯式的連線則需要使用CROSS JOIN,例子如下:
程式碼如下:
SELECT T_Customer.FId,T_Order.FPrice FROM T_Customer CROSS JOIN T_Order
(3)外連線(OUTTER JOIN):內部連線只獲取滿足連線條件的資料,而對於外部連線來說,主要是解決這樣的一種場景。滿足條件的資料檢索出來,這個沒有疑問,外部連線還會檢索另一部分資料,那就是將不滿足條件的資料以NULL來填充。先來看一下外連線的分類:左外部連線(LEFT OUTER JOIN)、右外部連線(RIGHT OUTER JOIN)和全外部連線(FULLOUTER JOIN)。
I、左外部連線(LEFT OUTER JOIN):前頭也說了,將不滿足條件的資料以NULL來填充。那麼具體是哪些需要以NULL來填充呢,對於左外連線來說的話,連線條件當中,如果出現滿足條件的左表的資料在右表中沒有相應匹配時,需要把相應的右表字段填充NULL值。也就是說左外部連線的主體是左表,右表來配合。
程式碼如下:
SELECT o.FNumber,o.FCustomerId,c.FAge FROM T_Order o LEFT OUTER JOIN T_Customer c ON o.FCustomerId=c.FId
注:如果使用左外部連線的話,通過where語句能過濾其中不符合的資料
程式碼如下:
SELECT o.FNumber,c.FAge FROM T_Order o LEFT OUTER JOIN T_Customer c ON o.FCustomerId=c.FId WHERE o.FPrice>=150
II、右外部連線(RIGHT OUTER JOIN):右外部連線與左外連部接相反,將會被填充NULL值的是左表的欄位。也就是說右外部連線的主體是右表,左表來配合。
程式碼如下:
SELECT o.FNumber,c.FAge FROM T_Order o RIGHT OUTER JOIN T_Customer c ON o.FCustomerId=c.FId
注:同左外連線一樣,可以使用where語句進行過濾
III、全外部連線(FULLOUTER JOIN):全外部連線是左外部連線和右外部連線的合集。也就是既包括左外部連線的結果集,也包括右外部連線的結果集。
程式碼如下:
SELECT o.FNumber,c.FAge FROM T_Order o FULL OUTER JOIN T_Customer c ON o.FCustomerId=c.FId
其結果相當於:
SELECT o.FNumber,c.FAge FROM T_Order o LEFT OUTER JOIN T_Customer c ON o.FCustomerId=c.FId UNION SELECT o.FNumber,c.FAge FROM T_Order o RIGHT OUTER JOIN T_Customer c ON o.FCustomerId=c.FId
多表查詢的多種sql寫法:(下面是從兩個表裡查詢<也可以看成從三個表裡查詢>,顯示錶v_goods裡的所有欄位,顯示admin2表裡的name欄位作為新增人,顯示錶admin2表的name欄位作為操作人) 多個表的查詢都可按照下面三個例句進行編寫sql
SELECT v.*,(SELECT a.name FROM admin2 a WHERE a.adminId=v.loadInId) AS aname,(SELECT a.name FROM admin2 a WHERE a.adminId=v.operatorId) AS uname FROM v_goods v where 1=1; SELECT v.*,a.name aname,b.name uname FROM v_goods v,admin2 a,admin2 b WHERE a.adminId=v.loadInId AND b.adminId=v.operatorId ; SELECT v.*,b.name uname FROM v_goods v LEFT JOIN admin2 a ON a.adminId=v.loadInId LEFT JOIN admin2 b ON b.adminId=v.operatorId ;