校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > SQL Join的一些總結(jié)(實(shí)例)

SQL Join的一些總結(jié)(實(shí)例)

熱門標(biāo)簽:南京電銷外呼系統(tǒng)運(yùn)營商 溫州語音外呼系統(tǒng)代理 智能語音外呼系統(tǒng)哪個(gè)牌子好 西安青牛防封電銷卡 400電話申請(qǐng)需要開戶費(fèi)嗎 北京辦理400電話多少 重慶防封電銷機(jī)器人供應(yīng)商 山西語音外呼系統(tǒng)價(jià)格 威海智能語音外呼系統(tǒng)
1.1.1 摘要
Join是關(guān)系型數(shù)據(jù)庫系統(tǒng)的重要操作之一,SQL Server中包含的常用Join:內(nèi)聯(lián)接、外聯(lián)接和交叉聯(lián)接等。如果我們想在兩個(gè)或以上的表獲取其中從一個(gè)表中的行與另一個(gè)表中的行匹配的數(shù)據(jù),這時(shí)我們應(yīng)該考慮使用Join,因?yàn)镴oin具體聯(lián)接表或函數(shù)進(jìn)行查詢的特性

本文將通過具體例子介紹SQL中的各種常用Join的特性和使用場合:

1.1.2 正文
首先我們在tempdb中分別定義三個(gè)表College、Student和Apply,具體SQL代碼如下:
復(fù)制代碼 代碼如下:

USE tempdb

---- If database exists the same name datatable deletes it.
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'College') DROP TABLE College;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Student') DROP TABLE Student;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Apply') DROP TABLE Apply;

---- Create Database.
create table College(cName nvarchar(50), state text, enrollment int);
create table Student(sID int, sName nvarchar(50), GPA real, sizeHS int);
create table Apply(sID int, cName nvarchar(50), major nvarchar(50), decision text);


Inner join

內(nèi)聯(lián)接(Inner join)是最常用的聯(lián)接類型之一,它查詢滿足聯(lián)接謂詞的數(shù)據(jù)。

假設(shè)我們要查詢申請(qǐng)表Apply中申請(qǐng)學(xué)校的相關(guān)信息,由于Apply表中包含學(xué)校名字我們并不能預(yù)知,所以我們可以根據(jù)cName來內(nèi)聯(lián)接(Inner join)表College和Apply,從而找到Apply表中包含學(xué)校的信息。

具體SQL代碼如下:
復(fù)制代碼 代碼如下:

---- Gets college information from college table
---- bases on college name.
SELECT DISTINCT College.cName, College.enrollment
FROM College INNER JOIN
Apply ON College.cName = Apply.cName

圖1查詢結(jié)果
cName state enrollment
Stanford CA 15000
Berkeley CA 36000
MIT MA 10000
Cornell NY 21000
Harvard MA 29000
表1 College表中的數(shù)據(jù)

如上圖1所示,我們把Apply表包含的學(xué)校信息查詢出來了,由于Harvard并沒有被查詢出來,所以我們知道暫時(shí)還沒有學(xué)生申請(qǐng)Harvard。

內(nèi)聯(lián)接(Inner join)滿足交換律:“A inner join B” 和 “B inner join A” 是相等的。

Outer join
假設(shè)我們想看到所有學(xué)校信息;即使是那些沒有申請(qǐng)的學(xué)校(如:Harvard),這時(shí)我們可以使用外部聯(lián)接(Outer join)進(jìn)行查詢。由于外部聯(lián)接保存一個(gè)或兩個(gè)輸入表的所有行,即使無法找到匹配聯(lián)接謂詞的行。

具體SQL代碼如下:
復(fù)制代碼 代碼如下:

---- Gets all college information
SELECT College.cName, College.state, College.enrollment,
Apply.cName, Apply.major, Apply.decision
FROM College LEFT OUTER JOIN

圖3左聯(lián)接查詢結(jié)果

如上圖3所示:由于在Apply表中并沒有學(xué)生申請(qǐng)Harvard,但是我們通過左聯(lián)接(left outer join)把所有學(xué)校信息查詢出來了。

由于左聯(lián)接(left outer join)產(chǎn)生表College的完全集,而Apply表中匹配的則有值,而不匹配的則以NULL值取代,所以我們知道Apply表中沒有學(xué)生申請(qǐng)Harvard。

