1. 程式人生 > >SQLServer之多表聯合查詢

SQLServer之多表聯合查詢

多表聯合查詢簡介

定義:連線查詢是關係型資料庫最主要的查詢,通過連線運算子可以實現多個表連線資料查詢。

分類:內連線,外連線,全外連線。

內連線

定義

內聯接使用比較運算子根據每個表的通用列中的值匹配兩個表中的行。

語法

select 表1.*,表2.* from 表1 as a [wtih(鎖)] inner join 表2 as b [wtih(鎖)] on a.值 {= | != } b.值 [條件1] [where 條件] [group by 條件] [having 條件] [order by 條件];

語法註釋

{}:大括號內的值必選一個,例如:選擇=號。

[]:索引符號的值表示是可新增也可不新增的,例如:選擇不新增[條件1]。

[條件1]:[條件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者,or a.值等於b.值。

[where 條件]:where後跟表中資料的篩選條件,例如:where a.值=1。

[group by 條件]:group by後面跟分組條件,可以跟一個或者多個分組條件,例如:group by a.值,b.值。

[having 條件]:having後邊主要是篩選group by條件分組後的結果,後面可以跟一個或者多個條件,例如:select max(a.id),min(b.name) from A as a inner join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。

[order by 條件]:order by後面跟排序條件,可以根據一個值或者多個值排序,例如:根據多個值排序,select a.* from A as a inner join B as b on a.id=b.id order by a.值 asc,b.值 desc。

示例:A表內連線B表,使用A表中的資料逐行匹配B表的中資料,匹配成功則返回,匹配失敗則不返回值,匹配成功一共返回五行資料,where條件篩選返回五行資料,group by條件篩選返回兩行資料,having條件篩選返回兩行資料,order by條件篩選3大於1,則3在第一行,1在第二行。

外連線

分類

left outer join(左外連線)和right outer join(右連線)。

左外連線

定義

從表(右表)中的資料逐條匹配主表(左表)中的資料,如果匹配,如果右表匹配一行或者多行則將右表匹配值一行或者多行追加到左表匹配行輸出到結果集,如果無匹配,NULL值追加到左表不匹配行輸出到結果集。

語法

select 表1.*,表2.* from 表1 as a [wtih(鎖)] left [outer] join 表2 as b [wtih(鎖)] on a.值 {= | != } b.值 [條件1] [where 條件] [group by 條件] [having 條件] [order by 條件];

語法註釋

{}:大括號內的值必選一個,例如:選擇=號。

[]:索引符號的值表示是可新增也可不新增的,例如:選擇不新增[條件1]。

[條件1]:[條件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者,or a.值等於b.值。

[where 條件]:where後跟表中資料的篩選條件,例如:where a.值=1。

[group by 條件]:group by後面跟分組條件,可以跟一個或者多個分組條件,例如:group by a.值,b.值。

[having 條件]:having後邊主要是篩選group by條件分組後的結果,後面可以跟一個或者多個條件,例如:select max(a.id),min(b.name) from A as a left outer join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。

[order by 條件]:order by後面跟排序條件,可以根據一個值或者多個值排序,例如:根據多個值排序,select a.* from A as a left outer join B as b on a.id=b.id order by a.值 asc,b.值 desc。

示例:A表左外連線B表,B表中資料逐行取出與A表中資料匹配,右表取出第一行資料1與A表逐行匹配,匹配到兩行,將B表資料1追加到A表資料行輸出到結果集,同理剩餘的資料3和1匹配到三行資料,共匹配到五行資料輸出,A中存在資料2與B表無匹配行,則將NULL值追加到A表資料2行輸出,匹配的結果集和不匹配的結果集共七行資料輸出到結果集。(where條件篩選後輸出七行資料,group by條件篩選後會輸出三行資料,having篩選後會輸出三行資料,order by條件篩選後則會按照資料從大到小排列),依次顯示不加篩選條件和新增所有篩選條件的結果。

右外連線

定義

從表(左表)中的資料逐條匹配主表(右表)中的資料,如果匹配,如果左表匹配一行或者多行則將左表匹配值一行或者多行追加到右表匹配行輸出到結果集,如果無匹配,NULL值追加到右表不匹配行輸出到結果集。

語法

select 表1.*,表2.* from 表1 as a [wtih(鎖)] right [outer] join 表2 as b [wtih(鎖)] on a.值 {= | != } b.值 [條件1] [where 條件] [group by 條件] [having 條件] [order by 條件];

語法註釋

{}:大括號內的值必選一個,例如:選擇=號。

[]:索引符號的值表示是可新增也可不新增的,例如:選擇不新增[條件1]。

[條件1]:[條件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者,or a.值等於b.值。

[where 條件]:where後跟表中資料的篩選條件,例如:where a.值=1。

[group by 條件]:group by後面跟分組條件,可以跟一個或者多個分組條件,例如:group by a.值,b.值。

[having 條件]:having後邊主要是篩選group by條件分組後的結果,後面可以跟一個或者多個條件,例如:select max(a.id),min(b.name) from A as a right outer join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。

[order by 條件]:order by後面跟排序條件,可以根據一個值或者多個值排序,例如:根據多個值排序,select a.* from A as a right outer join B as b on a.id=b.id order by a.值 asc,b.值 desc。

示例:A表右外連線B表,A表中資料逐行取出與B表中資料匹配,左表取出第一行資料1與B表逐行匹配,匹配到兩行,將A表資料1追加到B表資料行輸出到結果集,同理剩餘的資料1和3匹配到三行資料,共匹配到五行資料輸出,A中存在資料2與B表無匹配行,自動過濾掉並不新增輸出,B表資料全部匹配完成,不匹配的結果集為零行,匹配的結果集和不匹配的結果集共五行資料輸出到結果集。(where條件篩選後輸出五行資料,group by條件篩選後會輸出兩行資料,having篩選後會輸出兩行資料,order by條件篩選後則會按照資料從大到小排列),依次顯示不加篩選條件和新增所有篩選條件的結果。

全外連線

定義

全外連線又稱為完全外連線,該連線查詢方式返回兩個連線中所有的記錄資料。根據匹配條件,如果滿足匹配條件時,則返回匹配的一行或者多行資料;如果不滿足匹配條件時,同樣返回資料,但在相應的列中填入NULL,全外連線返回的結果集中包含了兩個完全表的所有資料。全外連線關鍵字FULL OUTER JOIN。

語法

select 表1.*,表2.* from 表1 as a [wtih(鎖)] full [outer] join 表2 as b [wtih(鎖)] on a.值 { = | != } b.值 [條件1] [where 條件] [group by 條件] [having 條件] [order by 條件];

語法註釋

{}:大括號內的值必選一個,例如:選擇=號。

[]:索引符號的值表示是可新增也可不新增的,例如:選擇不新增[條件1]。

[條件1]:[條件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者or a.值等於b.值。

[where 條件]:where後跟表中資料的篩選條件,例如:where a.值=1。

[group by 條件]:group by後面跟分組條件,可以跟一個或者多個分組條件,例如:group by a.值,b.值。

[having 條件]:having後邊主要是篩選group by條件分組後的結果,後面可以跟一個或者多個條件,例如:select max(a.id),min(b.name) from A as a full outer join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。

[order by 條件]:order by後面跟排序條件,可以根據一個值或者多個值排序,例如:根據多個值排序,select a.* from A as a full outer join B as b on a.id=b.id order by a.值 asc,b.值 desc。

示例:全外連線A表與B表,首先輸出所有符合條件的資料,A表中資料逐行取出和B表中資料逐行匹配,存在1和3的資料匹配行,匹配成功輸出5行資料,然後輸出不符合條件的行,A中存在2行不符合條件的值,B表資料全部匹配成功無不符合條件的值,返回A中不符合條件的值並將其它列值置為NULL輸出2行資料,總共輸出5加2共七行資料。