sql server關鍵字詳解大全(圖文)_MsSql

來源:互聯網
上載者:User

下面把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

以上內容就是本文的全部所示,希望大家喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.