资讯详情

SQL视图和多表连接

本博客关注的焦点是视图的使用以及视图与多表连接的协调。为了理解视图,更好地使用视图。

首先,我们应该解释视图的定义:视图是基于SQL语句结果集的可视化虚拟表,换句话说,视图是SQL查询结果的可视化呈现是多表数据关系的虚拟表。为了更容易理解以下内容,我们还需要查看视图的建立过程。如图所示,在机房收费系统中《User_sys》和《CheckInfo_sys》建立的一个视图的关系。(不讨论视图是否具有实用价值)

f0a065aa37ca7daf12893e9112ca9277.png

此视图所建立的代码如下:

SELECT dbo.CheckInfo_sys.UserName, dbo.CheckInfo_sys.Income, dbo.CheckInfo_sys.Expend, dbo.CheckInfo_sys.HandIn, dbo.User_sys.RealName

FROM dbo.CheckInfo_sys INNER JOIN

dbo.User_sys ON dbo.CheckInfo_sys.UserName = dbo.User_sys.UserName

所以我们需要注意的是代码中的代码From后部。这里的Inner join这就是我们所说的连接,所以On然后是视图的筛选条件。如果没有,需要说明ON以下条件不能连接。以该视图为例:即选取两个表中用户名相等的数据。然后问题就出来了,在这里User_sys表中的用户名是唯一的,但是CheckInfo可能有多个记录。这种一对多的关系导致用户表中的数据重复。如果此时需要统计结账老师的数量,就会重复!在这里,我们可以配合不同的连接方法来解决问题。以下数据位说明四种连接(不止四种):

内连接(关键字Innerjoin)

又称自然连接,自动删除不满意dbo.CheckInfo_sys.UserName =dbo.User_sys.UserName所有条件的行。也就是说,删除两个表中不匹配的行。结果如下:删除用户表未结账的用户5、老三、老四:

左连接(关键字Left Join)

保留左连接User_sys所有的数据行(关键字左侧的表)并使用null值来填充CheckInfo表中没有匹配的记录。结果如下:

右连接(关键字Right Join)

保留右连接CheckInfo_sys使用表的所有数据null值填充User_sys没有记录值。这里就不举例了!

交叉连接(关键字Cross Join)

交叉连接实际上是一个笛卡尔集,即两个集合中的合格记录匹配一次,成为一个新记录。相当于二维数组!你可以自己想想,这里就不举例了。

以上方式创建的视图是不同表列的纵向拼接,也可以横向拼接。这是数据表纵横划分的逆过程。这样创建视图,首先表结构必须一致,其次不是On表达条件。因此,以可视化的方式建立并不十分方便。横向拼接有两种方式:Not in、Union和Intersect。这里只做简单介绍,Not in去两个结果集的差集。Union它是两个集合的并集,可以自动删除重复记录,也可以使用Union All保留所有记录行。Intersect是两集的交集,即同时存在于两集的记录。

一般情况下,试图建立基于连接的关系,即纵向拼接。能处理一对多、一对一的关系。对于多对多的关系,在建立视图时需要做一些处理(不)。有时,你也可以通过横向拼接来建立视图。当然,这种情况很少见(就我目前而言),我也认为这种方法不是很合理。然而,索引表的大系统有时可能有效。估计我自己也遇到过横向拼接。这个博客写得不太清楚。如果你不明白我的意思,你希望直接交流!

读程序员SQL金典》[3]--表连接,子查询

一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...

SQL Server三种表连接原理

在SQL Server在数据库中,查询优化器通常采用三种连接方式: 嵌套循环连接(Nested Loop Join) 合并连接 (Merge Join) Hash连接 (Hash ...

SQL Server驱动顺序对中多表连接性能的影响

本文出处:http://www.cnblogs.com/wy123/p/7106861.html(保留来源不是原创作品的权利,我的拙作远远达不到,只是为了链接原文,因为后续可能会出现一些错误 ...

SQl Server 多表连接数据库

[缘由] 为了防止数据冗余,我们将拆分数据库中的表,从而产生多个表,表通过主外键关联,但这使得我们很难找到和修改。如何在多个表之间找到它们? 同时设计两个或两个查询 ...

sql server 实现多表连接查询

多表查询应在项目中实现,外部连接应实现. a表 a(aid,aname) 其中aid为pk b表 b(aid,bname,aid) 其中 bid为pk,aid为fk c表 c(cid,cname,aid) ...

SQL Server 2012 - 多表连接查询

-- 交叉连接产生笛卡尔值 (X*Y) SELECT * FROM Student cross Join dbo.ClassInfo --另一种写法 SELECT * FROM Student , ...

MySQL多表连接

主要分为内连接、外连接、交叉连接三类 其 他:联合连接,自然连接 1.内联接 典型的连接操作使用图像 = 或 <> 比较操作等).包括相等连接和自然连接. 内联使用比 ...

Mysql表连接查询

标签: 连接器挂钩

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台