SQL Server中交叉联接的用法详解


Posted in SQL Server onApril 22, 2021

今天给大家介绍SQLServer中交叉联接的用法,希望对大家能有所帮助!

1、交叉联接(cross join)的概念

交叉联接是联接查询的第一个阶段,它对两个数据表进行笛卡尔积。即第一张数据表每一行与第二张表的所有行进行联接,生成结果集的大小等于T1*T2。

select * from t1 cross join t2

2、交叉联接的语法格式

SQL Server中交叉联接的用法详解

select * from t1 cross join t2;--常用写法 
select * from t1, t2;-- SQL:1989的规范 
select * from t1 cross join t2 
where t1.col1=t2.col2;--等价于内部联接 
select * from t1 inner join t2  on t1.col1=t2.col2

3、交叉查询的使用场景

3.1 交叉联接可以查询全部数据

-- 示例

-- 员工表 
CREATE TABLE [dbo].[EmpInfo]( 
  [empId] [int] IDENTITY(1,1) NOT NULL, 
  [empNo] [varchar](20) NULL, 
  [empName] [nvarchar](20) NULL, 
 CONSTRAINT [PK_EmpInfo] PRIMARY KEY CLUSTERED  
( 
  [empId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF 
, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
 
-- 奖金表 
CREATE TABLE [dbo].[SalaryInfo]( 
  [id] [int] IDENTITY(1,1) NOT NULL, 
  [empId] [int] NULL, 
  [salary] [decimal](18, 2) NULL, 
  [seasons] [varchar](20) NULL, 
 CONSTRAINT [PK_SalaryInfo] 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] 
-- 季度表 
CREATE TABLE [dbo].[Seasons]( 
  [name] [nchar](10) NULL 
) ON [PRIMARY] 
 
GO 
SET IDENTITY_INSERT [dbo].[EmpInfo] ON  
 
INSERT [dbo].[EmpInfo] ([empId], [empNo], [empName]) VALUES (1, N'A001', N'王强') 
INSERT [dbo].[EmpInfo] ([empId], [empNo], [empName]) VALUES (2, N'A002', N'李明') 
INSERT [dbo].[EmpInfo] ([empId], [empNo], [empName]) VALUES (3, N'A003', N'张三') 
 
INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) 
 VALUES (1, 1, CAST(3000.00 AS Decimal(18, 2)), N'第一季度') 
INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) 
 VALUES (2, 3, CAST(5000.00 AS Decimal(18, 2)), N'第一季度') 
INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) 
 VALUES (3, 1, CAST(3500.00 AS Decimal(18, 2)), N'第二季度') 
INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) 
 VALUES (4, 3, CAST(3000.00 AS Decimal(18, 2)), N'第二季度 ') 
INSERT [dbo].[SalaryInfo] ([id], [empId], [salary], [seasons]) 
 VALUES (5, 2, CAST(4500.00 AS Decimal(18, 2)), N'第二季度') 
 
INSERT [dbo].[Seasons] ([name]) VALUES (N'第一季度') 
INSERT [dbo].[Seasons] ([name]) VALUES (N'第二季度') 
INSERT [dbo].[Seasons] ([name]) VALUES (N'第三季度') 
INSERT [dbo].[Seasons] ([name]) VALUES (N'第四季度') 
 
-- 查询每个人每个季度的奖金情况 如果奖金不存在则为0 
SELECT a.empName,b.name seasons ,isnull(c.salary,0) salary  
FROM EmpInfo a  
CROSS JOIN Seasons b 
LEFT OUTER JOIN SalaryInfo c ON a.empId=c.empId AND b.name=c.seasons

3.2 交叉联接优化查询性能

针对一些情况可以采用交叉联接的方式替代子查询,通过减少子查询造成的多次表扫描,从而可以提高优化查询的性能。

4、总结

交叉联接虽然支持使用WHERE子句筛选行,由于笛卡儿积占用的资源可能会很多,如果不是真正需要笛卡儿积的情况下,则应当避免地使用CROSS JOIN。建议使用INNER JOIN代替,效率会更高一些。如果需要为所有的可能性都返回数据联接查询可能会非常实用。

到此这篇关于SQL Server中交叉联接的用法介绍的文章就介绍到这了,更多相关SQL Server交叉联接内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
sql中mod()函数取余数的用法
May 29 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
Jun 30 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL Server中的逻辑函数介绍
May 25 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
Jun 10 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
SQL SERVER中常用日期函数的具体使用
You might like
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
html读出文本文件内容
2007/01/22 Javascript
javascript 函数速查表
2010/02/07 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
2015/11/03 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
python 基础教程之Map使用方法
2017/01/17 Python
python实现逻辑回归的方法示例
2017/05/02 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
使用Python发现隐藏的wifi
2020/03/04 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
实习鉴定范文
2013/12/19 职场文书
护士演讲稿范文
2014/01/05 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
教堂婚礼主持词
2014/03/14 职场文书
反邪教标语
2014/06/23 职场文书
如何写好竞聘报告
2019/04/03 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