1. 程式人生 > >SQLSERVER通俗易懂的連線查詢、聯合查詢

SQLSERVER通俗易懂的連線查詢、聯合查詢

     最近有好多小夥伴對連線查詢有很多的疑問,當然包括初學者和工作幾年的老鳥大笑so,拋開那些數學公式,我打算用通俗易懂的圖文方式來對連線和聯合查詢做一些自己的見解,還有更高明的還希望各位不吝賜教

首先建立兩個表,學生班級表一個班級對應多個學生

--新建學生表
select * into Student
from 
(select 1 as id ,'張三' as name , 18 as age,1 as classId
union  select 2 as id ,'李四' as name , 19 as age,1 as classid
union  select 3 as id ,'王麻子' as name , 18 as age,2 as classid
union  select 4 as id ,'熊二' as name , 19 as age,4 as classid) as studen

--新建班級表
select * into Class
from 
(select 1 as cid ,'軟體工程一班' as className 
union select 2 as cid ,'軟體工程二班' as className 
union select 3 as cid ,'軟體工程三班' as className ) as class

這裡呢熊二是找不到班級的,軟體工程三班現在是沒有學生的,這樣做的目的就是為了區分每個查詢的區別


下面來分析各種連線查詢:

內連線:

--內連線
select * from Student inner join Class on Student.classId = Class.cid
select * from Student join Class on Student.classId = Class.cid

結論:我們可以看出Student表的“熊二”沒有班級,Class表的“軟體工程三班”在對應表裡面都沒有找到相對應資料,說以呢內連線的查詢是對於兩張表有對應資料的查詢,沒有對應得就不關我的事。

注:那麼這裡為毛把inner jion 和join拿出來做比較呢,有個小夥子面試被問道了有啥區別。。所以呢 就是這樣的區別,inner關鍵字可以去掉,join就是inner join的一個簡寫而已。。。沒什麼的

左連線:

--左連線
select * from Student left join Class on Student.classId = Class.cid


結論:左連線在例子裡可以看出,以兩個查詢表左邊的表為主表,右邊的表為輔表,簡單的說就是要儲存左邊的資料完整,右邊有沒有對應我不管,右邊沒有對應的所有列為null

右連線:

--右連線
select * from Student right join Class on Student.classId = Class.cid

結論:跟左連線相反,這裡右連線是以右表為主,左表為輔,保證右表的資料完整性。有小夥伴看出來了,這裡用了左連線和右連線查詢,結果是相同的,只是資料位置不同而已,這裡不影響結果。。so,左連線和右連線可以相互轉換查詢

全連線:

--全連線
select * from Student full join Class on Student.classId = Class.cid

結論:這裡可以看出,不管是Student表裡面沒有對應班級的“熊二”,還是Class表裡面沒有學生的“軟體工程三班”,都查詢出來了,而沒有對應得令一張表資料為null,這樣保證了兩個表的資料完整性。

交叉連線:

--交叉連線
select * from Student cross join Class  

結論:這裡查詢出來的表資料是相乘,也就是傳說中的笛卡爾積。。不管資料是否對應,左邊的表所有資料迴圈的與右邊的表中的資料去連線查詢

連線查詢呢就這麼多,下面講講聯合查詢。

聯合查詢:

--聯合查詢 union
select 1 as cid ,'軟體工程一班' as className 
union select 1 as cid ,'軟體工程一班' as className 

--聯合查詢 union all
select 1 as cid ,'軟體工程一班' as className 
union all select 1 as cid ,'軟體工程一班' as className 

結論:這裡用union 和 union all做了一個比較。聯合查詢帶all的,那就是不管有沒有資料重複,結果都顯示。

1.聯合查詢這裡要注意幾個地方就是查詢聯合的資料列轉換後一定是同類型的,比如int和decimal(18, 2),那麼轉換後都是decimal(18, 2)型別的;

2.列名取第一個查詢資料的名字

最後:查詢這玩意兒有時候就那麼回事,所以呢,你需要什麼樣的資料,保證那張表的資料完整,那麼你就怎麼玩,方法多的是還需要各位多加練習少放香蔥