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 相关文章推荐
SQL Server——索引+基于单表的数据插入与简单查询【1】
Apr 05 SQL Server
2021-4-5课程——SQL Server查询【3】
Apr 05 SQL Server
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
MySQL 中如何归档数据的实现方法
Mar 16 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL Server中的逻辑函数介绍
May 25 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
SQL SERVER中常用日期函数的具体使用
You might like
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
建筑工程技术应届生求职信
2013/11/17 职场文书
给导游的表扬信
2014/01/10 职场文书
物业经理自我鉴定
2014/03/03 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
国旗下的演讲稿
2014/05/08 职场文书
顶岗实习计划书
2015/01/16 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
九年级数学教学反思
2016/02/17 职场文书
接收函
2019/04/22 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
MySQL七种JOIN类型小结
2021/10/24 MySQL
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android