前言

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

交叉联接(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 ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( )

创建数字表

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

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

USE TSQL2012
GO INSERT INTO dbo.Nums(n)
SELECT D6.digit * + D5.digit * + D4.digit * + D3.digit * + D2.digit * + D1.digit + 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 (), (), (), (NULL)
GO
INSERT INTO SecondTable (Col1)
VALUES (), (), (), (NULL)
GO
INSERT INTO ThirdTable (Col1)
VALUES (), (), (), (), (), (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。

SQL Server-交叉联接、内部联接基础回顾(十二)的更多相关文章

  1. SQL Server 索引的图形界面操作 <第十二篇>

    一.索引的图形界面操作 SQL Server非常强大的就是图形界面操作.关于索引方面也一样那么强大,很多操作比如说重建索引啊,查看各种统计信息啊,都能够通过图形界面快速查看和操作,下面来看看SQL S ...

  2. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》

    一.课程笔记 1.1  软件开发周期 (1)需求分析阶段 分析客户的业务和数据处理需求. (2)概要设计阶段 设计数据库的E-R模型图,确认需求信息的正确和完整. /* E-R图:实体-关系图(Ent ...

  3. Javascript基础回顾 之(二) 作用域

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  4. 基于Sql Server 2008的分布式数据库的实践(二)

    原文 基于Sql Server 2008的分布式数据库的实践(二) 从Win7连接Win2003的Sql Server 2008 1.新建链接服务器链接到Win2003的Sql Server 2008 ...

  5. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

  6. Java 多线程基础(十二)生产者与消费者

    Java 多线程基础(十二)生产者与消费者 一.生产者与消费者模型 生产者与消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”.“消费者”.“仓库”和“产品”.他们之间的关系如下: ①.生 ...

  7. SQL Server-表表达式基础回顾(二十四)

    前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...

  8. SQLServer -- SQL Server Database Error: 内部 SQL Server 错误

    报表在SQLserver2008运行统计正常,但是在SQLserver2000运行报错,SQL直接执行报:内部 SQL Server 错误. 不断的排查,最终得到的结论是:SQLserver2000似 ...

  9. SQL Server(一)——数据库基础知识

    SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...

  10. SQL Server DML(SELECT)常见用法(二)

    1   引言 上篇讲到SQL Server中DML的基本使用方法,其中SELECT语句是最常用的语句,其功能强大,结构复杂,下面通过例子,具体介绍其使用方法. 2 SELECT查询语句 SELECT语 ...

随机推荐

  1. CoreCLR源码探索(一) Object是什么

    .Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...

  2. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

  3. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  4. ExtJS 4.2 业务开发(一)主页搭建

    本篇开始搭建一个ExtJS 4.2单页面应用, 这里先介绍主页的搭建,内容包括:主页结构说明.扩展功能等方面. 目录 1. 主页结构说明 2. 扩展功能 3. 在线演示 1. 主页结构说明 1.1 主 ...

  5. python程序生成平均脸

    简介 项目代码https://github.com/LiuRoy/pokerface 原文链接http://www.cnblogs.com/lrysjtu/p/5492547.html 写这个项目的本 ...

  6. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

  7. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

  8. 使用JavaScript为一张图片设置备选路径

    在做网页开发的时候,有时候希望给图片设置一个备选路径,即,当src属性对应的主路径加载失败的时候,图片可以马上切换到备选路径.这样,即使主路径失效了,显示备用路径也不会影响网页的正常体验. 注意到网页 ...

  9. listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局        android系统为listview提供了addfootview ...

  10. System进程(pid=4)占用80端口的解决方案

    问题 Mail服务器在安装TFS服务(含SQLServer2016)后启动不了网页服务. 排查问题 使用命令查看端口占用情况 netstat -nao | find ":80" n ...