【SqlServer系列】表连接
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并初始化
--CREATE TABLE Customers
CREATE TABLE Customers
(
CustID VARCHAR() NOT NULL, --顾客ID
CustName VARCHAR(),--顾客姓名
CustCompany VARCHAR() --顾客公司
) --Initial Customers INSERT INTO Customers VALUES('SXN-DD-01','赵武','A')
INSERT INTO Customers VALUES('SXN-DD-02','刘杨','B')
INSERT INTO Customers VALUES('SXN-DD-03','张永为','C')
INSERT INTO Customers VALUES('SXN-DD-04','李龙飞','D')
INSERT INTO Customers VALUES('SXN-FF-01','邓华','E')
INSERT INTO Customers VALUES('SXN-HH-01','张涛明','F')
查询结果为:
创建Order表并初始化
CREATE TABLE Orders
(
CustID VARCHAR() NOT NULL, --顾客ID
OrdetID VARCHAR() --订单ID
) --Initial Orders INSERT INTO Orders VALUES('SXN-DD-01','SCCCCFFFFFSSOX002')
INSERT INTO Orders VALUES('SXN-DD-02','SCCCCFFFFFSSOX0X2')
INSERT INTO Orders VALUES('SXN-DD-03','')
INSERT INTO Orders VALUES('SXN-DD-04','')
INSERT INTO Orders VALUES('SXN-DD-05','SCCCCFFFFFSSOX0H2')
INSERT INTO Orders VALUES('SXN-DD-06','')
查询结果为:
2 问题引入
Q1:写一个查询,生成从1到1000的整数序列。
3 交叉连接
3.1 SQL示例及示例结果
SELECT C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
FROM Customers AS C
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.tb2ConumName
FROM table1 AS tb1
CROSS JOIN table2 AS tb2
e.交叉连接使用的关键字:CROSS JOIN ;
f.交叉连接生成的接果集是一个虚拟表,虚拟表中的各列直接源于参与连接的两个表;
4 内连接
4.1 SQL示例及示例结果
SELECT C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
FROM Customers AS C
INNER JOIN Orders AS O
ON C.CustID=O.CustID
结果:
4.2 示例结果分析
内连接在交叉连接的基础上外加过滤条件ON,如上例子中用Customers.CustID=Orders.CustID作为过滤条件,结果显而易见。
4.3 小结
内联接规则为笛卡尔积+用户谓词过滤:它首先像交叉连接一样,对两个输入表进行笛卡尔积运算,然后根据用户指定的谓词对结果进行过滤;
5 外连接
5.1 SQL示例及示例结果(只分析左外部连接,因为右连接和全连接原理也是一样的)
SELECT C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
FROM Customers AS C
LEFT OUTER JOIN Orders AS O
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示例及示例结果
SELECT C1.CustID AS C1CustID,C1.CustName AS C1CustName,C1.CustCompany AS C1CustCompany,C2.CustID,C2.CustName,C2.CustCompany
FROM Customers AS C1
JOIN Customers AS C2
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(),(),(),(),(),(),(),(),(),() --Query SELECT D3.digit*+D2.digit*+D1.digit+ 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。
- 可以转载该博客,但必须著名博客来源。
【SqlServer系列】表连接的更多相关文章
- SqlServer 多表连接、聚合函数、模糊查询、分组查询应用总结(回归基础)
--exists 结合 if else 以及 where 条件来使用判断是否有数据满足条件 select * from Class where Name like '%[1-3]班' if (not ...
- SQLServer多表连接查询
双表内部连接查询 select wName,dName from DepartMent,Worker where DepartMent.dID=Worker.did select wName,dNam ...
- sqlserver多表连接更新
一.MS SQL Server 多表关联更新 sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据 ...
- 【SqlServer系列】表单查询
1 概述 如下几个问题,如果你能解决,请继续往下看,若不能解决,请先复习SQL基础知识,再来阅读本篇文章.本篇文章深度中等左右. Q1:表StudentScores如下,用一条SQL语句查询出每门 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所在的部门 ...
- 【SqlServer系列】子查询
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [Sq ...
- 【SqlServer系列】开启Sqlserver远程访问
1 概述 已发布[SqlServer系列]文章如下: [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlS ...
- 【SqlServer系列】集合运算
1 概述 已发布[SqlServer系列]文章如下: [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlS ...
随机推荐
- Lesser known dplyr tricks
In this blog post I share some lesser-known (at least I believe they are) tricks that use mainly fun ...
- The dplyr package has been updated with new data manipulation commands for filters, joins and set operations.(转)
dplyr 0.4.0 January 9, 2015 in Uncategorized I’m very pleased to announce that dplyr 0.4.0 is now av ...
- Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
Usually when I create slide decks these days I used markdown and slidy. However, I recently was ask ...
- springboot 自定义Repository
启用 JpaRepositories package cn.xiaojf; import cn.xiaojf.today.data.rdb.repository.RdbCommonRepository ...
- Java中设计模式之单例设计模式-1
单例作用 1 节省内存 2 可以避免多种状态导致状态冲突 单例的创建步骤 1 私有化构造方法 2 私有化声明的属性 3 getInstance 4 方法需要静态 单例分类 1.懒汉式 2.饿汉式 两种 ...
- js获取页面宽高
网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...
- RMAN备份与恢复(一)--认识RMAN
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup).修复(restore)和恢复(recover)于一体的工具.接下来了解一下RMAN中的几个重 ...
- Spring AOP拦截对Controller的请求时的配置失败
简单的说,就是父子容器的问题,将AOP的配置信息放在applicationContext.xml中,该配置文件被ContextLoaderListener加载,Spring会创建一个WebApplic ...
- maven项目转成web项目没有生成WebContent目录
有时候建立maven项目转成web项目没有生成WebContent目录,此时把Dynamic web module 去掉勾选,然后ok,再点开项目的properties,再选中Dynamic web ...
- js前端实现多图图片上传预览
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...