浅析 SQL Server 的 CROSS APPLY 和 OUTER APPLY 查询 - 第一部分
2023-09-11 14:15:48 时间
第一部分:APPLY 与 JOIN
你可能知道,SQL Server 中的 JOIN 操作用于联接两个或多个表。但是,在 SQL Server 中,JOIN 操作不能用于将表与表值函数的输出联接起来。如果你没有听说过表值函数,这些函数是以表的形式返回数据。为了连接两个表表达式,SQL Server 2005 引入了 APPLY 运算符。在本篇文章中,我们将了解 APPLY 运算符与常规 JOIN 的不同之处。
关于 CROSS APPLY 和 OUTER APPLY
SQL Server 的 APPLY 运算符有两种变体:CROSS APPLY 和 OUTER APPLY:
- CROSS APPLY 运算符仅返回左表表达式(在其最终输出中)中与右表表达式匹配的那些行。 因此,CROSS APPLY 类似于 INNER JOIN,或者更准确地说,类似于具有相关子查询的 CROSS JOIN,其隐式联接条件为 1=1。
- OUTER APPLY 运算符返回左表表达式中的所有行,而不管其与右表表达式的匹配情况。对于右表表达式中没有相应匹配项的那些行,它在右表表达式的列中返回 NULL 值。 因此,OUTER APPLY 等效于 LEFT OUTER JOIN。
尽管可以使用普通的 JOIN 编写相同的查询,但当右侧有一个表值表达式并且你希望为左侧表表达式中的每一行计算此表值表达式时,就需要使用 APPLY。此外,在某些情况下,使用 APPLY 运算符可以提高查询性能。
让我们通过一些示例进一步探索 APPLY 运算符。
样本数据
我们将在Navicat for SQL Server中执行查询以创建的两个新表。这是 Department 表的设计:
这是 Employee 表的设计:
在 Navicat 查询编辑器中执行以下 SQL 以填充表:
INSERT [Department] ([DepartmentID], [Name])
VALUES (1, N'Engineering')
INSERT [Department] ([DepartmentID], [Name])
VALUES (2, N'Administration')
INSERT [Department] ([DepartmentID], [Name])
VALUES (3, N'Sales')
INSERT [Department] ([DepartmentID], [Name])
VALUES (4, N'Marketing')
INSERT [Department] ([DepartmentID], [Name])
VALUES (5, N'Finance')
GO
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (1, N'Orlando', N'Gee', 1 )
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (2, N'Keith', N'Harris', 2 )
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (3, N'Donna', N'Carreras', 3 )
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (4, N'Janet', N'Gates', 3 )
CROSS APPLY vs INNER JOIN
这是一个由两部分组成的查询:第一个查询从 Department 表中选择数据,并使用 CROSS APPLY 为 Department 表的每条记录对 Employee 表求值;第二个查询只是将 Department 表与 Employee 表联接起来以产生相同的结果:
第 二部分预告
在本文介绍了 APPLY 运算符之后,第二部分将概述使用 APPLY 和 JOIN 之间的区别,并会讲述 APPLY 的其他用途。如果你想试用 Navicat 16,可以在这里下载 Navicat 的 14 天全功能免费试用版。
往期回顾
相关文章
- SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)
- SQL Server-数据库架构和对象、定义数据完整性(二)
- SQL Server 查询性能优化——创建索引原则(一)
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- 深入浅出SQL Server中的死锁
- Sql Server-查询一列的数据进行拼接
- 基于C#+SQL Server(WinForm)学生选课及成绩查询管理系统【100010027】
- sql server 小技巧(7) 导出完整sql server 数据库成一个sql文件,包含表结构及数据
- SQL Server: Get table primary key and Foreign Key using sql query
- SQL Server 查询性能优化——创建索引原则
- SQL Server-聚焦UNIOL ALL/UNION查询(二十三)
- SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能
- SQL Server 索引中include的魅力(具有包含性列的索引)
- 人人都是 DBA(IV)SQL Server 内存管理
- SQL Server查询性能优化之创建合理的索引(上)
- sql server 即席查询(ad hoc query)与预定义语句(prepared statement)
- sql server该账户当前被锁定,所以用户'sa'登录失败。系统管理员无法将该账户解锁。(Microsoft SQL Server,错误:18486),登录错误18456
- 【sql server安装错误】sql server安装错误提示重启失败
- sql server筛选所有汉字、字母、数字,sql server通配符表达式
- (4.21)sql server中复制查询结果集
- sql server升级打补丁
- (3.15)常用知识-sql server分页查询
- SQL Server Profiler 跟踪某个数据库某张表sql语句
- SQL Server跨服务器查询
- RDS SQL Server - 专题分享 - 巧用执行计划缓存之执行计划编译
- sql server DateTime与DateTime2的区别
- SQL Server查询事务
- SQL Server with(nolock)详解
- SQL server 字段合并CAST(org_no AS VARCHAR(20))+CAST(page_no AS VARCHAR(20))+CAST(djlb_no AS VARCHAR(20)))