SqlServer 表连接教程(问题解析)(SqlServer 表连接教程问题解析)
SqlServer 表连接教程(问题解析)
SqlServer 表连接教程问题解析1.2 本篇文章内容概要
1.3 本篇文章内容概括
在SQL语句中,关于表连接,若按照表的数量来划分,可以划分为单表连接、两表连接和两表以上连接,在本篇文章中,主要讲解两表连接,其他多表连接原理一样。
关于表连接有很多种类,本文主要讲解交叉连接,内连接,外连接(左外部连接,右外部连接,全连接),自连接。
1.4 本章测试样表和Sql
业务场景:有两张表,分为为顾客表Customers和顾客订单表Orders,SQL语句分别如下:
创建Customes并初始化
--CREATE TABLE Customers CREATE TABLE Customers ( CustID VARCHAR(50) NOT NULL, --顾客ID CustName VARCHAR(50),--顾客姓名 CustCompany VARCHAR(50) --顾客公司 ) --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(50) NOT NULL, --顾客ID OrdetID VARCHAR(50) --订单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(0),(1),(2),(3),(4),(5),(6),(7),(8),(9) --Query SELECT 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查询
总结
以上所述是小编给大家介绍的SqlServer 表连接教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
- sqlserver 数据量需要多少内存(SQL Server在AlwaysOn中使用内存表的“踩坑”记录)
- sqlserver 空间数据类型(SQL Server数据类型转换方法)
- sqlserver自增长id重置(SQL server 自增ID--序号自动增加的字段操作)
- sqlserver 查询数据库增长设置(SQL设置SQL Server最大连接数及查询语句)
- 数据库sqlserver定时任务(SQL Server 2005作业设置定时任务)
- sql server新建用户无法登录(sqlserver 因为选定的用户拥有对象,所以无法除去该用户的解决方法)
- sqlserver数据库文件包括(详解SQL Server数据库状态和文件状态)
- sqlserver2008远程连接设置(如何开启SqlServer 远程访问)
- sqlserver分组查询(sql server如何利用开窗函数over进行分组统计)
- sqlserver表空间占用率(SQL Server获取磁盘空间使用情况)
- sqlserver2012知识点(SQL Server 2012 安全概述)
- sqlserver备份还原地址(SqlServer高版本数据备份还原到低版本)
- SqlServer数据库中文乱码问题解决方法(SqlServer数据库中文乱码问题解决方法)
- sqlserver常用数据结构图(Sql Server数据库常用Transact-SQL脚本推荐)
- SQLServer日期函数总结案例详解(SQLServer日期函数总结案例详解)
- sqlserver2012登录出现报错18456(SQL Server 2012 sa用户登录错误18456的解决方法)
- 菲律宾旅游攻略(菲律宾旅游攻略地图)
- 清华大学难考吗(清华大学考研录取分数线)
- 观花盆栽佛肚竹盆景制作及养护(观花盆栽佛肚竹盆景制作及养护)
- 春天养佛肚竹,做好这几件事,叶绿根壮寓意好 越养越旺家(春天养佛肚竹做好这几件事)
- 律界衣品最好,时尚圈学识数高,41岁的Amal堪称现实版的傲骨贤妻(时尚圈学识数高)
- 刘智泰确认出演《Good Wife》 担纲男一号(刘智泰确认出演Good)
热门推荐
- 护卫神主机管理系统(护卫神主机大师如何开启和关闭主机管理系统?)
- dede如何联动筛选(dede 标签调用大全 dedecms 隔五行一个分割线等标签调用)
- docker端口访问不了(docker设置了端口映射,不能访问的解决方案)
- laravel admin文档(Laravel-添加后台模板AdminLte的实现方法)
- SQL Union和Union All的用法和区别
- mysql 索引表空间(MySQL如何构建数据表索引)
- python处理所有异常(Python异常处理知识点总结)
- css一键布局(css多种方式实现双飞翼布局)
- dedecms缩略图插件(织梦DEDECMS有缩略图显示,没有显示随机指定图片的实现方法)
- python渗透攻击(Python实现DDos攻击实例详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9