91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Join 和 Apply 用法全解

發布時間:2020-06-08 12:37:41 來源:網絡 閱讀:385 作者:胡壯壯 欄目:網絡安全

    

關系型數據庫系統中,為了滿足第三范式(3NF),需要將滿足“傳遞依賴”的表分離成單獨的表,通過Join 子句將相關表進行連接,Join子句共有三種類型:外連接,內連接,交叉連接;外連接分為:left join、right join、full join;內鏈接是:inner join,交叉連接是:cross join。

一,Join子句的組成

Join子句由連接表,連接類型和On子句組成,偽代碼如下:

from Left_Table
[inner|left|right|full] join Right_Table
    [on condition]

1,根據位置,將參與Join的兩個表分為左表和右表

  • 在Join子句中,左表和右表進行笛卡爾集合運算,左表中的任意一行都和右表中的所有行進行“組合”,生成虛擬表(Virtual Table),虛擬表的數據行總數Rows(VT)=Rows(left_table)*Rows(right_table);

  • 左表和右表進行Join操作,沒有先后順序,這點和Apply子句不同,Apply子句的左表先于右表執行運算;

2,連接類型

在外連接中,left,right和full關鍵字標識Join子句的"保留表":在進行外連接查詢時,保留表中的數據全部返回,不會被on子句過濾。

3,On子句,用于都虛擬表進行過濾

在on子句表達式中,常用的運算符是相等(=),也可以使用不等(>,<>),like等運算符,返回的結果是布爾值;

on子句表達式的操作數,可以是表列(Column),常量,表達式,例如;

  • on left_table.column=right_table.column

  • on left_table.column=value

  • on left_table.column+xx=value

  • 不過濾:比如設置on 1=1

4,On子句決定Join的順序

如果一個查詢包含多個Join子句,那么On子句決定Join子句執行的順序;執行Join的順序是:tb和tc先執行連接操作,ta和tb后執行連接操作。

from taleft join tbleft join tc    on tb.column=tc.column
    on ta.column=tb.column

5,On子句過濾和Where子句過濾

On子句的執行順序先于where子句,在進行過濾時,On子句無法過濾保留表,但是where子句能夠過濾保留表;

對于inner join,由于沒有保留表,所以,在On子句和where子句中進行過濾,結果是一樣的,但是,建議明確區分where子句和on子句的職能,on子句用于過濾連接的虛擬表,where用于對最終的結果集進行過濾。

例如:在On子句中,ta.column2=value1 不會過濾左表ta,如果不滿足該條件,那么右表相應的數據列設置為NULL,left關鍵字保證左表中的所有數據行都返回;where子句(ta.column3=value2)過濾左表ta;

from taleft join tb    on ta.column1=ta.column1        and ta.column2=value1where ta.column3=value2

二,創建測試代碼

Join 和 Apply 用法全解 View Code

三,left join(左外連接)

1,left join算法

把左表作為保留表,返回左表的全部數據,對于右表中不匹配on子句條件數據行,返回NULL;

select * from dbo.ta a 
left join dbo.tb b 
  on a.a=b.ca

Join 和 Apply 用法全解

2,使用常量過濾左表

在左外連接中,左表會返回所有數據,對于“and left_table.column=value”,是在第一個條件成立時,對返回的結果進行過濾,而左表數據會全部返回,當不滿足條件時,設置右表數據為NULL;

select * from dbo.ta a 
left join dbo.tb b 
  on a.a=b.ca and a.a=1

Join 和 Apply 用法全解

3,使用where子句過濾左表

where子句是對結果集進行過濾的最后一個Filter

select * from dbo.ta a 
left join dbo.tb b 
  on a.a=b.ca 
where a.a=1

Join 和 Apply 用法全解

4,使用where子句過濾右表

如果使用where子句對右表進行過濾,一般可以轉換成inner join

select * from dbo.ta a 
left join dbo.tb b 
on a.a=b.ca 
where b.ca=1

Join 和 Apply 用法全解

四,right join(右外連接)

right join 算法是把右表作為保留表,將右表中的數據全部顯示出來,對于左表中匹配不到的數據行,將其字段值設置為NULL;

select * from dbo.ta a 
right join dbo.tb b 
on a.a=b.ca

Join 和 Apply 用法全解

五,inner join(內連接)

算法是:inner join沒有保留表,只返回滿足 on 子句條件的數據行,對于不滿足on子句條件的數據行,不返回

select * from dbo.ta a 
inner join dbo.tb b 
on a.a=b.ca

Join 和 Apply 用法全解

六,full join(全連接)

算法是:full join 把左表和右表都作為保留表,如果左表和右表中的數據行滿足On子句條件,那么顯示數據行數據,如果不匹配,則相應的字段設置為null。

select * from dbo.ta a 
full join dbo.tb b 
on a.a=b.ca

Join 和 Apply 用法全解

