內連線和外連線的區別

2021-08-22 19:36:16 字數 3408 閱讀 5261

假設乙個資料庫中有兩張表,一張是學生表studentinfo,一張是班級表classinfo,兩張表之間用classid欄位進行關聯。

如果用內連線(inner join on),正常的寫法是這樣的:

select studentinfo.*,classinfo.* from studentinfo inner join classinfo on studentinfo.classid=classinfo.classid
用這種寫法不會出現笛卡爾積,但是內連線是允許省略連線條件的,也就是可以省略掉on後面的內容,所以如果寫成這樣:

select studentinfo.*,classinfo.* from studentinfo,classinfo
也是可以通過編譯的,但是這樣一來就產生了乙個笛卡爾積。但是因為怕產生笛卡爾積而拒絕使用內鏈結是不正確的,只要不省略掉連線條件,是不會產生全部的笛卡爾積,會產生過濾後的笛卡爾積。

笛卡爾積:

假設集合a=,集合b=,則兩個集合的笛卡爾積為。可以擴充套件到多個集合的情況。類似的例子有,如果a表示某學校學生的集合,b表示該學校所有課程的集合,則a與b的笛卡爾積表示所有可能的選擇情況。

外連線(outer join):外連不但返回符合連線和查詢條件的資料行,還返回不符合條件的一些行。外連線分三類:左外連線(left outer join)、右外連線(right outer join)和全外連線(full outer join)。outer可省略

三者的共同點是都返回符合連線條件和查詢條件(即:內連線)的資料行。不同點如下:

左外連線還返回左表中不符合連線條件單符合查詢條件的資料行。

右外連線還返回右表中不符合連線條件單符合查詢條件的資料行。

全外連線還返回左表中不符合連線條件單符合查詢條件的資料行,並且還返回右表中不符合連線條件單符合查詢條件的資料行。全外連線實際是上左外連線和右外連線的數學合集(去掉重複),即「全外 = 左外 union 右外」。

說明:左表就是在「(left outer join)」關鍵字左邊的表。右表當然就是右邊的了。在三種型別的外連線中,outer 關鍵字是可省略的。

總結:內連線的特性是只顯示符合連線條件的記錄,以剛才的語句為例,查詢結果只顯示學生表和班級表中classid相等的記錄。外連線必然會返回其中一張表的全部資料,哪怕不匹配。具體採用內連線還是外連線要看具體問題的需要。舉例來說,如果有條學生記錄的classid欄位為空,那麼用內鏈結將不會顯示這條學生記錄,因為在班級表裡面是找不到對應的classid的。

所以如果要求只顯示已有分班的學生記錄,那麼就應該用內連線查詢;如果要求查詢所有學生記錄,那麼就應該採用外連線查詢。

交叉連線(cross join):有兩種,顯式的和隱式的,不帶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;

語句1和語句2的結果是相同的

聯合連線(union join):這是一種很少見的連線方式。oracle、mysql均不支援,其作用是:找出全外連線和內連線之間差異的所有行。這在資料分析中排錯中比較常用。也可以利用資料庫的集合操作來實現此功能。

sql查詢的基本原理:兩種情況介紹。

第一、單錶查詢:根據where條件過濾表中的記錄,形成中間表(這個中間表對使用者是不可見的);然後根據select的選擇列選擇相應的列進行返回最終結果。

第二、兩表連線查詢:對兩表求積(笛卡爾積)並用on條件和連線連線型別進行過濾形成中間表;然後根據where條件過濾中間表的記錄,並根據select指定的列返回查詢結果。

第三、多表連線查詢:先對第乙個和第二個表按照兩表連線做查詢,然後用查詢結果和第三個表做連線查詢,以此類推,直到所有的表都連線上為止,最終形成乙個中間的結果表,然後根據where條件過濾中間表的記錄,並根據select指定的列返回查詢結果。

理解sql查詢的過程是進行sql優化的理論依據。

on後面的條件(on條件)和where條件的區別:

on條件:是過濾兩個鏈結表笛卡爾積形成中間表的約束條件。

where條件:在有on條件的select語句中是過濾中間表的約束條件。在沒有on的單錶查詢中,是限制物理表或者中間查詢結果返回記錄的約束。在兩表或多表連線中是限制連線形成最終中間表的返回結果的約束。

從這裡可以看出,將where條件移入on後面是不恰當的。推薦的做法是:

on只進行連線操作,where只過濾中間表的記錄

總結

連線查詢是sql查詢的核心,連線查詢的連線型別選擇依據實際需求。如果選擇不當,非但不能提高查詢效率,反而會帶來一些邏輯錯誤或者效能低下。下面總結一下兩表連線查詢選擇方式的依據:

1、 查兩表關聯列相等的資料用內連線。

2、 col_l是col_r的子集時用右外連線。

3、 col_r是col_l的子集時用左外連線。

4、 col_r和col_l彼此有交集但彼此互不為子集時候用全外。

5、 求差操作的時候用聯合查詢。

多個表查詢的時候,這些不同的連線型別可以寫到一塊。例如:

select t1.c1,t2.cx,t3.cy

from tab1 t1

inner join tab2 t2 on (t1.c1=t2.c2)

inner join tab3 t3 on (t1.c1=t2.c3)

left outer join tab4 on(t2.c2=t3.c3);

where t1.x >t3.y;

上面這個sql查詢是多表連線的乙個示範。

內連線和外連線的區別

在之前,我對mssql中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下sql的書本,現在的思路應該是很清楚了,現在把自己的理解 發出來給大家溫習下。希望和我一樣對sql的連線語句不太理解的朋友能夠有所幫助。發這麼菜的教程,各位大大們別笑話偶了,呵 d 有兩個表a和表b。表a結構如下 ...

內連線和外連線區別

內連線和外連線區別 在之前,我對mssql中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下sql的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對sql的連線語句不太理解的朋友能夠有所幫助。發這麼菜的教程,各位大大們別笑話偶了,呵 d 有兩個表a和表...

內連線和外連線區別

在之前,我對mssql中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下sql的書本,現在的思路應該是很清楚了,現在把自己的理解發 出來給大家溫習下。希望和我一樣對sql的連線語句不太理解的朋友能夠有所幫助。發這麼菜的教程,各位大大們別笑話偶了,呵 d 有兩個表a和表b。表a結構如下 ...