千家信息网

SQL Server中怎么实现交叉联接和内部联接

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,SQL Server中怎么实现交叉联接和内部联接,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。交叉联接(CROSS JOIN)交叉连
千家信息网最后更新 2025年02月03日SQL Server中怎么实现交叉联接和内部联接

SQL Server中怎么实现交叉联接和内部联接,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

交叉联接(CROSS JOIN)

交叉连接是最简单的联接类型。交叉联接仅执行一个逻辑查询处理阶段-笛卡尔乘积。例如对两个输入表进行操作,联接并生成两个表的笛卡尔乘积,也就是说,将一个表的每一行与另一个表的所有行进行匹配。所以,如果一个表有m行,另一个表有n行,得到的结果中则会有m*n行。我们就拿SQL Server 2012教程中的例子说下

SELECT C.custid, E.empidFROM Sales.Customers AS CCROSS JOIN HR.Employees AS EORDER BY E.empid

在Sales.Customers表中有91行数据,HR.Employees表中有9行数据,则利用交叉联接数据则有819(91*9)行数据,简略数据如下。

交叉联接我们可以用如下图表示

交叉联接最大的用途在于生成数字表以便我们用于其他目的,我们一起来看看。

IF OBJECT_ID('dbo.Digits','U')IS NOT NULL DROP TABLE dbo.Digits;CREATE TABLE dbo.Digits( digit INT NOT NULL);

插入10条基础数据

USE TSQL2012GOINSERT INTO dbo.Digits  ( digit )VALUES ( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 )

创建数字表

USE TSQL2012GOCREATE TABLE Nums( n INT NOT NULL PRIMARY KEY);

利用交叉联接在数字表中插入100万条数据

USE TSQL2012GOINSERT INTO dbo.Nums(n)SELECT D6.digit * 100000 + D5.digit * 10000 + D4.digit * 1000 + D3.digit * 100 + D2.digit * 10 + D1.digit + 1 AS nFROM dbo.Digits AS D1 CROSS JOIN dbo.Digits AS D2 CROSS JOIN dbo.Digits AS D3 CROSS JOIN dbo.Digits AS D4 CROSS JOIN dbo.Digits AS D5 CROSS JOIN dbo.Digits AS D6ORDER BY n

内部联接(INNER JOIN)

内部联接用法如下

SELECT *FROM table1 AS t1INNER JOIN table2 AS t2 ON t1.Id = t2.Id

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

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

USE TSQL2012GOCREATE TABLE FirstTable (Col1 INT)CREATE TABLE SecondTable (Col1 INT)CREATE TABLE ThirdTable (Col1 INT)GOINSERT INTO FirstTable (Col1)VALUES (1), (2), (3), (NULL)GOINSERT INTO SecondTable (Col1)VALUES (1), (2), (3), (NULL)GOINSERT INTO ThirdTable (Col1)VALUES (2), (2), (2), (2), (2), (NULL)GO

(1)等值条件查询

SELECT f.Col1 fCol1FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 = f.col1GO

(2)非等值条件查询

USE TSQL2012GOSELECT f.Col1 fCol1FROM FirstTable fINNER JOIN SecondTable s ON s.Col1 <> f.col1GO

上述我们同样可以利用交叉连接实现同样效果

USE TSQL2012GOSELECT f.Col1 fCol1FROM FirstTable AS f CROSS JOIN SecondTable AS swhere s.Col1 <> f.col1GO

(3)查询非重复行(NON-DISTINCT)

我们在创建第三个测试表时,插入的数据是5个2,而在第一个表中插入的数据分别是1、2、3,此时我们利用等值联接得到的结果到底是1个2,还是5个2呢?

USE TSQL2012GOSELECT f.Col1 fCol1FROM FirstTable fINNER JOIN ThirdTable s ON s.Col1 = f.col1GO

我们得到的结果是5个2,为什么利用内部联接也就是说利用的等值条件不是返回1个2呢,其实我们可以总结如下:

结论:利用内部联接比实际表中返回更多数据的原因在于,内部联接返回的结果集是基于查询条件中的JOIN,若有多行满足条件则返回多条数据。

内部联接安全性

在两个表利用等值条件查询时,我们有两种写法。

ANSI SQL-92写法

USE TSQL2012GOSELECT *FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD ON SOD.orderid = SO.orderid

ANSI SQL-89写法

USE TSQL2012GOSELECT *FROM Sales.Orders AS SO, Sales.OrderDetails AS SODWHERE SOD.orderid = SO.orderid

虽然这两种写法都可以,都能满足需求,但是SQL Server 2012基础教程强烈建议使用ANSI SQL-92写法,为什么呢,因为用ANSI SQL-89写法时若出现错误,此时解析根本不会生成错误,而对于ANSI SQL-92写法则会,下面我们一起来看下ANSI SQL-89写法的问题

USE TSQL2012GOSELECT COUNT(*) AS '利用等值条件查询总数据行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SODWHERE SOD.orderid = SO.orderid

上面是我们利用正确的写法得到的正确的总数据行为2155条,下面我们看看有问题的写法

SELECT COUNT(*) AS '利用等值条件查询总数据行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD

此时我们没有给出WHERE条件,而解析未出现错误,当然返回的结果集也就是错误的。当我们利用ANSI SQL-92写法时,我们同样也未给出比较条件,如下

USE TSQL2012GOSELECT *FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD;

关于SQL Server中怎么实现交叉联接和内部联接问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

数据 交叉 写法 条件 查询 结果 问题 更多 错误 两个 也就是 数字 生成 三个 乘积 也就是说 基础 教程 笛卡尔 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发的主要方法有哪些 南京奥兰治网络技术有限公司 软件开发框架培训辅导 网络安全的手抄报最简单漂亮 为何网络安全宣传 天津网络技术信息哪个好 网络安全志愿者活动宣传报道 蜂窝软件开发 翻译 网络安全电子商务领域 四月15日网络安全绘画 方舟用的什么服务器 数据库正常运行是什么样 三层网络技术零基础视频教程 江苏网络安全审计系统咨询公司 两台安卓做服务器 气象局网络安全定级 互联网科技自媒体公司 形容网络安全的顺口溜 解读网络安全四个坚持 紫金网络安全手抄报 大华存储服务器怎么格式化 怎么设置办公室网络安全 启动mysql创建数据库 税务网络安全工作情况报告 网络技术服务开票编码 网络安全保密工作自查情况 数据库服务器使用什么数据库 北京红色文化馆软件开发系统 有没有软件开发学校本科 安华金和数据库安全产品
0