≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 数据库 > SQL Server

SQL Server交叉联接 内部联接的简单示例

人气:322 时间:2020-06-26

这篇文章主要为大家详细介绍了SQL Server交叉联接 内部联接的简单示例,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的小编两巴掌来看看吧!

 

前言

 

本节开始我们进入联接学习,关于连接这一块涉及的内容比较多,我们一步一步循序渐进学习,简短内容,深入的理解。

 

交叉联接(CROSS JOIN)

 

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

代码如下:


SELECT C.custid, E.empid
FROM Sales.Customers AS C
CROSS JOIN HR.Employees AS E
ORDER 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 TSQL2012
GO
INSERT INTO dbo.Digits
  ( digit )
VALUES ( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 )

创建数字表

代码如下:


USE TSQL2012
GO
CREATE TABLE Nums
(
 n INT NOT NULL PRIMARY KEY
);

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

代码如下:


USE TSQL2012
GO
INSERT INTO dbo.Nums(n)
SELECT D6.digit * 100000 + D5.digit * 10000 + D4.digit * 1000 + D3.digit * 100 + D2.digit * 10 + D1.digit + 1 AS n
FROM 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 D6
ORDER BY n

【图片暂缺】

 

内部联接(INNER JOIN)

 

内部联接用法如下

代码如下:


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

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

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

代码如下:


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

(1)等值条件查询

代码如下:


SELECT f.Col1 fCol1
FROM FirstTable f
 INNER JOIN SecondTable s ON s.Col1 = f.col1
GO

【图片暂缺】

(2)非等值条件查询

代码如下:


USE TSQL2012
GO
SELECT f.Col1 fCol1
FROM FirstTable f
INNER JOIN SecondTable s ON s.Col1 <> f.col1
GO

【图片暂缺】

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

代码如下:


USE TSQL2012
GO
SELECT f.Col1 fCol1
FROM FirstTable AS f
 CROSS JOIN SecondTable AS s
where s.Col1 <> f.col1
GO

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

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

代码如下:


USE TSQL2012
GO
SELECT f.Col1 fCol1
FROM FirstTable f
INNER JOIN ThirdTable s ON s.Col1 = f.col1
GO

【图片暂缺】

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

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

 

内部联接安全性

 

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

ANSI SQL-92写法

代码如下:


USE TSQL2012
GO
SELECT *
FROM Sales.Orders AS SO
 INNER JOIN Sales.OrderDetails AS SOD ON SOD.orderid = SO.orderid

ANSI SQL-89写法

代码如下:


USE TSQL2012
GO
SELECT *
FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD
WHERE SOD.orderid = SO.orderid

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

代码如下:


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

【图片暂缺】

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

代码如下:


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

【图片暂缺】

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

代码如下:


USE TSQL2012
GO
SELECT *
FROM Sales.Orders AS SO
 INNER JOIN Sales.OrderDetails AS SOD;

【图片暂缺】

此时会出现解析错误,也就是无法再继续查询,自然也就得不到错误的结果。

结论:强烈推荐使用ANSI SQL-92写法,这样一来使得数据不会出现不一致性,同时可读性和可维护性比ANSI SQL-89写法强。

 

总结

 

本节我们讲了交叉联接和内部联接,同时也给出了使用需要注意的地方,本节到此结束,我们下节再讲讲自联接和外部联接。简短的内容,深入的理解,我们下节再会,good night。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多支持四海网!

本文来自:http://www.q1010.com/179/9282-0.html

注:关于SQL Server交叉联接 内部联接的简单示例的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:SQL SERVER

您可能感兴趣的文章

  • SqlServer索引原理解析
  • SqlServer 在事务获得自增ID的简单示例
  • SQL Server使用扩展事件获取Session级别的等待信息及SQLServer 2016中Session级别等待信息的增强示例
  • 远程连接阿里云SqlServer 2012 数据库服务器的简单示例
  • 解决SqlServer 各版本 sa帐户不能登录问题
  • Windows使用性能监视器监控SqlServer的常见指标示例
  • 调整SQLServer2000运行数据库结构的简单示例
  • 解决SQLServer远程连接失败的问题
  • 数据库触发器DB2和SqlServer区别解析
  • 解决在Azure上部署Sqlserver网络访问不了示例
上一篇:SQL Server分页方式 ISNULL与COALESCE性能比较功能实例
下一篇:SQL Server聚焦使用索引和查询执行计划的简单示例
热门文章
  • SQL Server SQL获取第一条记录的方法
  • SQL Server出现System.OutOfMemoryException异常的解决方法
  • SQL Server的 update from 语句的简单示例
  • SQL Server 数据库备份方法菜鸟教程
  • SQL Server 多表关联时在where语句中慎用trim()方法
  • SQL Server数据类型及长度限制详细说明
  • mybaits非配置原因,导致SqlSession was not registered for synchronization异常解析
  • SQL Server 收缩后对数据库的使用有影响吗?
  • SQL Server 格式导致的Excel导入sql出现异常的解决方法
  • SQL Server 连接服务器出现错误 7391的解决方法
  • 最新文章
    • SQL Server存储过程基本语法的简单示例
    • sql查询时增加自动编号和分页的简单示例
    • sql轻松应付百万数据的高效数据分页存储过程的简单示例
    • sql获取一条数据中所有字段的名称和值的实现方法
    • sql分割函数的简单示例
    • SQL Server异常捕获的简单示例
    • SQL SERVER回滚恢复误操作数据的实现方法
    • SQL Server函数或存储过程中抛出异常的实现方法
    • SQL Server创建数据库的完整代码
    • SQL Server创建数据库的命令用法示例

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。