【缘由】

为了防止数据的冗余,我们会将数据库中表进行拆分,这样就产生了多张表,表与表之间通过主外键关联,但这样又造成了我们查找和修改的困难,如何进行多表之间的查找呢?

我们将一个查询同时设计两个或两个以上的表,称之为连接查询。连接查询是关系数据库中最主要的查询,主要包括内连接、左外连接、右外连接、全外连接等。接下来我们分别来论述每一种连接方式。

首先我有两张表,一张为学生表T_Student,一张为选课信息表T_ChooseCorse表,这两张表中的字段分别如下表:

(为了方便说明问题,表中字段比较少)

【内连接】

使用内连接时,如果两个表的相关字段满足连接条件,则将信息从两个表中提取数据并组合成新的记录。

语句:

SELECT * FROM  T_Student

INNER JOIN T_ChooseCourse

ON  T_Student.Sno = T_ChooseCourse.Sno

Where T_Student.Dept = '计算机系'

INNER JOIN 将两张表连接起来,ON是连接两个表的条件,只有当学生表的学号和课程选择表的学号相等时将两张表连接起来组合成新的记录,Where后连接查询的条件,该示例查询条件为专业是'计算机系'。 当需要连接多张表时,只需要在ON后面再连接新的表和连接条件就可以,这里不再举例。

【自连接】

自连接:是一种特殊的内连接,它是指相互连接的表在物理上是一张表,但在逻辑上将其看成是两张表。用通俗的话来讲就是:在数据库中是一张表比如T_Student,但是我们在使用时可以将其认为是两张表。

下面举一个例子:要查询与李晨在同一个系学习的学生的姓名

语句:

SELECT  S2.Sname FROM T_Student
S1 JOIN T_Student
S2

ON S1.Dept = S2.Dept

Where S1.SName = '李晨'

AND S2.Name != '李晨'

解释:自连接使用的是同一个表,必须有别名,此例中别名分别为S1、S2,这个语句首先从表中找到李晨在哪个系,然后找到此系的其他学生(李晨除外)。

【外链接】

1、左外链接

语句:

SELECT  S.SNo,SName,Cno,Grade

FROM  T_Student S
LEFT OUTER JOIN T_ChooseCourse

ON S.SNo = T_ChooseCourse.SNo

解释:LEFT OUTER JOIN 只指定了左表的所有行,左表的某行在右表中可以有匹配的行,也可以没有匹配的行,如果没有匹配的行,则在相关联的结果集行中右表的所有选择列均为空值。

2、右外连接

右外连接时左外连接的反向连接,将右表中所有行返回。左表中可以有匹配的行,也可以没有。如果左表没有匹配的行,则将返回空值。

3、全外连接

当需要保留两个表中都不满足连接条件的的数据行,则可使用完全外连接。用FULL [OUTER] JOIN,该结果将包含两个表中的所有行,不论另一个表中是否有匹配的值,只要没有匹配的行,就用空值来填充。

【总结】

通过对数据库多表直接操作的总结,对数据库表操作有了更深一步的了解,在原来的基础之上的一个更深层次的学习,联系之前自考学习数据库的知识,方便现在的理解。总结一句话:数据库多表查询,关键在于掌握表之间连接的条件,这样不管是几个表,我们都没有问题。

SQl Server 数据库多表连接的更多相关文章

  1. SQL Server三种表连接原理

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

  2. MS Sql Server 数据库或表修复(DBCC CHECKDB)

    MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令.  1. DBCC CHECKDB  重启服务器后,在没有进行任何操作的情况下,在SQL ...

  3. SQL server 数据库用户表名称

    转自(http://blog.163.com/jlj_sk/blog/static/22579293200861422833924/) 取得SQL server 数据库中 所有用户表名称 select ...

  4. SQL Server数据库、表、数据类型基本概念

    一.SQL Server的数据存储结构 SQL Server是一个数据库管理系统,需要以有效方式存储高容量数据.要更好地理解SQL Server处理数据的方式,就需要了解数据的存储结构. 1.文件类型 ...

  5. SQL Server数据库(表的创建)

    表的创建 1.创建列(字段):列名+类型 2.设置主键列:能够唯一表示一条数据 3.设置唯一键:设计--索引/键--添加--唯一键(选择列)--确定 唯一键的内容不能重复 4.外键关系:一张表(从表) ...

  6. SQL SERVER数据库的表中修改字段的数据类型后,不能保存

      在数据库里面建了一个表,可是由于对SQL SERVER的建表功能不熟悉,不知道把主键设成什么是好,就先设置了个TEXT类型,可是后来朋友们告诉我说,TEXT类型容易让数据文件变得很大,还 是改成一 ...

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

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

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

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

  9. MS Sql Server 数据库或表修复(Log日志文件损坏的修复方法)

    ----------------- [1] use master go sp_configure reconfigure with override go ----------------- [2] ...

随机推荐

  1. 【视频开发】【CUDA开发】ffmpeg Nvidia硬件加速总结

    原文链接:https://developer.nvidia.com/ffmpeg GPU-accelerated video processing integrated into the most p ...

  2. docker笔记2--镜像容器基本使用

    1 docker的安装 系统:centos7 (1)配置好yum (2)yum -y install docker (3)查看状态 systemctl status docker 2 docker镜像 ...

  3. (生鲜项目)01. Vue环境搭建

    第一步: nodejs安装 https://nodejs.org/en/download/ 说明安装成功 第二步: cnpm 由于npm需要很多的依赖包,这些包下载都很慢,所以就有了cnpm : ht ...

  4. AWD攻防赛之各类漏洞FIX方案

    笔者<Qftm>原文发布<FreeBuf>:https://www.freebuf.com/articles/web/208778.html

  5. 【LeetCode】三数之和【排序,固定一个数,然后双指针寻找另外两个数】

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  6. Response知识点小结

    HTTP协议: 1. 响应消息:服务器端发送给客户端的数据 * 数据格式: 1. 响应行 1. 组成:协议/版本 响应状态码 状态码描述 2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状 ...

  7. laravel迁移文件中字段方法对应的数据库类型

    /* *Blueprint类中的方法方法 <-> 数据库数据类型 * */ // 数字 increments();// int(10) unsigned primarykey auto_i ...

  8. 字符串类型日期时间转换为Date类型解析转换异常java.text.ParseException: Unparseable date: “2019-09-27T18:31:31+08:00”

    错误的写法: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //这里的格式也可以是别 ...

  9. response letter

    1.Firstly, we would like to thank you for your kind letter and for reviewers’ constructive commentsc ...

  10. 一行代码让3D翻转后的文本恢复清晰

    FlashPlayer10提供的3D功能有一个相当蛋疼的问题:只要设置过rotationX.rotationY或者rotationZ属性,显示对象里面的文字(尤其是设备字体,位图文本)就会一直处于模糊 ...