通過左聯(lián)接查詢我們可以獲取College的完全集,假設(shè)現(xiàn)在我們既要獲取College的完全集又要獲取Apply的完全集,那么我們可以考慮使用完整外部聯(lián)接(full outer join)。使用完整外部聯(lián)接,我們可以查詢所有的學(xué)校,不管它們是否匹配聯(lián)接謂詞:
復(fù)制代碼 代碼如下:

---- Gets all information from college and apply table.
SELECT College.cName, College.state, College.enrollment,
Apply.cName, Apply.major, Apply.decision
FROM College FULL OUTER JOIN
Apply ON College.cName = Apply.cName

圖3 完整外部聯(lián)接查詢結(jié)果

現(xiàn)在我們獲取了College和Apply的完全數(shù)據(jù)集,對(duì)于表中匹配的則有值,即使沒有找到匹配cName的則以NULL值取代。

下表顯示每種外部聯(lián)接(outer join)匹配時(shí)保留數(shù)據(jù)行的情況:

聯(lián)接類型

保留數(shù)據(jù)行

A left outer join B

all A rows

A right outer join B

all B rows

A full outer join B

all A and B rows


表2 外部聯(lián)接保留數(shù)據(jù)行

完整外部聯(lián)接(full outer join)滿足交換律:“A full outer join B” 和 “B full outer join A” 是相等的。

Cross join
交叉聯(lián)接(cross join)執(zhí)行兩個(gè)表的笛卡爾積(就是把表A和表B的數(shù)據(jù)進(jìn)行一個(gè)N*M的組合)。也就是說,它匹配一個(gè)表與另一個(gè)表中的每一行;我們不能通過使用ON子句在交叉聯(lián)接指定謂詞,雖然我們可以使用WHERE子句來實(shí)現(xiàn)相同的結(jié)果,這是交叉聯(lián)接基本上是作為一個(gè)內(nèi)部聯(lián)接了。

交叉聯(lián)接相對(duì)于內(nèi)部聯(lián)接使用率較低,而且兩個(gè)大表不應(yīng)該進(jìn)行交叉聯(lián)接,因?yàn)檫@將導(dǎo)致一個(gè)非常昂貴的操作和一個(gè)非常大的結(jié)果集。

具體SQL代碼如下:
復(fù)制代碼 代碼如下:

---- College Cross join Apply.
SELECT College.cName, College.state, College.enrollment,
Apply.cName, Apply.major, Apply.decision
FROM College
CROSS JOIN Apply

圖4 College表和Apply表的行數(shù)

圖5 交叉聯(lián)接

現(xiàn)在我們對(duì)College和Apply表進(jìn)行交叉聯(lián)接,而且生成數(shù)據(jù)行為College和Apply表行數(shù)的笛卡爾積即5 * 20 = 100。

Cross apply
在SQL Server 2005中提供了Cross apply使表可以和表值函數(shù)(table-valued functions TVF‘s)結(jié)果進(jìn)行join查詢。例如,現(xiàn)在我們想通過函數(shù)的結(jié)果值和表Student進(jìn)行查詢,這時(shí)我們可以使用Cross apply進(jìn)行查詢:
復(fù)制代碼 代碼如下:

---- Creates a function to get data from Apply base on sID.
CREATE FUNCTION dbo.fn_Apply(@sID int)
RETURNS @Apply TABLE (cName nvarchar(50), major nvarchar(50))
AS
BEGIN
INSERT @Apply SELECT cName, major FROM Apply where [sID] = @sID
RETURN
END

---- Student cross apply function fn_Apply.
SELECT Student.sName, Student.GPA, Student.sizeHS,
cName, major
FROM Student CROSS APPLY dbo.fn_Apply([sID])

我們也可以使用內(nèi)部聯(lián)接實(shí)現(xiàn)和Cross apply相同的查詢功能,具體SQL代碼如下:
復(fù)制代碼 代碼如下:

---- Student INNER JOIN Apply bases on sID.
SELECT Student.sName, Student.GPA, Student.sizeHS,
cName, major
FROM Student INNER JOIN [Apply]
ON Student.sID = [Apply].sID


圖6 Cross apply查詢

Outer apply
在介紹Cross apply和Outer join之后,現(xiàn)在讓我們理解Out apply也就不難了,Outer apply使表可以和表值函數(shù)(table-valued functions TVF‘s)結(jié)果進(jìn)行join查詢,找到匹配值則有值,沒有找到匹配值則以NULL表示。
復(fù)制代碼 代碼如下:

