成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Join和Apply用法全解

    

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),進(jìn)賢企業(yè)網(wǎng)站建設(shè),進(jìn)賢品牌網(wǎng)站建設(shè),網(wǎng)站定制,進(jìn)賢網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,進(jìn)賢網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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

一,Join子句的組成

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

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

1,根據(jù)位置,將參與Join的兩個(gè)表分為左表和右表

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

  • 左表和右表進(jìn)行Join操作,沒有先后順序,這點(diǎn)和Apply子句不同,Apply子句的左表先于右表執(zhí)行運(yùn)算;

2,連接類型

在外連接中,left,right和full關(guān)鍵字標(biāo)識(shí)Join子句的"保留表":在進(jìn)行外連接查詢時(shí),保留表中的數(shù)據(jù)全部返回,不會(huì)被on子句過濾。

3,On子句,用于都虛擬表進(jìn)行過濾

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

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

  • on left_table.column=right_table.column

  • on left_table.column=value

  • on left_table.column+xx=value

  • 不過濾:比如設(shè)置on 1=1

4,On子句決定Join的順序

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

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

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

On子句的執(zhí)行順序先于where子句,在進(jìn)行過濾時(shí),On子句無法過濾保留表,但是where子句能夠過濾保留表;

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

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

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

二,創(chuàng)建測(cè)試代碼

Join 和 Apply 用法全解 View Code

三,left join(左外連接)

1,left join算法

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

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

Join 和 Apply 用法全解

2,使用常量過濾左表

在左外連接中,左表會(huì)返回所有數(shù)據(jù),對(duì)于“and left_table.column=value”,是在第一個(gè)條件成立時(shí),對(duì)返回的結(jié)果進(jìn)行過濾,而左表數(shù)據(jù)會(huì)全部返回,當(dāng)不滿足條件時(shí),設(shè)置右表數(shù)據(jù)為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子句是對(duì)結(jié)果集進(jìn)行過濾的最后一個(gè)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子句對(duì)右表進(jìn)行過濾,一般可以轉(zhuǎn)換成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 算法是把右表作為保留表,將右表中的數(shù)據(jù)全部顯示出來,對(duì)于左表中匹配不到的數(shù)據(jù)行,將其字段值設(shè)置為NULL;

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

Join 和 Apply 用法全解

五,inner join(內(nèi)連接)

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

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

Join 和 Apply 用法全解

六,full join(全連接)

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

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

Join 和 Apply 用法全解

七,cross join(交叉連接)

算法是:cross join 是對(duì)左表和游標(biāo)進(jìn)行笛卡爾乘積,cross join沒有on子句,笛卡爾乘積是將左表中的任意一行數(shù)據(jù)和右表中的所有數(shù)據(jù)行進(jìn)行組合,cross join 將笛卡爾乘積后的結(jié)果直接顯示出來

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

Join 和 Apply 用法全解

八,自連接用于累積求和

自連接是指一個(gè)table 和自己進(jìn)行join,例如以下語句,表 dbo.ta和自身進(jìn)行inner join,計(jì)算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

在實(shí)際的產(chǎn)品環(huán)境中,經(jīng)常利用自聯(lián)結(jié)進(jìn)行累加求和的計(jì)算,例如有如下一個(gè)Table:dbo.FinanceMonth,每個(gè)月的產(chǎn)量是Quantity,計(jì)算一年內(nèi)到該月份為止的所有月份的Quantity的累積值。

Join 和 Apply 用法全解 View Code

Join 和 Apply 用法全解

使用自鏈接計(jì)算累積值

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的區(qū)別

join 子句左表和右表的計(jì)算是不分先后的,從性能上考慮,最好把小表作為左表,當(dāng)右表數(shù)據(jù)量大的時(shí)候,會(huì)減少查詢的時(shí)間消耗。apply子句的左表和右表是區(qū)分先后順序的,apply是先計(jì)算左表,后計(jì)算右表,因此apply子句不是集合操作語句。如果右表是一個(gè)表值函數(shù),apply會(huì)先取得左表中的一行記錄的值,作為參數(shù)值傳遞給表值函數(shù)進(jìn)行計(jì)算,左表中的一行記錄和“右表”進(jìn)行笛卡爾乘積做為最終結(jié)果。如果右表查詢出來的結(jié)果是空的,那么右表字段設(shè)置為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 用法全解

從查詢結(jié)果上看,跟left join是相同的,但是在性能上,outer apply 比left join要差,因?yàn)門SQL 擅長(zhǎng)集合操作,使用集合的思想編寫的代碼性能一般都很高,left join是集合操作語句,性能優(yōu)于outer apply

雖然apply性能低,但是也有其用武之地,當(dāng)需要按照順序進(jìn)行連接時(shí),apply是最好的選擇。

2,apply的兩種用法

outer apply 和cross apply的相同點(diǎn)是:

  • 先計(jì)算左表,后計(jì)算右表;

  • 對(duì)左表中的每一行記錄,右表都要“逐行”計(jì)算,類似于相關(guān)子查詢,實(shí)際上,TSQL對(duì)apply進(jìn)行優(yōu)化之后,并不是逐行,而是逐N行;

outer apply 和cross apply的不同點(diǎn)是:

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

  • cross apply:沒有保留表,對(duì)于左表中的一行記錄,如果右表中沒有匹配行,那么該行記錄不顯示在最終結(jié)果集中,類似于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語句的應(yīng)用

1,使用cross join能夠快速產(chǎn)生大量順序數(shù)字

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

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 查詢不存在于右表的數(shù)據(jù)行

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

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

 

網(wǎng)頁題目:Join和Apply用法全解
文章URL:http://jinyejixie.com/article14/pdsoge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、網(wǎng)站設(shè)計(jì)公司App設(shè)計(jì)、靜態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
万全县| 荣昌县| 房产| 上饶县| 博兴县| 仙桃市| 兴海县| 宝鸡市| 东安县| 德庆县| 普宁市| 玉山县| 沂源县| 贺兰县| 阿瓦提县| 贺兰县| 康马县| 北碚区| 太仓市| 阳高县| 岑溪市| 黑山县| 犍为县| 太和县| 龙门县| 新竹县| 祁东县| 剑河县| 达拉特旗| 通山县| 白水县| 乌拉特前旗| 斗六市| 三河市| 通化县| 汨罗市| 婺源县| 洱源县| 西乌珠穆沁旗| 甘泉县| 原阳县|