天天看點

mysql 多表操作執行個體_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,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 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_Customer.FName, T_Customer.FAge,

T_Order.FId, T_Order.FNumber, 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.FPrice,o.FCustomerId,

c.FName,c.FAge

FROM T_Order o

LEFT OUTER JOIN T_Customer c

ON o.FCustomerId=c.FId

注:如果使用左外部連接配接的話,通過where語句能過濾其中不符合的資料

代碼如下:SELECT o.FNumber,o.FPrice,o.FCustomerId,

c.FName,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,o.FPrice,o.FCustomerId,

c.FName,c.FAge

FROM T_Order o

RIGHT OUTER JOIN T_Customer c

ON o.FCustomerId=c.FId

注:同左外連接配接一樣,可以使用where語句進行過濾

III、全外部連接配接(FULLOUTER JOIN):全外部連接配接是左外部連接配接和右外部連接配接的合集。也就是既包括左外部連接配接的結果集,也包括右外部連接配接的結果集。

代碼如下:SELECT o.FNumber,o.FPrice,o.FCustomerId,

c.FName,c.FAge

FROM T_Order o

FULL OUTER JOIN T_Customer c

ON o.FCustomerId=c.FId

其結果相當于:SELECT o.FNumber,o.FPrice,o.FCustomerId,

c.FName,c.FAge

FROM T_Order o

LEFT OUTER JOIN T_Customer c

ON o.FCustomerId=c.FId

UNION

SELECT o.FNumber,o.FPrice,o.FCustomerId,

c.FName,c.FAge

FROM T_Order o

RIGHT OUTER JOIN T_Customer c

ON o.FCustomerId=c.FId

=======================================================================================

多表查詢的多種sql寫法:(下面是從兩個表裡查詢,顯示表v_goods裡的所有字段,顯示admin2表裡的name字段作為添加人,顯示表admin2表的name字段作為操作人) 多個表的查詢都可按照下面三個例句進行編寫sqlSELECT 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.*,a.name aname,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 ;