浅谈SQLServer交叉连接的内部连接

前言

在本节开始时,我们进入连接学习。关于连接有更多的信息。我们要循序渐进地学习,内容要少,理解要一步一步来。

交叉连接(交叉连接)

交叉连接是最简单的连接,交叉连接只执行一个逻辑查询处理阶段-笛卡尔积。例如,我们使用两个输入表,连接并产生两个表笛卡尔的产品,也就是说,与另一个表的所有行的表的每一行的。所以,如果一个桌上有一个M线和另一个有N行,会有结果的一个M×N线。我们以SQL Server 2012教程的例子


选择c.custid,E.empid
从销售,客户为C
作为人力资源部门的员工。
为了e.empid


在销售客户表中,有91行数据,HR表中有9行。然后,819(91×9)行的数据是交叉连接的,下面的数据被缩写。


交叉连接可以表示如下


交叉连接最大的用途是生成一个数字表,这样我们就可以将它用于其他用途,我们将一起看到它。


如果object_id('dbo。数字,U)
不为空表位dbo;
创建表的dbo。数字

数字int不是空的
);


插入10个基本数据


使用tsql2012

插入数字dbo。
(数字)
值(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)。


创建数字表


使用tsql2012

创建表的实现

非空主键
);


在交叉连接的数字表中插入100万条数据


使用tsql2012

插入- Nums(N)。
选择d6.digit * 100000 * 10000 + d5.digit + d4.digit + d3.digit + 100 * 1000 * d2.digit * 10 + d1.digit + 1 N
从数字D1 dbo。
数字交叉连接dbo D2。
数字交叉连接dbo作为D3。
数字交叉连接dbo D4。
交叉连接dbo。数字D5
数字交叉连接dbo D6。
以N



内部连接(内部连接)

内部连接如下所示


*选择
从表1 T1
内部联接表T2在T1,T2的ID的ID =。


内部联接返回表中更多的数据。

我们首先给出以下三个测试表


使用tsql2012

创建表firsttable(col1 int)
创建表的二张表格中(col1 int)
创建表thirdtable(col1 int)

INSERT INTO FirstTable (Col1)
值(1)、(2)、(3)、(空)

插入二张表格中(2)
值(1)、(2)、(3)、(空)

插入thirdtable(COL1)
值(2)、(2)、(2)、(2)、(2)、(空)



(1)等价查询


选择f.col1 fcol1
从firsttable F
内部联接二张表格中的s.col1 = f.col1




(2)非等价条件查询


使用tsql2012

选择f.col1 fcol1
从firsttable F
内部联接二张表格中的s.col1 f.col1




我们也可以使用交叉连接来达到上述效果。


使用tsql2012

选择f.col1 fcol1
从firsttable F
二张表格中的交叉连接
在s.col1 <> f.col1



(3)查询不重复的行(non-distinct)

当我们创建第三个测试表时,我们将5个数据插入到2个表中,并且第一个表中插入的数据分别为1, 2和3。同时,我们使用等值联接的结果得到1个2或5个2。


使用tsql2012

选择f.col1 fcol1
从firsttable F
内部联接thirdtable的s.col1 = f.col1




我们得到的结果是5 2。为什么使用内部连接是说等价条件不返回到1 2。事实上,我们可以总结如下:

结论:使用内部连接返回实际表中更多数据的原因是内部连接设置的结果集是基于查询条件中的连接,如果有多个行满足需求,它将返回多个数据。

内部连接的安全

当两个表用相等的条件查询时,我们有两种写作方式。

ANSI SQL-92写作


使用tsql2012

*选择
从销售订单。
内部联接sales.orderdetails SOD对sod.orderid = so.orderid


ANSI SQL-89写作


使用tsql2012

*选择
从销售订单等,sales.orderdetails SOD
在sod.orderid = so.orderid


尽管这两种写作,可以满足需求,但SQL Server 2012基础教程,强烈推荐使用ANSI SQL-92写的,为什么,因为ANSI SQL-89写错误发生时使用,基本分析误差的产生,以及ANSI SQL-92的写法,读取ANSI SQL-89写问题


使用tsql2012

选择计数(*)为查询具有相同值条件的总数据行
从销售订单等,sales.orderdetails SOD
在sod.orderid = so.orderid



这是我们从正确的写作方法中得到的正确数据的2155,让我们来看看问题所在。


选择计数(*)为查询具有相同值条件的总数据行
从销售订单等,sales.orderdetails SOD



在这一点上我们不给那里的条件,没有错误的解析,当然返回的结果集也是错误的。当我们使用ANSI SQL-92写,我们不给比较条件,如下


使用tsql2012

*选择
从销售订单。
内部联接sales.orderdetails SOD;



此时会有一个解析错误,也就是说,不可能继续查询,自然不会得到错误的结果。

结论:ANSI SQL-92是高度推荐,这样数据就不一致。同时,可读性和可维护性比ANSI SQL-89更强。

总结

在本节中,我们将讨论交叉连接和内部连接。同时,我们也提出了一些注意事项。

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有疑问,你可以留言交流,希望你能得到更多的支持。