mysql多表連線查詢舉例 mysql

2021-10-17 17:02:37 字數 3885 閱讀 4190

join是關係型資料庫系統的重要操作之一,sql server中包含的常用join:內聯接、外聯接和交叉聯接等1.1.1 摘要 join是關係型資料庫系統的重要操作之一,sql server中包含的常用join:內聯接、外聯接和交叉聯...

實際的專案,存在多張表的關聯關係。不可能在一張表裡面就能檢索出所有資料。如果沒有表連線的話,那麼我們就需要非常多的操作。比如需要從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 ;

mysql多表連線查詢

查詢姓名 部門名 地點 select emp.ename dept.dname,dept.loc from emp,dept where emp.deptno emp.deptno 簡化select ename dname,loc,emp.deptno from emp,dept where emp...

MySQL 連線查詢(多表查詢)

mysql 連線查詢 多表查詢 連線就是指兩個或2個以上的表 資料來源 連線起來成為乙個資料來源 實際上,兩個表的完全的連線是這樣的乙個過程 左邊的表的每一行,跟右邊的表的每一行,兩兩互相 橫向對接 後所得到的所有資料行的結果。注意 連線之後,並非形成了乙個新的資料表,而只是一種 記憶體形態 fro...

mysql多表連線查詢過程 mysql多表連線查詢

二 內連線 join 或 inner join sql語句 select from student inner join course on student.id course.id 執行結果 inner join 是比較運算子,只返回符合條件的行。此時相當於 select from student...