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
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
Jun 30 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
sql server 累计求和实现代码
Feb 28 SQL Server
SQL Server中常用截取字符串函数介绍
Mar 16 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
Jun 10 SQL Server
SQL Server数据库备份和恢复数据库的全过程
Jun 14 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
SQL SERVER中常用日期函数的具体使用
You might like
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
基于python的七种经典排序算法(推荐)
2016/12/08 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
python实现推箱子游戏
2020/03/25 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
python实现大文件分割与合并
2019/07/22 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python