七,cross join(交叉連接)

算法是:cross join 是對左表和游標進行笛卡爾乘積,cross join沒有on子句,笛卡爾乘積是將左表中的任意一行數據和右表中的所有數據行進行組合,cross join 將笛卡爾乘積后的結果直接顯示出來

select * from dbo.ta a 
cross join dbo.tb b

Join 和 Apply 用法全解

八,自連接用于累積求和

自連接是指一個table 和自己進行join,例如以下語句,表 dbo.ta和自身進行inner join,計算b字段的累積和。

select t1.a,sum(t2.b) as b 
from dbo.ta t1 
inner join dbo.ta as t2 
on t1.a>=t2.a 
group by t1.a

在實際的產品環境中,經常利用自聯結進行累加求和的計算,例如有如下一個Table:dbo.FinanceMonth,每個月的產量是Quantity,計算一年內到該月份為止的所有月份的Quantity的累積值。

Join 和 Apply 用法全解 View Code

Join 和 Apply 用法全解

使用自鏈接計算累積值

Join 和 Apply 用法全解

select a.MonthNum,sum(b.quantity) as TotalQuantity 
from dbo.FinanceMonth a 
inner join dbo.FinanceMonth b 
on a.MonthNum>=b.MonthNum 
group by a.MonthNum 
order by a.MonthNum

Join 和 Apply 用法全解

Join 和 Apply 用法全解

九,apply 用法

1,join和apply的區別

join 子句左表和右表的計算是不分先后的,從性能上考慮,最好把小表作為左表,當右表數據量大的時候,會減少查詢的時間消耗。apply子句的左表和右表是區分先后順序的,apply是先計算左表,后計算右表,因此apply子句不是集合操作語句。如果右表是一個表值函數,apply會先取得左表中的一行記錄的值,作為參數值傳遞給表值函數進行計算,左表中的一行記錄和“右表”進行笛卡爾乘積做為最終結果。如果右表查詢出來的結果是空的,那么右表字段設置為null。

Join 和 Apply 用法全解

select * from dbo.ta a 
outer apply (select * from dbo.tb b 
where a.a=b.ca) p

Join 和 Apply 用法全解

Join 和 Apply 用法全解

從查詢結果上看,跟left join是相同的,但是在性能上,outer apply 比left join要差,因為TSQL 擅長集合操作,使用集合的思想編寫的代碼性能一般都很高,left join是集合操作語句,性能優于outer apply

雖然apply性能低,但是也有其用武之地,當需要按照順序進行連接時,apply是最好的選擇。

2,apply的兩種用法

outer apply 和cross apply的相同點是:

  • 先計算左表,后計算右表;

  • 對左表中的每一行記錄,右表都要“逐行”計算,類似于相關子查詢,實際上,TSQL對apply進行優化之后,并不是逐行,而是逐N行;

outer apply 和cross apply的不同點是:

  • outer apply:將左表作為保留表,如果右表沒有匹配行,那么右表中的字段會設置為null,類似于left join。

  • cross apply:沒有保留表,對于左表中的一行記錄,如果右表中沒有匹配行,那么該行記錄不顯示在最終結果集中,類似于inner join。

Join 和 Apply 用法全解

select * from dbo.ta a 
cross apply (select * from dbo.tb b 
where a.a=b.ca) p

Join 和 Apply 用法全解

Join 和 Apply 用法全解

十,join語句的應用

1,使用cross join能夠快速產生大量順序數字

cross join的結果集中數據行的數量是:左表數據行數和右表數據行數的乘積,由于每個table都有10個數字(從0到9),4個table進行cross join能夠快速產生10的4次方,即10000個順序數字。

Join 和 Apply 用法全解

;with num as ( 
select n 
from(values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as p(n) 
) 
select a.n+b.n*10+c.n*100+d.n*1000 as n 
--into dbo.num from num across join num b 
cross join num c 
cross join num d 
order by n

Join 和 Apply 用法全解

2,使用left join 查詢不存在于右表的數據行

如果左表中的數據不存于右表,那么右表的字段是null,通過在 where 子句中設置filter,能夠查詢出存在于左表,但是不存在于右表的數據行

select * from dbo.ta t1 
left join dbo.tb t2 
on t1.a=t2.ca 
where t2.ca is null;

 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南和县| 鸡西市| 龙门县| 莆田市| 综艺| 西乡县| 宜兰县| 潼南县| 崇仁县| 台湾省| 泰来县| 沂源县| 苍溪县| 宜君县| 阿坝| 凤城市| 冷水江市| 黔江区| 金塔县| 特克斯县| 双鸭山市| 股票| 高雄市| 府谷县| 邵阳市| 图们市| 湖口县| 体育| 雷州市| 南靖县| 南木林县| 西昌市| 富裕县| 海口市| 旬阳县| 资兴市| 白朗县| 五寨县| 定远县| 威海市| 临夏市|