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 相关文章推荐
2021-4-5课程——SQL Server查询【3】
Apr 05 SQL Server
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
【HBU】数据库第四周 单表查询
Apr 05 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
SQL Server数据库查询出现阻塞之性能调优
Apr 10 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
Jun 10 SQL Server
SqlServer常用函数及时间处理小结
May 08 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
SQL SERVER中常用日期函数的具体使用
You might like
php 数组的指针操作实现代码
2011/02/08 PHP
js验证表单大全
2006/11/25 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
python读取视频流提取视频帧的两种方法
2020/10/22 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
外贸销售员求职的自我评价
2013/11/23 职场文书
手机促销活动方案
2014/02/05 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
廉洁自律承诺书
2014/03/27 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript
四十九个javascript小知识实用技巧
2021/11/20 Javascript
关于Redis的主从复制及哨兵问题
2022/06/16 Redis