【缘由】

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

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

首先我有两张表,一张为学生表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. FPGA程序编译后逻辑单元数为0

    问题 FPGA代码写完后编译不报错,但是显示使用的逻辑单元数(Total logic elements)为0.当然程序也不工作. 我用的是Intel Altera FPGA,verilog语言,在Qu ...

  2. (CSDN迁移)js中的判空

    <c:if test="${something.something == NaN}">style="display: none;"</c:if ...

  3. jenkins回滚之groovy动态获取版本号

    grovvy调试: 部署路径确定下来, 每个服务写死,传参 服务名 + 环境 给版本服务返回版本信息: groovy取分支: def gettags = ("git ls-remote -h ...

  4. VS+OpenGl 显示三维STL模型 代码

    今天调出了用VS环境结合OpenGL glut工具包进行显示STL模型的模块,进行了渲染.效果: 如下,后期会进行进一步优化,先贴上: #ifndef DATA_H #define DATA_H st ...

  5. 11 Reponse对象+ServletContext对象

    1.HTTP协议: (1)请求消息:客户端发送给服务器端的数据 数据格式: 1. 请求行 2. 请求头 3. 请求空行 4. 请求体 (2)响应消息:服务器端发送给客户端的数据 * 数据格式: 1. ...

  6. Java开发笔记(一百零七)URL地址的组成格式

    URL的全称是Uniform Resource Locator,意思是统一资源定位符,俗称网络地址或网址.网络上的每个文件及接口,都有对应的URL网址,它规定了其他设备如何通过一系列的路径找到自己,犹 ...

  7. C 风格字符串、string 类要点总结

    1. C风格字符串 1.1 其它 头文件<cstring> 特殊性质:C风格字符串以空字符\0结尾 1.2 读取一行的区别 1.2.1 cin.getline(array1,n,char) ...

  8. Pandas的基础操作(一)——矩阵表的创建及其属性

    Pandas的基础操作(一)——矩阵表的创建及其属性 (注:记得在文件开头导入import numpy as np以及import pandas as pd) import pandas as pd ...

  9. docker(一): 安装

    开始 docker是一个可以帮助开发者使用容器(containers)开发.部署和运行应用程序的平台.llinux下使用容器部署系统称为containerization. container 是映像( ...

  10. Goroutines和线程对比

    目录 栈不同 调度不同 GOMAXPROCS Goroutine没有ID号 栈不同 线程:每一个OS线程都有一个固定大小的内存块(一般会是2MB)来做栈,这个栈会用来存储当前正在被调用或挂起(指在调用 ...