SQL视图和多表连接
本篇博客关注的焦点是视图的使用以及视图和多表连接的配合。以便可以了解视图,以及更好的使用视图。
首先,还是要说明一下视图的定义:视图是基于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视图和多表连接的更多相关文章
- 读《程序员的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多表连接
主要分3种:内连接,外连接,交叉连接 其 他:联合连接,自然连接 1.内联接 典型的联接运算,使用像 = 或 <> 之类的比较运算).包括相等联接和自然联接. 内联接使用比 ...
- Mysql表连接查询
原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...
- 【SQL】在SQL Server中多表关联查询问题
好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...
随机推荐
- Java -强引用&弱引用
⑴强引用(StrongReference) 就是通过new得的对象引用 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMe ...
- C语言拾遗--static
C程序一直由下列部分组成: 正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里. ...
- DockerCon 2016
DockerCon 2016 – 微软带来了什么? 根据Forrester的调查,接近半数的企业CIO在考虑IT架构的时候更乐于接受开源方案,这主要是基于低成本,避免供应商锁定和敏捷的需求:同时另 ...
- 转:onConfigurationChanged的作用
API原文说明:android:configChangesLists configuration changes that the activity will handle itself. When ...
- TCP/IP笔记 三.运输层(1)——UDP,TCP
1. 运输层 1.1 两种协议:TCP和UDP. (1)TCP:提供了一种可靠的数据传输服务,TCP是面向连接的,只有链接建立起来后才能通信. (2)UDP:是把数据直接发出去,而不管对方是不是在收信 ...
- ios网络学习------1get post异步请求
网络请求的步骤: get请求: #pragma mark - 这是私有方法,尽量不要再方法中直接使用属性,由于一般来说属性都是和界面关联的,我们能够通过參数的方式来使用属性 #pragma mark ...
- 全陷阱破解:在Linux环境下的Jenkins中持续集成Androidproject
本方案以 RHEL / Centos 64位Linux操作系统为例,由于这是眼下最常见的server环境. 一.安装Java SDK. 建议,不要使用诸如yum之类的玩意自己主动安装,由于openJD ...
- linux环境设置:使ftp不输密码
# cd ~; # vi .netrc; Add beloew words, 可以追加多个账户: machine yourservername login yourname password your ...
- last期末作业
功能:每人完成一个新闻发布系统,包括系统的前台访问和后台管理. 要求: 1.使用ASP.NET MVC4开发. 2.在完成基本功能后,可以利用本学期所学的知识进行扩展. 3.完成日期为2013年12月 ...
- delphi高手突破之异常及错误处理
什么是异常?为什么要用它? 所谓“异常”是指一个异常类的对象.Delphi的VCL中,所有异常类都派生于Exception类.该类声明了异常的一般行为.性质.最重要的是,它有一个Message属性可以 ...