婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

SQL Join的一些總結(實例)

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

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

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

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

內聯接(Inner join)是最常用的聯接類型之一,它查詢滿足聯接謂詞的數據。

假設我們要查詢申請表Apply中申請學校的相關信息,由于Apply表中包含學校名字我們并不能預知,所以我們可以根據cName來內聯接(Inner join)表College和Apply,從而找到Apply表中包含學校的信息。

具體SQL代碼如下:
復制代碼 代碼如下:

---- 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查詢結果
cName state enrollment
Stanford CA 15000
Berkeley CA 36000
MIT MA 10000
Cornell NY 21000
Harvard MA 29000
表1 College表中的數據

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

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

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

具體SQL代碼如下:
復制代碼 代碼如下:

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

圖3左聯接查詢結果

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

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

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

---- 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 完整外部聯接查詢結果

現在我們獲取了College和Apply的完全數據集,對于表中匹配的則有值,即使沒有找到匹配cName的則以NULL值取代。

下表顯示每種外部聯接(outer join)匹配時保留數據行的情況:

聯接類型

保留數據行

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 外部聯接保留數據行

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

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

交叉聯接相對于內部聯接使用率較低,而且兩個大表不應該進行交叉聯接,因為這將導致一個非常昂貴的操作和一個非常大的結果集。

具體SQL代碼如下:
復制代碼 代碼如下:

---- 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表的行數

圖5 交叉聯接

現在我們對College和Apply表進行交叉聯接,而且生成數據行為College和Apply表行數的笛卡爾積即5 * 20 = 100。

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

---- 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])

我們也可以使用內部聯接實現和Cross apply相同的查詢功能,具體SQL代碼如下:
復制代碼 代碼如下:

---- 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之后,現在讓我們理解Out apply也就不難了,Outer apply使表可以和表值函數(table-valued functions TVF‘s)結果進行join查詢,找到匹配值則有值,沒有找到匹配值則以NULL表示。
復制代碼 代碼如下:

---- 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的區別

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

---- 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

查詢執行時間:

CPU 時間= 0 毫秒,占用時間= 11 毫秒。

Inner join查詢執行時間:

CPU 時間= 0 毫秒,占用時間= 4 毫秒。

圖8 執行計劃

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

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

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

雖然大多數采用Cross apply實現的查詢,可以通過Inner join實現,但Cross apply可能產生更好的執行計劃和更佳的性能,因為它可以在聯接執行之前限制集合加入。

Semi-join和Anti-semi-join

Semi-join從一個表中返回的行與另一個表中數據行進行不完全聯接查詢(查找到匹配的數據行就返回,不再繼續查找)。

Anti-semi-join從一個表中返回的行與另一個表中數據行進行不完全聯接查詢,然后返回不匹配的數據。

不同于其他的聯接運算,Semi-join和Anti-semi-join沒有明確的語法來實現,但Semi-join和Anti-semi-join在SQL Server中有多種應用場合。我們可以使用EXISTS子來實現Semi-join查詢,Not EXISTS來實現Anti-semi-join。現在讓我們通過具體的例子說明吧!

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

---- 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
)

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


圖9 查詢結果



圖10 執行計劃

現在要求我們找出還沒有申請學校的學生信息,這時我們立刻反應可以使用NOT EXISTS子句來實現該查詢,具體SQL代碼如下:
復制代碼 代碼如下:

---- 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
)

其實,我們常用的NOT EXISTS子句的實現是通過Anti-semi-join,通過執行計劃我們發現在查找匹配sID時,SQL使用 Left Anti Semi Join進行查詢。

圖11 查詢結果


圖12 執行計劃

1.1.3 總結
本文介紹了SQL中常用了聯接查詢方式: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區別、用法及示例介紹

標簽:濟寧 貸款群呼 黃山 金昌 河源 中衛 新余 宜春