---- Student outer apply function fn_Apply.
SELECT Student.sName, Student.GPA, Student.sizeHS,
cName, major
FROM Student OUTER APPLY dbo.fn_Apply([sID])

圖7 Outer apply查詢

Inner Join和Cross apply的區(qū)別

首先我們知道Inner join是表和表的聯(lián)接查詢,而Cross apply是表和表值函數(shù)的聯(lián)接查詢,在前面Cross apply例子中,我們也可以通過Inner join實(shí)現(xiàn)相同的查詢。
復(fù)制代碼 代碼如下:

---- Student cross apply function fn_Apply.
SET STATISTICS PROFILE ON
SET STATISTICS TIME ON

SELECT Student.sName, Student.GPA, Student.sizeHS,
cName, major
FROM Student CROSS APPLY dbo.fn_Apply([sID])

SET STATISTICS PROFILE OFF
SET STATISTICS TIME OFF

---- Student INNER JOIN Apply base on sID.
SET STATISTICS PROFILE ON
SET STATISTICS TIME ON

SELECT Student.sName, Student.GPA, Student.sizeHS,
cName, major
FROM Student INNER JOIN [Apply]
ON Student.sID = [Apply].sID

SET STATISTICS PROFILE OFF
SET STATISTICS TIME OFFCross apply

查詢執(zhí)行時(shí)間:

CPU 時(shí)間= 0 毫秒,占用時(shí)間= 11 毫秒。

Inner join查詢執(zhí)行時(shí)間:

CPU 時(shí)間= 0 毫秒,占用時(shí)間= 4 毫秒。

圖8 執(zhí)行計(jì)劃

如圖8所示:Cross apply首先執(zhí)行TVF(table-valued functions),然后對(duì)表Studnet進(jìn)行全表掃描,接著通過遍歷sID查找匹配值。

Inner join對(duì)表Student和Apply進(jìn)行全表掃描,然后通過哈希匹配查找匹配的sID值。

通過以上的SQL執(zhí)行時(shí)間和執(zhí)行計(jì)劃,我們能不能說Inner join比Cross apply好呢?答案是否定的,如果表的數(shù)據(jù)量很大,那么Inner join的全表掃描耗費(fèi)時(shí)間和CPU資源就增加了(可通過數(shù)據(jù)量大的表進(jìn)行測試)。

雖然大多數(shù)采用Cross apply實(shí)現(xiàn)的查詢,可以通過Inner join實(shí)現(xiàn),但Cross apply可能產(chǎn)生更好的執(zhí)行計(jì)劃和更佳的性能,因?yàn)樗梢栽诼?lián)接執(zhí)行之前限制集合加入。

Semi-join和Anti-semi-join

Semi-join從一個(gè)表中返回的行與另一個(gè)表中數(shù)據(jù)行進(jìn)行不完全聯(lián)接查詢(查找到匹配的數(shù)據(jù)行就返回,不再繼續(xù)查找)。

Anti-semi-join從一個(gè)表中返回的行與另一個(gè)表中數(shù)據(jù)行進(jìn)行不完全聯(lián)接查詢,然后返回不匹配的數(shù)據(jù)。

不同于其他的聯(lián)接運(yùn)算,Semi-join和Anti-semi-join沒有明確的語法來實(shí)現(xiàn),但Semi-join和Anti-semi-join在SQL Server中有多種應(yīng)用場合。我們可以使用EXISTS子來實(shí)現(xiàn)Semi-join查詢,Not EXISTS來實(shí)現(xiàn)Anti-semi-join?,F(xiàn)在讓我們通過具體的例子說明吧!

假設(shè)要求我們找出Apply和Student表中sID匹配的學(xué)生信息,這和前面的Inner join查詢結(jié)果將一樣,具體SQL代碼如下:
復(fù)制代碼 代碼如下:

---- Student Semi-join Apply base on sID.
SELECT Student.sName, Student.GPA, Student.sizeHS
----[Apply].cName, [Apply].major
FROM Student
WHERE exists (
SELECT *
from [Apply]
where [Apply].sID = Student.sID
)

我們發(fā)現(xiàn)常用的EXISTS子句,原來是通過Left Semi Join實(shí)現(xiàn)的,所以說Semi-join在SQL Server中又許多使用場合。


