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 ...
随机推荐
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...
- javascript每日一练(七)——事件二:键盘事件
一.键盘事件 onkeydown触发, keyCode键盘编码 ctrlKey altKey shiftKey 键盘控制div移动 <!doctype html> <html> ...
- 一天一个类--ArrayList之一
今天开始打算将JDK7种的一些类的源码分析一下,笔者认为了解源码就是了解其实现过程,这是非常重要的,而不是简单的记住方法的使用,关键是了解其思想和目的这才是重要的.所以笔者决定首先将从一些容器下手.[ ...
- 关于C(m,n)%p的故事
序 遥远的\(\mod p\)(\(p\)是质数)大陆有一个恶魔:\[C(m,n)={m!\over n! (m-n)!}\] 于是大家有了各种求逆元的方法.这里MOD = p. 壹 for (int ...
- Python与开源GIS:在OGR中使用SQL语句进行查询
摘要: 属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题.但是也有这种时候,就是进行查询时的条件比较复杂.针对这种情况,OGR也提供了更加灵活的解决方案:支持使 ...
- php实现加好友功能
思路: 1用户发送好友申请之后 把申请储存到申请数据表中,状态为 未验证 2 当用户登录时,查询申请表中是否有uid和被申请人id相同的,如果同意,更改状态,并把数据插入到对应的好友数据表否则,删除申 ...
- 解决linux下javac -version和java -version版本显示不一致
解决linux下javac -version和java -version版本显示不一致 [javascript] view plaincopy [root@localhost usr]# $JAVA_ ...
- OPENSSL库的使用-DES篇
一.单DES算法ECB模式加解密 1.使用函数DES_set_key_unchecked设置密钥 2.使用函数DES_ecb_encrypt来进行数据加解密 void DES_ecb_encrypt( ...
- 基于visual Studio2013解决面试题之0907大数乘法
题目
- MYSQL获取自增主键【4种方法】
通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键.本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值: 通过JDBC2.0提 ...