巨人網絡通訊聲明:本文標題《SQL Join的一些總結(實例)》,本文關鍵詞  SQL,Join,的,一些,總結,實例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL Join的一些總結(實例)》相關的同類信息!
  • 本頁收集關于SQL Join的一些總結(實例)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美性猛交xxxxxx富婆| 亚洲高清不卡在线观看| 久久久99精品免费观看| 中文文精品字幕一区二区| 久久久久国产精品人| 欧美一级黄色录像| 欧美三片在线视频观看| 欧美日韩高清一区二区| 日韩毛片在线免费观看| 成人动漫中文字幕| 日韩一区二区电影| 亚洲激情男女视频| 亚洲综合激情小说| 国产尤物一区二区| 欧美电影影音先锋| 一区二区三区四区在线免费观看 | 亚洲综合视频在线观看| 午夜精品久久久久久久蜜桃app| 天天综合天天做天天综合| 奇米在线7777在线精品| 国产一区二区三区精品视频| 成人精品一区二区三区四区 | 国产精品久久精品日日| 亚洲成av人影院| 91日韩在线专区| 日本一不卡视频| 成人精品国产福利| 日韩欧美你懂的| 一区二区在线免费观看| 国产成人av影院| 欧美日韩视频在线观看一区二区三区 | 国产精品久久午夜夜伦鲁鲁| 看电视剧不卡顿的网站| 91捆绑美女网站| 国产日韩精品一区二区三区在线| 亚洲国产精品自拍| 91国偷自产一区二区开放时间| 久久精品亚洲乱码伦伦中文 | 97精品国产97久久久久久久久久久久| 欧美一区二区三区免费观看视频| 亚洲人被黑人高潮完整版| 国产一区二区影院| 久久久久久久久久久久久女国产乱 | 2022国产精品视频| 日本国产一区二区| 夜夜嗨av一区二区三区网页| 欧美群妇大交群中文字幕| 日本特黄久久久高潮| 国产人成一区二区三区影院| 99精品国产91久久久久久| 国产精品白丝在线| 在线视频综合导航| 免费观看91视频大全| 国产日韩欧美电影| 欧美性三三影院| 国产一区二区三区精品视频| 亚洲欧洲综合另类| 精品盗摄一区二区三区| 91丨porny丨蝌蚪视频| 免费高清在线一区| 国产精品超碰97尤物18| 日韩欧美一区二区在线视频| 国产99久久久久| 丝袜亚洲另类欧美综合| 久久精品亚洲一区二区三区浴池 | 亚洲欧美韩国综合色| 国产日韩高清在线| 日韩女优制服丝袜电影| 欧美中文字幕亚洲一区二区va在线| 国产成人亚洲综合a∨婷婷| 亚洲观看高清完整版在线观看| 久久精品亚洲精品国产欧美| 欧美一区二区三区四区五区| 欧美日韩国产高清一区| 色老汉一区二区三区| 不卡视频在线看| 成人精品视频一区二区三区| 成人a级免费电影| 成人毛片视频在线观看| 成人免费福利片| 欧美一级免费大片| 欧美一区二区三区精品| 日韩精品在线一区二区| 51精品国自产在线| 欧美一区二区黄| 精品国产乱码久久久久久蜜臀 | 久久综合久久久久88| 不卡一区二区在线| 国产福利精品导航| 亚洲综合激情网| 亚洲在线成人精品| 亚洲一级二级在线| 亚洲成人精品影院| 视频一区欧美精品| 午夜精品爽啪视频| 毛片av中文字幕一区二区| 美女在线一区二区| 国产夫妻精品视频| 91亚洲午夜精品久久久久久| 国产风韵犹存在线视精品| 成人在线视频一区二区| 丁香啪啪综合成人亚洲小说| 成人午夜精品在线| 一本色道综合亚洲| 69p69国产精品| 国产精品久久久久影视| 一个色在线综合| 精品影视av免费| 91日韩在线专区| 精品久久国产老人久久综合| 国产精品久99| 一区二区免费在线播放| 三级欧美在线一区| 婷婷一区二区三区| 国产一区二区伦理| 欧美日韩精品综合在线| 国产婷婷色一区二区三区| 亚瑟在线精品视频| 成人在线综合网| 精品国产乱码久久久久久1区2区| 综合av第一页| 美脚の诱脚舐め脚责91| 成人av网站在线观看| 3751色影院一区二区三区| 亚洲欧洲日韩女同| 亚洲免费观看高清完整版在线观看熊 | 欧美亚洲动漫另类| 亚洲人成在线观看一区二区| 日韩福利视频导航| 欧美无人高清视频在线观看| 国产欧美一区二区精品婷婷| 国产真实乱对白精彩久久| 欧美乱妇15p| 午夜国产精品一区| 91麻豆国产精品久久| 国产欧美一区二区精品性| 激情成人午夜视频| 欧美一级夜夜爽| 免费亚洲电影在线| 777a∨成人精品桃花网| 国产欧美日韩综合| 韩国在线一区二区| 欧美精品日韩综合在线| 全国精品久久少妇| 欧美日韩中文字幕一区二区| 亚洲午夜日本在线观看| 91精品一区二区三区久久久久久| 亚洲一区二区三区精品在线| 欧美日韩精品是欧美日韩精品| 日韩制服丝袜av| 久久你懂得1024| 色婷婷国产精品| 老司机精品视频在线| 日韩一区二区在线观看视频| 看片网站欧美日韩| 欧美成人午夜电影| 国产精品夜夜嗨| 国产欧美日韩中文久久| 欧美一区二区视频观看视频| 日本伊人色综合网| 国产精品国产自产拍高清av | 91久久精品日日躁夜夜躁欧美| 另类的小说在线视频另类成人小视频在线| 国产女人18毛片水真多成人如厕| 色欲综合视频天天天| 国产精品成人一区二区三区夜夜夜| 欧美群妇大交群中文字幕| 高清beeg欧美| 天堂久久一区二区三区| 亚洲精品高清视频在线观看| 日韩精品一区二区三区视频播放 | 亚洲蜜臀av乱码久久精品蜜桃| 久久久久97国产精华液好用吗| 欧美日韩一本到| 在线免费观看日本欧美| 91丨porny丨在线| 国产精品99久| 久久精品国产精品亚洲精品| 午夜成人在线视频| 亚洲女同女同女同女同女同69| 国产精品乱码久久久久久| 久久尤物电影视频在线观看| 在线电影欧美成精品| 8x福利精品第一导航| 欧美精品亚洲一区二区在线播放| 91久久人澡人人添人人爽欧美| 国产精品亚洲专一区二区三区| 国内精品久久久久影院薰衣草| 日韩精品视频网| 日本三级亚洲精品| 国产一区二区视频在线播放| 成人高清免费观看| 欧洲精品一区二区| 欧美成人一区二区| 国产亚洲欧美日韩俺去了| 欧美成人性福生活免费看| 国产精品污www在线观看| 亚洲视频 欧洲视频| 免费日韩伦理电影| 国产高清亚洲一区|