圖9 查詢結(jié)果



圖10 執(zhí)行計(jì)劃

現(xiàn)在要求我們找出還沒有申請(qǐng)學(xué)校的學(xué)生信息,這時(shí)我們立刻反應(yīng)可以使用NOT EXISTS子句來實(shí)現(xiàn)該查詢,具體SQL代碼如下:
復(fù)制代碼 代碼如下:

---- Gets student still not apply for school.
SELECT Student.sID, Student.sName, Student.GPA, Student.sizeHS
----[Apply].cName, [Apply].major
FROM Student
WHERE NOT EXISTS (
SELECT *
FROM [Apply]
WHERE [Apply].sID = Student.sID
)

其實(shí),我們常用的NOT EXISTS子句的實(shí)現(xiàn)是通過Anti-semi-join,通過執(zhí)行計(jì)劃我們發(fā)現(xiàn)在查找匹配sID時(shí),SQL使用 Left Anti Semi Join進(jìn)行查詢。

圖11 查詢結(jié)果


圖12 執(zhí)行計(jì)劃

1.1.3 總結(jié)
本文介紹了SQL中常用了聯(lián)接查詢方式:Inner join、Outer join、Cross join和Cross apply的使用場合和特性。
您可能感興趣的文章:
  • SQL的Join使用圖解教程
  • MySQL JOIN之完全用法
  • sql join on 用法
  • sql left join 命令詳解
  • SQL中的left join right join
  • SQL中JOIN和UNION區(qū)別、用法及示例介紹

