- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈SQL Server交叉联接 内部联接由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
本节开始我们进入联接学习,关于连接这一块涉及的内容比较多,我们一步一步循序渐进学习,简短内容,深入的理解.
交叉联接(CROSS JOIN) 。
交叉连接是最简单的联接类型。交叉联接仅执行一个逻辑查询处理阶段-笛卡尔乘积。例如对两个输入表进行操作,联接并生成两个表的笛卡尔乘积,也就是说,将一个表的每一行与另一个表的所有行进行匹配。所以,如果一个表有m行,另一个表有n行,得到的结果中则会有m*n行。我们就拿SQL Server 2012教程中的例子说下 。
1
2
3
4
|
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)行数据,简略数据如下.
交叉联接我们可以用如下图表示 。
交叉联接最大的用途在于生成数字表以便我们用于其他目的,我们一起来看看.
1
2
3
4
5
6
|
IF OBJECT_ID(
'dbo.Digits'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
dbo.Digits;
CREATE
TABLE
dbo.Digits
(
digit
INT
NOT
NULL
);
|
插入10条基础数据 。
1
2
3
4
5
|
USE TSQL2012
GO
INSERT
INTO
dbo.Digits
( digit )
VALUES
( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 )
|
创建数字表 。
1
2
3
4
5
6
|
USE TSQL2012
GO
CREATE
TABLE
Nums
(
n
INT
NOT
NULL
PRIMARY
KEY
);
|
利用交叉联接在数字表中插入100万条数据 。
1
2
3
4
5
6
7
8
9
10
11
|
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) 。
内部联接用法如下 。
1
2
3
|
SELECT
*
FROM
table1
AS
t1
INNER
JOIN
table2
AS
t2
ON
t1.Id = t2.Id
|
内部联接返回表中更多数据 。
我们首先给出如下三个测试表 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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)等值条件查询 。
1
2
3
4
|
SELECT
f.Col1 fCol1
FROM
FirstTable f
INNER
JOIN
SecondTable s
ON
s.Col1 = f.col1
GO
|
(2)非等值条件查询 。
1
2
3
4
5
6
|
USE TSQL2012
GO
SELECT
f.Col1 fCol1
FROM
FirstTable f
INNER
JOIN
SecondTable s
ON
s.Col1 <> f.col1
GO
|
上述我们同样可以利用交叉连接实现同样效果 。
1
2
3
4
5
6
7
|
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呢?
1
2
3
4
5
6
|
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写法 。
1
2
3
4
5
|
USE TSQL2012
GO
SELECT
*
FROM
Sales.Orders
AS
SO
INNER
JOIN
Sales.OrderDetails
AS
SOD
ON
SOD.orderid = SO.orderid
|
ANSI SQL-89写法 。
1
2
3
4
5
|
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写法的问题 。
1
2
3
4
5
|
USE TSQL2012
GO
SELECT
COUNT
(*)
AS
'利用等值条件查询总数据行'
FROM
Sales.Orders
AS
SO, Sales.OrderDetails
AS
SOD
WHERE
SOD.orderid = SO.orderid
|
上面是我们利用正确的写法得到的正确的总数据行为2155条,下面我们看看有问题的写法 。
1
2
|
SELECT
COUNT
(*)
AS
'利用等值条件查询总数据行'
FROM
Sales.Orders
AS
SO, Sales.OrderDetails
AS
SOD
|
此时我们没有给出WHERE条件,而解析未出现错误,当然返回的结果集也就是错误的。当我们利用ANSI SQL-92写法时,我们同样也未给出比较条件,如下 。
1
2
3
4
5
|
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.cnblogs.com/CreateMyself/p/6142275.html 。
最后此篇关于浅谈SQL Server交叉联接 内部联接的文章就讲到这里了,如果你想了解更多关于浅谈SQL Server交叉联接 内部联接的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
服务架构进化论 原始分布式时代 一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然,早在单体系
序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的
内容,是网站的核心所在。要打造一个受用户和搜索引擎关注的网站,就必须从网站本身的内容抓起。在时下这个网络信息高速发展的时代,许多低质量的信息也在不断地充斥着整个网络,而搜索引擎对一些高质量的内容
从第一台计算机问世到现在计算机硬件技术已经有了很大的发展。不管是现在个人使用的PC还是公司使用的服务器。双核,四核,八核的CPU已经非常常见。这样我们可以将我们程序分摊到多个计算机CPU中去计算,在
基本概念: 浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实
.NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利。它将CryptoAPI改编进.NET的System.Security.Cryptography名字空间,使密码服务摆脱
文件与文件流的区别(自己的话): 在软件开发过程中,我们常常把文件的 “读写操作” ,与 “创造、移动、复制、删除操作” 区分开来
1. 前言 单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题。具体是否应该落地单元测试,以及落地的程度, 每个项目都有自己的情况。 本篇为
事件处理 1、事件源:任何一个HTML元素(节点),body、div、button 2、事件:你的操作 &
1、什么是反射? 反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 Oracle 官方对
1、源码展示 ? 1
Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。
可能大家谈到反射面部肌肉都开始抽搐了吧!因为在托管语言里面,最臭名昭著的就是反射!它的性能实在是太低了,甚至在很多时候让我们无法忍受。不过不用那么纠结了,老陈今天就来分享一下如何来优化反射!&nbs
1. 前言 最近一段时间一直在研究windows 驱动开发,简单聊聊。 对比 linux,windows 驱动无论是市面上的书籍,视频还是社区,博文以及号主,写的人很少,导
问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译 ========================================================
不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境
以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白,不知道这三者之间到底有什么区别?哎,惭愧,基础太差啊,木
目录 @RequestParam(required = true)的误区 先说结论 参数总结 @RequestParam(r
目录 FTP、FTPS 与 SFTP 简介 FTP FTPS SFTP FTP 软件的主动模式和被动模式的区别
1、Visitor Pattern 访问者模式是一种行为模式,允许任意的分离的访问者能够在管理者控制下访问所管理的元素。访问者不能改变对象的定义(但这并不是强制性的,你可以约定为允许改变)。对管
我是一名优秀的程序员,十分优秀!