1. 程式人生 > >資料庫表連線問題

資料庫表連線問題

一、交叉連線
交叉連線有兩種:顯示的和隱式的,不帶on子句,返回的是兩表的乘積,也叫笛卡爾積。
例如:下面語句1和語句2的結果是相同的。
語句1:隱式的交叉連線,沒有cross join.
select o.id,o.order_number,c.id,c.name from orders o,customers c
where o.id=1
語句2:顯式的交叉連線,使用cross join.
select o.id,o.order_number,c.id,c.name from orders o cross join customers c
where o.id=1
二、內連線
顯示的和隱式的,返回連線表中符合連線條件和查詢條件的資料行。(所謂的連線表就是資料庫在做查詢形成的中間表)
語句3:隱式內連,沒有inner join,形成的中間表為兩個表的笛卡爾積。
select

o.id,o.order_number,c.id,c.name from orders o,customers c
where c.id=o.customer_id
語句4:顯示內連,一般稱為內連線,有inner join,形成的中間表為兩個表經過on條件過濾後的笛卡爾積。
select o.id,o.order_number,c.id,c.name from orders o inner join customers c
on c.id=o.customer_id
三、外連線:外聯不但返回符合連線和查詢條件的資料行,還返回不符合條件的一些行。外連線分三類:左外連線、右外連線和全外連線。
三者的共同點是都返回符合連線條件和查詢條件(即:內連線)的資料行。不同點如下:
左外連還返回左表中不符合連線條件但符合查詢條件的資料行。
右外連還返回右表中不符合連線條件但符合查詢條件的資料行。
全外連線還返回左表中不符合連線條件但符合查詢條件的資料行,並且還返回右表中不符合連線條件但符合查詢條件的書建行。全外連線實際是上左外連線和右外連線的數學合集(去掉重複),即“全外=左外union右外”。
說明:左表就是在“left outer join”關鍵字左邊的表。右表當然就是右邊的了。在三種類型的外連線中,outer關鍵字是可省略的。

on條件和where條件的區別?
on條件:是過濾兩個連線表笛卡爾積形成中間表的約束條件。
where條件:在有on條件的select語句中是過濾中間表的約束條件。在沒有on的單表查詢中,是限制物理表或者中間查詢結果返回記錄的約束。在兩表或多表連線中是限制連線形成最終中間表的返回結果的約束。
where條件移入on後面是不恰當的。推薦的做法是:
on只進行連線操作,where只過濾中間表的記錄。