sql server症結字詳解年夜全(圖文)。本站提示廣大學習愛好者:(sql server症結字詳解年夜全(圖文))文章只能為提供參考,不一定能成為您想要的結果。以下是sql server症結字詳解年夜全(圖文)正文
上面把sqlserver中cross apply和outer apply症結字詳細引見展現以下:
1.CROSS APPLY 和OUTER APPLY
MSDN說明以下(小我懂得不是很清楚):
應用 APPLY 運算符可認為完成查詢操作的內部表表達式前往的每一個行挪用表值函數。表值函數作為右輸出,內部表表達式作為左輸出。
經由過程對右輸出求值來取得左輸出每行的盤算成果,生成的行被組合起來作為終究輸入。
APPLY 運算符生成的列的列表是左輸出中的列集,後跟右輸出前往的列的列表。
APPLY 有兩種情勢:
CROSS APPLY 和 OUTER APPLY。
CROSS APPLY 僅前往內部表中經由過程表值函數生成成果集的行。
OUTER APPLY 既前往生成成果集的行,也前往不生成成果集的行,個中表值函數生成的列中的值為 NULL。
網上匯集的說明以下(小我感到好懂得):
SQL Server數據庫操作中,在2005以上的版本新增長了一個APPLY表運算符的功效。新增的APPLY表運算符把右表表達式運用到左表表達式中的每行。
它不像JOIN那樣先盤算哪一個表表達式都可以,APPLY必需先邏輯地盤算左表達式。這類盤算輸出的邏輯次序許可把右表達式聯系關系到左表表達式。
APPLY有兩種情勢,一個是OUTER APPLY,一個是CROSS APPLY,差別在於指定OUTER,意味著成果集中將包括使右表表達式為空的左表表達式中的行,而指定CROSS,則相反,成果集中不包括使右表表達式為空的左表表達式中的行。
留意:若要應用 APPLY,數據庫兼容級別必需為 90。
上面我們做個例子:
好比有個種別表(Category)內容以下:
還有個種別明細表(CategoryDetail)內容以下:
上面我們來看看OUTER APPLY 的查詢成果:
SELECT * FROM dbo.Category a OUTER APPLY ( SELECT * FROM dbo.CategoryDetail b WHERE b.CategoryId = a.Id ) AS c ;
由上圖可看出OUTER APPLY把左表中的信息查出後把右表中的信息也聯系關系出來了,固然當右表的信息為空(NULL)時,OUTER APPLY也會在成果集中顯示出來.
接上去我們看下CROSS APPLY的查詢成果:
SELECT * FROM dbo.Category a CROSS APPLY ( SELECT * FROM dbo.CategoryDetail b WHERE b.CategoryId = a.Id ) AS c ;
依據這圖和下面的比擬可看出,這個前往成果只要兩個,Category 表中的Tiger的信息沒有帶出來,由於在CategoryDetail 表中沒有對應的明細.
由以上信息可得出,OUTER APPLY 就相當於數學中的並集,而CROSS APPLY相當於數學中的交集,關於交集與並集的引見以下:
並集為下圖中的一切白色部門,即為A和B的全體:
交集為下圖中的白色部門,也就是A和B訂交的部門:
2.OUTER APPLY 和LEFT JOIN
LEFT JOIN 症結字會從左表 (Category) 那邊前往一切的行,即便在右表 (CategoryDetail) 中沒有婚配的行。
正文:在某些數據庫中, LEFT JOIN 稱為 LEFT OUTER JOIN。
上面我們來看看LEFT JOIN 的查詢成果(照樣1.CROSS APPLY 和 OUTER APPLY中的例子):
SELECT * FROM dbo.Category a LEFT JOIN dbo.CategoryDetail b ON b.CategoryId = a.Id ;
LEFT JOIN 症結字會從左表 (Category) 那邊前往一切的行,即便在右表 (CategoryDetail) 中沒有婚配的行。後果和OUTER APPLY 一樣。
OUTER APPLY 和 LEFT JOIN 的重要差別為:
一個LEFT JOIN 症結字只能JOIN 一個表,不克不及處理一個龐雜的SELECT 語句,或許函數辦法等。
一個OUTER APPLY 症結字可以包括一個自力的龐雜的SELECT 語句,或許其他函數辦法等。
OUTER APPLY 和 LEFT JOIN 機能的差別:
經由過程本文總結可知LEFT JOIN和OUTER APPLY機能比擬的總結可知 LEFT JOIN 要比 OUTER APPLY 機能要快。所以建議能用LEFT JOIN的盡可能不要用OUTER APPLY。
附注:
附Category 表和CategoryDetail 表的成果及拔出數據的劇本:
CREATE TABLE [dbo].[CategoryDetail]( [Id] [int] IDENTITY(,) NOT NULL, [CategoryId] [int] NULL, [Cry] [varchar]() NULL, CONSTRAINT [PK_CategoryDetail] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO SET IDENTITY_INSERT [dbo].[CategoryDetail] ON INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (, , N'喵') INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (, , N'汪') SET IDENTITY_INSERT [dbo].[CategoryDetail] OFF /****** Object: Table [dbo].[Category] Script Date: // :: ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Category]( [Id] [int] IDENTITY(,) NOT NULL, [Name] [varchar]() NULL, CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO SET IDENTITY_INSERT [dbo].[Category] ON INSERT [dbo].[Category] ([Id], [Name]) VALUES (, N'Cat') INSERT [dbo].[Category] ([Id], [Name]) VALUES (, N'Dog') INSERT [dbo].[Category] ([Id], [Name]) VALUES (, N'Tiger') SET IDENTITY_INSERT [dbo].[Category] OFF
以上內容就是本文的全體所示,願望年夜家愛好。