1   概述

1.1  已发布【SqlServer系列】文章

  • 【SqlServer系列】SQLSERVER安装教程
  • 【SqlServer系列】数据库三大范式
  • 【SqlServer系列】表单查询
  • 【SqlServer系列】表连接
  • 【SqlServer系列】子查询
  • 【SqlServer系列】开启Sqlserver远程访问
  • 【SqlServer系列】集合运算

1.2  本篇文章内容概要

1.3  本篇文章内容概括

在SQL语句中,关于表连接,若按照表的数量来划分,可以划分为单表连接、两表连接和两表以上连接,在本篇文章中,主要讲解两表连接,其他多表连接原理一样。

关于表连接有很多种类,本文主要讲解交叉连接,内连接,外连接(左外部连接,右外部连接,全连接),自连接。

1.4  本章测试样表和Sql

业务场景:有两张表,分为为顾客表Customers和顾客订单表Orders,SQL语句分别如下:

创建Customes并初始化

 1 --CREATE TABLE Customers
 2 CREATE TABLE Customers
 3 (
 4    CustID VARCHAR(50) NOT NULL,  --顾客ID
 5    CustName  VARCHAR(50),--顾客姓名
 6    CustCompany VARCHAR(50) --顾客公司
 7 )
 8
 9 --Initial Customers
10
11 INSERT INTO Customers VALUES('SXN-DD-01','赵武','A')
12 INSERT INTO Customers VALUES('SXN-DD-02','刘杨','B')
13 INSERT INTO Customers VALUES('SXN-DD-03','张永为','C')
14 INSERT INTO Customers VALUES('SXN-DD-04','李龙飞','D')
15 INSERT INTO Customers VALUES('SXN-FF-01','邓华','E')
16 INSERT INTO Customers VALUES('SXN-HH-01','张涛明','F')

查询结果为:

创建Order表并初始化

 1 CREATE TABLE Orders
 2 (
 3   CustID VARCHAR(50) NOT NULL,  --顾客ID
 4   OrdetID VARCHAR(50)  --订单ID
 5 )
 6
 7 --Initial Orders
 8
 9 INSERT INTO Orders VALUES('SXN-DD-01','SCCCCFFFFFSSOX002')
10 INSERT INTO Orders VALUES('SXN-DD-02','SCCCCFFFFFSSOX0X2')
11 INSERT INTO Orders VALUES('SXN-DD-03','')
12 INSERT INTO Orders VALUES('SXN-DD-04','')
13 INSERT INTO Orders VALUES('SXN-DD-05','SCCCCFFFFFSSOX0H2')
14 INSERT INTO Orders VALUES('SXN-DD-06','')

查询结果为:

2   问题引入

Q1:写一个查询,生成从1到1000的整数序列。

3   交叉连接

3.1   SQL示例及示例结果

1 SELECT  C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
2 FROM Customers AS C
3 CROSS JOIN Orders AS O

结果:

3.2   示例结果分析

交叉连接使用关键字CROSS JOIN进行查询,查询的结果为笛卡儿积,从如上结果可以看出,查询出的结果共有36行数据,因为Customers表和Orders表分别有6条记录,6X6=36;

3.3  小结

a.在逻辑上,交叉连接是一种最简单的联接;
b.交叉连接只实现一个逻辑处理步骤———笛卡儿积;
c.操作:对输入的两个表进行操作,把它们连接起来,生成两者的笛卡儿积,即将一个输入表的每行与另一个表的所以行进行匹配,如果一个表有m行,而另一个表有n行,将得到m x n行的接果集;
d.结构:SELECT  tb1.tb1ConumName,tb2.tb2ConumNameFROM table1 AS tb1 CROSS JOIN table2 AS tb2
e.交叉连接使用的关键字:CROSS JOIN ;
f.交叉连接生成的接果集是一个虚拟表,虚拟表中的各列直接源于参与连接的两个表;

4   内连接

4.1   SQL示例及示例结果

1 SELECT  C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
2 FROM Customers AS C
3 INNER JOIN Orders AS O
4 ON C.CustID=O.CustID

结果:

4.2   示例结果分析

内连接在交叉连接的基础上外加过滤条件ON,如上例子中用Customers.CustID=Orders.CustID作为过滤条件,结果显而易见。

