【缘由】

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

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

首先我有两张表,一张为学生表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. consul多数据中心搭建 【h】

    自建IDC后面简称own.阿里云机房ali.腾讯云机房txown机房:内网10.10.10.0/24,边界节点,10.10.10.100/101.xxx.80.xxxali机房:内网10.10.10. ...

  2. 【视频开发】【Live555】摄像头采集,264编码,live555直播(0)

    参看 有关live555 1.首先需要修改live555,定义从 内存中直接获取source而不是从文件读取source的类. 自己实现的类命名为 H264FramedLiveSource   /* ...

  3. 【视频开发】Nvidia硬解码总结

    Nvidia硬解码总结 1.前言 本文的主要目的是对近期进行的nvidia硬件解码工作的记录和总结.至于为什么研究nvidia硬件解码的具体内容,其实主要是为了在项目中能够利用nvidia的硬件解码和 ...

  4. 重新安装Eclipse的一些配置

    工欲善其事,必先利其器.工具做好调整可以让我们事半功倍. 以下设置均在window-->preferences中 1.首先修改工作空间字符集为UTF-8 2.修改字体大小 3.修改Java代码提 ...

  5. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  6. Makefile 介绍

    makefile:是告诉编译器(交叉工具链)如何去编译.链接一个工程的规则.   一.概述 什 么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为 ...

  7. Sql CLR创建一个简单的表值函数

    1.创建面目: 2. 添加函数代码: using System; using System.Data.Sql; using Microsoft.SqlServer.Server; using Syst ...

  8. 系统开启UAC情形下开机自启动程序如何以管理员权限启动

    系统开启UAC情形下开机自启动程序如何以管理员权限启动 题记:本文阐述的是在Windows系统开启UAC的情况下,开机自启动程序需要以管理员权限启动, 系统弹出UAC对话框,用户同意的情形下启动程序 ...

  9. java ArithUtil 数据计算精度工具

    ArithUtil: /** * 如果需要精确计算,非要用String来够造BigDecimal不可 */ package com.leaniot.securitymonitor.util; impo ...

  10. WPF 程序如何移动焦点到其他控件

    原文:WPF 程序如何移动焦点到其他控件 WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点.本文介绍如何在 ...