標(biāo)簽:濟(jì)寧 貸款群呼 黃山 金昌 河源 中衛(wèi) 新余 宜春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Join的一些總結(jié)(實(shí)例)》,本文關(guān)鍵詞  SQL,Join,的,一些,總結(jié),實(shí)例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Join的一些總結(jié)(實(shí)例)》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQL Join的一些總結(jié)(實(shí)例)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲欧美日韩国产综合在线| a在线欧美一区| 日韩在线a电影| 视频一区视频二区在线观看| 亚洲一区二区三区美女| 亚洲综合图片区| 亚洲午夜免费电影| 日韩高清不卡在线| 日本亚洲最大的色成网站www| 日产国产欧美视频一区精品| 另类的小说在线视频另类成人小视频在线 | 国产精品一区三区| 国产精品123| av在线不卡电影| www.一区二区| 色婷婷激情一区二区三区| 欧美亚洲另类激情小说| 欧美日韩亚州综合| 欧美一区二区三区四区在线观看| 日韩一区二区电影网| 欧美α欧美αv大片| 26uuu久久天堂性欧美| 久久久久久麻豆| 国产精品人妖ts系列视频| 亚洲色大成网站www久久九九| 一区二区三区四区在线播放 | 蜜臀精品久久久久久蜜臀| 精品一区二区三区免费| 国产成人一区二区精品非洲| eeuss鲁一区二区三区| 欧美影院一区二区三区| 日韩视频免费观看高清完整版在线观看| 日韩一区二区三区在线| 久久精品人人爽人人爽| 椎名由奈av一区二区三区| 亚洲成人一区二区在线观看| 另类成人小视频在线| 不卡在线视频中文字幕| 色婷婷综合久久久久中文| 51精品视频一区二区三区| 精品福利一区二区三区 | 三级一区在线视频先锋| 狠狠色丁香九九婷婷综合五月| 成人一区二区三区视频在线观看| 91色|porny| 日韩精品一区二区三区视频在线观看| 国产欧美一区二区精品仙草咪| 一区二区三区四区乱视频| 美日韩一区二区| 99久久99久久精品国产片果冻 | 欧美精品一区二区三区高清aⅴ | 国产女主播在线一区二区| 一区二区三区在线播| 蜜桃av噜噜一区| 成人高清在线视频| 欧美一区二区三区四区高清| 国产精品美女久久久久av爽李琼| 石原莉奈在线亚洲三区| 波多野结衣的一区二区三区| 欧美精品日日鲁夜夜添| 中文字幕乱码日本亚洲一区二区| 日韩成人一区二区| 91香蕉国产在线观看软件| 日韩欧美国产午夜精品| 亚洲精品ww久久久久久p站| 国产伦精品一区二区三区视频青涩| 色狠狠av一区二区三区| 久久综合精品国产一区二区三区| 日韩理论片网站| 久久99精品国产91久久来源| 色菇凉天天综合网| 国产欧美一区二区三区在线老狼 | 国产成人免费9x9x人网站视频| 欧美日韩国产综合一区二区| 国产精品传媒入口麻豆| 国产一级精品在线| 6080日韩午夜伦伦午夜伦| 亚洲视频在线一区观看| 国产乱一区二区| 日韩一级二级三级| 亚洲午夜成aⅴ人片| thepron国产精品| 久久久精品中文字幕麻豆发布| 亚欧色一区w666天堂| 色噜噜狠狠色综合中国| 欧美国产精品专区| 国产乱码精品一区二区三区忘忧草| 欧美精品 日韩| 一区二区在线看| 91香蕉国产在线观看软件| 欧美国产精品一区二区三区| 精品在线一区二区三区| 日韩午夜精品电影| 人人精品人人爱| 欧美另类高清zo欧美| 亚洲国产一区二区视频| 欧洲精品中文字幕| 依依成人精品视频| 在线视频你懂得一区二区三区| 中文字幕亚洲在| www.欧美日韩| 自拍av一区二区三区| 97精品国产露脸对白| 国产精品三级电影| www.欧美.com| 1024亚洲合集| 91麻豆高清视频| 亚洲美女电影在线| 色噜噜偷拍精品综合在线| 亚洲精品少妇30p| 91福利资源站| 亚洲国产欧美在线人成| 欧美裸体一区二区三区| 日韩黄色一级片| 日韩欧美aaaaaa| 国产久卡久卡久卡久卡视频精品| 国产无人区一区二区三区| 国产成人av福利| 中文字幕亚洲一区二区av在线| 91在线porny国产在线看| 亚洲精选在线视频| 欧美精品丝袜久久久中文字幕| 午夜久久久久久久久 | 亚洲成人av在线电影| 在线观看91av| 国产一区二区三区免费观看| 国产视频一区在线播放| 91在线精品一区二区| 夜夜揉揉日日人人青青一国产精品| 欧美中文字幕亚洲一区二区va在线 | 国产喂奶挤奶一区二区三区| 99久久伊人网影院| 亚洲免费观看在线视频| 欧美日韩一区二区三区不卡 | 99视频有精品| 亚洲成人午夜影院| 日韩一区二区中文字幕| 国产99精品在线观看| 成人欧美一区二区三区| 欧美人成免费网站| 国模无码大尺度一区二区三区| 国产清纯白嫩初高生在线观看91| 色综合婷婷久久| 日韩高清在线一区| 国产精品情趣视频| 欧美偷拍一区二区| 国产剧情av麻豆香蕉精品| 亚洲精品午夜久久久| 日韩女优视频免费观看| 99国产精品久| 免费成人在线视频观看| 成人免费小视频| 日韩欧美综合在线| 色综合久久中文综合久久97| 免费的国产精品| **性色生活片久久毛片| 日韩西西人体444www| 成人国产亚洲欧美成人综合网| 亚洲国产精品久久一线不卡| 精品国产凹凸成av人网站| 91麻豆国产自产在线观看| 精品一区二区在线看| 亚洲黄色片在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 欧美日韩一级片在线观看| 国产精品自在欧美一区| 偷窥国产亚洲免费视频| 欧美国产精品劲爆| 日韩西西人体444www| 色婷婷久久久久swag精品| 国产精品1024| 日本不卡在线视频| 亚洲精品高清在线观看| 久久老女人爱爱| 7777精品伊人久久久大香线蕉| 99久久精品99国产精品| 国产乱一区二区| 久久精品国产一区二区| 亚洲一卡二卡三卡四卡五卡| 中文字幕第一区二区| 精品国产乱码久久久久久影片| 欧美日本高清视频在线观看| 不卡免费追剧大全电视剧网站| 麻豆精品久久精品色综合| 亚洲高清免费在线| 亚洲欧美另类久久久精品| 国产视频在线观看一区二区三区 | 日本一区免费视频| 精品理论电影在线观看| 欧美一区二区视频网站| 777亚洲妇女| 欧美精品视频www在线观看| 欧美亚洲综合网| 日本久久电影网| 色综合天天做天天爱| 91在线精品一区二区三区| 99久精品国产| 色综合色综合色综合色综合色综合| 国产a精品视频| 成人黄色小视频|