本篇博客关注的焦点是视图的使用以及视图和多表连接的配合。以便可以了解视图,以及更好的使用视图。

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

 

那么这个视图建立的代码如下:

 
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中的记录可能是多条。这样的一对多的关系的情况就导致了来源于用户表的数据出现重复,若这时要统计结账教师的人数将出现重复!那么这里我们就可以配合不同的连接方式来解决问题。那么以以下数据位说明四种连接(不止四种):

 

内连接(关键字Inner join)

也叫自然连接,它将自动删除不满足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视图和多表连接的更多相关文章

  1. 读《程序员的SQL金典》[3]--表连接、子查询

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

  2. SQL Server三种表连接原理

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

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

    本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  4. SQl Server 数据库多表连接

    [缘由] 为了防止数据的冗余,我们会将数据库中表进行拆分,这样就产生了多张表,表与表之间通过主外键关联,但这样又造成了我们查找和修改的困难,如何进行多表之间的查找呢? 我们将一个查询同时设计两个或两个 ...

  5. sql server 实现多表连接查询

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

  6. SQL Server 2012 - 多表连接查询

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

  7. MySQL多表连接

    主要分3种:内连接,外连接,交叉连接 其        他:联合连接,自然连接 1.内联接 典型的联接运算,使用像 =  或 <> 之类的比较运算).包括相等联接和自然联接. 内联接使用比 ...

  8. Mysql表连接查询

    原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...

  9. 【SQL】在SQL Server中多表关联查询问题

    好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...

随机推荐

  1. Android的BUG(四) - Android app的卡死问题

    做android,免不了要去运行一些跑分程序,常用的跑分程序有quadrant(象限),nbench,安兔兔等.作为系统工程师,对这些跑分 程序都非常的不屑,这个只能是一个不客观的参考,但客户都喜欢拿 ...

  2. 介绍 32 位和 64 位版本的 Microsoft Office 2010

    在使用 64 位版本的 Office 2010 运行现有解决方案时存在两个基本问题: Office 2010 中的本机 64 位进程无法加载 32 位二进制文件.在使用现有 Microsoft Act ...

  3. 转载python并行运算实例

    Python的并发处理能力臭名昭著.先撇开线程以及GIL方面的问题不说,我觉得多线程问题的根源不在技术上而在于理念.大部分关于Pyhon线程和多进程的资料虽然都很不错,但却过于细节.这些资料讲的都是虎 ...

  4. C--全排列的实现(递归方法) 傻子也能看懂的

      假设数组含有n个元素,则提取数组中的每一个元素做一次头元素,然后全排列除数组中除第一个元素之外的所有元素,这样就达到了对数组中所有元素进行全排列的得目的.[这句话才是重点!] 比如 1,2,3.的 ...

  5. android之wifi开发

    WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ...

  6. SQL之概念

    SQL即结构化查询语言,是一个功能强大的数据库语言,可以分为: 1.DML即数据操作语言,用于检索或者修改数据: 2.DDL即数据定义语言,用于定义数据的结构,如创建.修改.删除等: 3.DCL即数据 ...

  7. 【通信框架】Apache的开源通信框架thrift概述

    在阅读的过程中有不论什么问题.欢迎一起交流 邮箱:1494713801@qq.com    QQ:1494713801 一.作用 Thrift("Scalable Cross-Languag ...

  8. ActiveMQ消息队列介绍(转)

    ActiveMQ是一个开源兼容Java Message Service (JMS) 1.1面向消息的中件间. 来自Apache Software Foundation. ActiveMQ提供松耦合的应 ...

  9. spring+mybatis利用interceptor(plugin)兑现数据库读写分离

    使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是"地位相当"的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这 ...

  10. HDU 4424 Conquer a New Region 最大生成树

    给你一颗树 每条边有一个权值 选择一个点为中心 定义S值为中心到其它n-1个点的路径上的最小边权 求全部点S值的和 从大到小排序 每次合并2棵树 设为A集合 B集合 设A集合的最大S值的和为sumA ...