国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

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

2024-08-31 01:03:10
字體:
來源:轉載
供稿:網友

在sqlserver中比較常見的關鍵字有很多,下面小編主要給大家介紹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,意味著結果集中將包含使右表表達式為空的左表表達式中的行,而指定CROSS,則相反,結果集中不包含使右表表達式為空的左表表達式中的行。

注意:若要使用 APPLY,數據庫兼容級別必須為 90。

下面我們做個例子:

比如有個類別表(Category)內容如下:

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

還有個類別明細表(CategoryDetail)內容如下:

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

OUTER APPLY

下面我們來看看的查詢結果:

 

 
  1. SELECT * 
  2. FROM dbo.Category a 
  3. OUTER APPLY ( SELECT * 
  4. FROM dbo.CategoryDetail b 
  5. WHERE b.CategoryId = a.Id 
  6. ) AS c ; 

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

由上圖可看出OUTER APPLY把左表中的信息查出后把右表中的信息也關聯出來了,當然當右表的信息為空(NULL)時,OUTER APPLY也會在結果集中顯示出來.

接下來我們看下CROSS APPLY的查詢結果:

 

 
  1. SELECT * 
  2. FROM dbo.Category a 
  3. CROSS APPLY ( SELECT * 
  4. FROM dbo.CategoryDetail b 
  5. WHERE b.CategoryId = a.Id 
  6. ) AS c ; 

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

根據這圖和上面的比較可看出,這個返回結果只有兩個,Category 表中的Tiger的信息沒有帶出來,因為在CategoryDetail 表中沒有對應的明細.

由以上信息可得出,OUTER APPLY 就相當于數學中的并集,而CROSS APPLY相當于數學中的交集,關于交集與并集的介紹如下:

并集為下圖中的所有紅色部分,即為A和B的全部:

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

交集為下圖中的紅色部分,也就是A和B相交的部分:

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

2.OUTER APPLY 和LEFT JOIN

LEFT JOIN 關鍵字會從左表 (Category) 那里返回所有的行,即使在右表 (CategoryDetail) 中沒有匹配的行。

注釋:在某些數據庫中, LEFT JOIN 稱為 LEFT OUTER JOIN。

下面我們來看看LEFT JOIN 的查詢結果(還是1.CROSS APPLY 和 OUTER APPLY中的例子):

 

 
  1. SELECT * 
  2. FROM dbo.Category a 
  3. LEFT JOIN dbo.CategoryDetail b ON b.CategoryId = a.Id ; 

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

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 表的結果及插入數據的腳本:

 

 
  1. CREATE TABLE [dbo].[CategoryDetail]( 
  2. [Id] [int] IDENTITY(,) NOT NULL, 
  3. [CategoryId] [int] NULL, 
  4. [Cry] [varchar]() NULL, 
  5. CONSTRAINT [PK_CategoryDetail] PRIMARY KEY CLUSTERED  
  6. [Id] ASC 
  7. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
  8. ) ON [PRIMARY] 
  9. GO 
  10. SET ANSI_PADDING OFF 
  11. GO 
  12. SET IDENTITY_INSERT [dbo].[CategoryDetail] ON 
  13. INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (, , N'喵'
  14. INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (, , N'汪'
  15. SET IDENTITY_INSERT [dbo].[CategoryDetail] OFF 
  16. /****** Object: Table [dbo].[Category] Script Date: // :: ******/ 
  17. SET ANSI_NULLS ON 
  18. GO 
  19. SET QUOTED_IDENTIFIER ON 
  20. GO 
  21. SET ANSI_PADDING ON 
  22. GO 
  23. CREATE TABLE [dbo].[Category]( 
  24. [Id] [int] IDENTITY(,) NOT NULL, 
  25. [Name] [varchar]() NULL, 
  26. CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED  
  27. [Id] ASC 
  28. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
  29. ) ON [PRIMARY] 
  30. GO 
  31. SET ANSI_PADDING OFF 
  32. GO 
  33. SET IDENTITY_INSERT [dbo].[Category] ON 
  34. INSERT [dbo].[Category] ([Id], [Name]) VALUES (, N'Cat'
  35. INSERT [dbo].[Category] ([Id], [Name]) VALUES (, N'Dog'
  36. INSERT [dbo].[Category] ([Id], [Name]) VALUES (, N'Tiger'
  37. SET IDENTITY_INSERT [dbo].[Category] OFF 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清涧县| 湖南省| 炉霍县| 邯郸市| 灵宝市| 沾益县| 尉氏县| 清远市| 克山县| 盐池县| 南涧| 通山县| 沙河市| 新密市| 衡阳县| 民和| 五原县| 炎陵县| 建宁县| 霍林郭勒市| 鄂伦春自治旗| 麟游县| 元阳县| 洛扎县| 高州市| 江山市| 新晃| 阿坝县| 海宁市| 大冶市| 西盟| 聂拉木县| 蛟河市| 九龙城区| 克山县| 陇南市| 韶关市| 延庆县| 十堰市| 安化县| 鸡东县|