4.3  小结

内联接规则为笛卡尔积+用户谓词过滤:它首先像交叉连接一样,对两个输入表进行笛卡尔积运算,然后根据用户指定的谓词对结果进行过滤;

5   外连接

5.1   SQL示例及示例结果(只分析左外部连接,因为右连接和全连接原理也是一样的)

1 SELECT  C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
2 FROM Customers AS C
3 LEFT OUTER JOIN Orders AS O
4 ON C.CustID=O.CustID

结果:

5.2   示例结果分析

如上以Cutomers表作为左保留表,连接右表Orders列CustID缺少SXN-FF-01和SXN-HH-01,为了以左保留表为基准,用NULL占位符来填充。

5.3  小结

a.外连接:笛卡儿积+ON过滤+外部行;
b.在外连接中,要把一个表标记为“保留的”表,可以在表名之间使用关键字LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN,其中OUTER关键字是可选的。LEFT关键字表示左边表的行是保留的,RIGHT关键字表示右边表的行是保留的,而FULL关键字则表示左右两边表的行都是保留的;
c.外连接的第三个逻辑查询处理步骤就是要识别保留表中按照ON条件在另一个表找不到与之匹配的那些行,再把这些行添加到连接的前两个步骤生成的结果中。对于来自连接的非保留表的那些列,追加的外不行中的这些列则用NULL作为占位符;
d.从外连接保留表的角度来看,可以认为外连接结果中的数据行包括两种内部行和外部行。内部行是指按照ON子句中的条件能在连接的另一边找到匹配的那些行;而外部行则是指找不到匹配的那些行。内连接只返回内部行,外连接同时返回内部行和外部行;
e.使用外连接时,到底是在查询的ON子句中,还是在WHERE子句中指定连结条件?从外连接保留表中的行来考虑该问题,ON子句中的过滤条件不是最终的,换句话说,ON子句中的条件并不能最终决定保留表中的部分行是否会在结果中出现,而只是判断是否能够匹配另一边表中的某些行。所以,当需要表达一个非最终的条件时(即这个条件只决定哪些行可以匹配非保留表),就在ON子句中指定连接条件,当在生成外部行以后,要运用过滤器,而且希望过滤条件是最终的,就应该在WHERE子句中指定条件;

6   自连接

6.1   SQL示例及示例结果

1 SELECT  C1.CustID AS C1CustID,C1.CustName AS C1CustName,C1.CustCompany AS C1CustCompany,C2.CustID,C2.CustName,C2.CustCompany
2 FROM Customers AS C1
3 JOIN Customers AS C2
4 ON C1.CustID=C2.CustID

结果:

6.2   示例结果分析

如上例子为自连接在内连接中的运用,在其他连接中的运用就不举例子了,比较简单。

6.3  小结

a.自连接为单个表取不同的别名,通过别名来连接;
b.自连接可以用于其它连接;
b.自连接可以看作交叉连接、内连接、外连接等连接的一个特例;

7   问题答案

Q1:KEY

CREATE TABLE Digits
( digit int not null primary key
)
--Initial testing data for Digits
INSERT INTO Digits VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)--QuerySELECT D3.digit*100+D2.digit*10+D1.digit+1 AS n
FROM Digits AS D1
CROSS JOIN Digits AS D2
CROSS JOIN Digits AS D3
ORDER BY n

8   参考文献

【01】Microsoft  SqlServer 2008技术内幕:T-SQL 语言基础

【02】Microsoft  SqlServer 2008技术内幕:T-SQL 查询

9   版权

  • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
  • 可以转载该博客,但必须著名博客来源。

转载于:https://www.cnblogs.com/wangjiming/p/7153533.html

【SqlServer系列】表连接相关推荐

  1. SQL数据库语言基础之SqlServer多表连接查询与INNER JOIN内连接查询

    文章目录 一.简单连接查询 二.多表连接查询 三.INNER JOIN 内连接查询 一.简单连接查询 1.直接连接:无连接规则连接两表,得到的是两个表的笛卡尔积. 连接后的行数=表1行数*表2行数 连 ...

  2. SQLServer学习笔记八:多表连接查询

    学习目标 掌握多表连接查询的概念 学会使用内连接查询数据 学会使用外连接查询数据 学会使用UNION合并查询结果 前面学习的内容都是基于单个数据库表的查询,下面将学习涉及多个表的数据查询. 多表连接查 ...

  3. 【SqlServer系列】子查询

    1.1  已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlServer ...

  4. 一个sqlserver数据库表查看与备份软件

    一个sqlserver数据库表查看与备份软件 先连接:点击获取,列出全部数据库名:点击某个数据库名,列出全部表名:点击表名,获取内容:如果表的行数过多,万以上,获取时间会长: 点击 导出为excel ...

  5. Tableau实战系列数据连接及数据准备

    前言 Tableau实战系列数据连接及数据准备 使用多个表存储数据提取数据 你可以将数据提取配置为将其数据存储在多个表中.将数据提取数据存储在多个表中可以 潜在地改善性能,并帮助缩小文件大小. 新的受 ...

  6. Navicat中怎样将SQLServer的表复制到MySql中

    场景 在SqlServer中有一个表,与要在MySql中要实现的表的结构类似, 怎样将SqlServer的表复制到MySql中. Navicat下载和破解以及使用: https://blog.csdn ...

  7. django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

    2019独角兽企业重金招聘Python工程师标准>>> 1.多表连接查询:当我知道这点的时候顿时觉得django太NX了.   class A(models.Model):      ...

  8. HiveQL学习笔记(三):Hive表连接

    本系列是本人对Hive的学习进行一个整理,主要包括以下内容: 1.HiveQL学习笔记(一):Hive安装及Hadoop,Hive原理简介 2.HiveQL学习笔记(二):Hive基础语法与常用函数 ...

  9. oracle表连接查询逗号隔开_Oracle多表连接查询

    连接:将一张表中的行按照某种条件和另一张表中的行连接起来形成一个新行的的过程. 根据连接查询返回的结果,分为3类: 内连接(inner join) 外连接(outer join) 交叉连接(cross ...

最新文章

  1. cmd怎么实现Java你好_java环境配置以及如何在cmd窗口运行java代码
  2. [转] context-param与init-param的区别与作用
  3. find -exec 与xargs 区别
  4. 获 3.8 亿用户青睐,中国电信翼支付如何数据化运营?
  5. spring boot一个模块加载不到引用另一个模块的mapper.xml报错org.apache.ibatis.binding.BindingException: Invalid bound sta
  6. 056、macvlan网络结构分析(2019-03-25 周一)
  7. 【数据结构与算法】之深入解析十大常用排序算法的原理分析和算法实现
  8. python观察日志(part16)--收集关键词参数
  9. 程序员想知道代码是怎样跑起来的
  10. tigervnc远程控制linux,CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面(示例代码)
  11. oracle erp 用户手册,oracleerp用户手册-mrp
  12. 2016年考研数学一解析 ​​​
  13. Windows Server 2012 网络发现选项无法启动 启动不生效(无法保存)
  14. 利用最小二乘法进行参数估计
  15. 百度B端战事渐入佳境
  16. Android Google地图接入(一)
  17. 如何开发一款前端工具
  18. Hello MySQL(十三)——事务和锁
  19. Spring Cloud Gateway 3.1.3最新版中文手册官网2022
  20. yolov5-6.1的完全使用手册,含模型训练测试(可训练自己的数据集)

热门文章

  1. [小说连载]张小庆,在路上(8)- 要不要换工作
  2. 长沙市六中学生寒假社会实践活动在湖南智慧教育装备展示体验中心开展
  3. 基于OneNet平台设计的多节点温度采集系统-有人云4G模块+STM32
  4. enumeration value 'xxxxx' not handled in switch警告
  5. Spring Boot保姆级入门,还不会过来胖我
  6. Java JDBC和数据库连接池 韩顺平老师自学笔记
  7. 什么是docker –rm选项
  8. 家用移动光猫(型号:HS8545M5)利用公网ipv6对外提供公网服务。(100M的宽带,真香 )
  9. oracle访问控制策略查看,ORACLE 安全访问策略VPD与ORA-28132
  10. 芭蕉叶上无愁雨,自是多情听断肠